⚠この記事はブログ移転前のアーカイブです
mask

ユーザー名を指定するだけでTwitterアカウントに設定されているアイコンを取得できる無料APIを公開しました.

ソースコードも公開しますのでいじって使ってもOKです.

【追記】2017/04/10現在:サーバー移行期のためhttps://icong.bmemo.pwは停止しています。ソースコードをご利用ください。

APIエンドポイント

https://icong.bmemo.pw/tw/

使用例

https://icong.bmemo.pw/tw/Quent_FL

<img src="https://icong.bmemo.pw/tw/Quent_FL" >

 

取得できるアイコンは1サイズのみとなっています.高画質版(生の画像)などが取得したい場合はソースコードを弄ってください

仕様

  • APIエンドポイント
  • HTTPS対応
  • キャッシュ
    • 既に取得済みのアイコンはキャッシュから配信されます
    • キャッシュ期限は10日で,10日を超えた場合は新しくアイコンを取得してキャッシュし直します
  • 制限
    • 新しくアイコンを取得する場合はTwitter API を使用します.Twitter API 1.1の制限を超えて配信することは出来ません.
      • API制限に引っかかった場合は404エラーが返ります
    • キャッシュした画像であれば制限はありません
    • 一度に大量のリクエストを発行する場合は,ソースコードから自前のサーバーにデプロイしてください
  • その他
    • 予告なくサービスが停止することがあります
    • 本サービス及びソースコードの利用は自己責任でお願いします

ソースコード

Twitterアイコンを取得するコア部分のソースコードを公開します.大量にリクエストを発行する場合は,自前でhttps://apps.twitter.com/からTwitterアプリを作成し,ソースコードをデプロイしてください.

  • 開発言語
    • Python 3.5.1
  • 依存パッケージ
    • bottle
    • tweepy
    • requests
  • パラメータ
    • cache_path(path):アイコンキャッシュを保存するディレクトリ
    • cache_expire(秒):キャッシュの保存期限
  • ライセンス

core.py

# -*- coding:utf-8 -*-

from bottle import run, get, static_file, default_app, HTTPResponse, error
import tweepy
import os
import requests
import glob
import datetime

CONSUMER_KEY =  'XXXXXXXXXXXXXXXX'
CONSUMER_SECRET = 'XXXXXXXXXXXXXXXX'
ACCESS_TOKEN = 'XXXXXXXXXXXXXXXX'
ACCESS_SECRET = 'XXXXXXXXXXXXXXXX'
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
api = tweepy.API(auth)
cache_path = "./to/cache/path/"
cache_expire = 864000

def get_url(screen_name):
    try:
        img = api.get_user(screen_name)
        return img.profile_image_url_https, img.screen_name
    except tweepy.error.RateLimitError:
        print("API Error")
        return None, None

def is_saved(screen_name):
    files = glob.glob(cache_path + screen_name + '.*')
    print(files)
    if len(files) is 0:
        return False
    else:
        timestamp = datetime.datetime.fromtimestamp(os.stat(files[0]).st_mtime)
        if (datetime.datetime.now() - timestamp).total_seconds() > cache_expire:
            return False
        return True

def get_img(url, screen_name):
    res = requests.get(url=url)
    if res.status_code == 200:
        file_type = url.rsplit('.', 1)[1]
        f = open(cache_path + screen_name + "." + file_type, 'wb')
        f.write(res.content)
        f.close()
        return res.content, file_type
    return None, None

def res_error(num=404, msg=""):
    body = str(num)+" Error\n"+msg
    r = HTTPResponse(status=num, body=body)
    r.set_header('Content-Type', 'text/html')
    return r

@get('/tw/<account_name>')
def proxy(account_name):
    return generate_img(account_name)

@get('/tw/<account_name>/')
def generate_img(account_name):
    m = re.match(pattern, account_name)
    if m is None:
        return res_error(500)
    if is_saved(account_name):
        print("use cache file")
        files = glob.glob(cache_path+account_name+'.*')
        file_type = files[0].rsplit('.', 1)[1]
        s_name = account_name
    else:
        print("Cache is not existed")
        url, s_name= get_url(screen_name=account_name)
        if url is None or s_name is None:
            return res_error(500, body="RateLimitErr")
        img, file_type = get_img(url=url, screen_name=s_name)
        if img is None:
            return res_error(404)
    return static_file(s_name+"."+file_type, root=cache_path)

if __name__ == '__main__':
    run(host='127.0.0.1', port=8888)
else:
    application = default_app()