⚠この記事はブログ移転前のアーカイブです
ユーザー名を指定するだけで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://icong.bmemo.pw/tw/<screen_name or ID>
- screen_name または IDが使用できます
- HTTPS対応
- キャッシュ
- 既に取得済みのアイコンはキャッシュから配信されます
- キャッシュ期限は10日で,10日を超えた場合は新しくアイコンを取得してキャッシュし直します
- 制限
- 新しくアイコンを取得する場合はTwitter API を使用します.Twitter API 1.1の制限を超えて配信することは出来ません.
- API制限に引っかかった場合は404エラーが返ります
- キャッシュした画像であれば制限はありません
- 一度に大量のリクエストを発行する場合は,ソースコードから自前のサーバーにデプロイしてください
- 新しくアイコンを取得する場合はTwitter API を使用します.Twitter API 1.1の制限を超えて配信することは出来ません.
- その他
- 予告なくサービスが停止することがあります
- 本サービス及びソースコードの利用は自己責任でお願いします
ソースコード
Twitterアイコンを取得するコア部分のソースコードを公開します.大量にリクエストを発行する場合は,自前でhttps://apps.twitter.com/からTwitterアプリを作成し,ソースコードをデプロイしてください.
- 開発言語
- Python 3.5.1
- 依存パッケージ
- bottle
- tweepy
- requests
- パラメータ
- cache_path(path):アイコンキャッシュを保存するディレクトリ
- cache_expire(秒):キャッシュの保存期限
- ライセンス
- Apache License, Version 2.0
http://apache.org/licenses/LICENSE-2.0
- Apache License, Version 2.0
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()