本文
Python 3とQiita API v2でユーザーの投稿した記事一覧を取得するサンプルコードです。
この投稿では毎回APIを呼び出してJSONをダウンロードしていますが、実際にはサーバーへの優しさ(と回数制限)からローカルに保存して参照した方が適切かと思います。
import json
import urllib.request
from pprint import pp
def get_qiita_user_url(username):
if not isinstance(username, str):
raise TypeError()
return f"https://qiita.com/api/v2/users/{username}"
def fetch_qiita_user(username):
url = get_qiita_user_url(username)
with urllib.request.urlopen(url) as f:
return json.load(f)
def get_qiita_useritems_url(username, page, per_page):
if not isinstance(username, str):
raise TypeError()
if not isinstance(page, int) or not isinstance(per_page, int):
raise TypeError()
if not (1 <= page <= 100) or not (1 <= per_page <= 100):
raise ValueError()
return f"https://qiita.com/api/v2/users/{username}/items?page={page}&per_page={per_page}"
def fetch_qiita_useritems(username, page, per_page):
url = get_qiita_useritems_url(username, page, per_page)
with urllib.request.urlopen(url) as f:
return json.load(f)
def fetch_qiita_userallitems(username):
userinfo = fetch_qiita_user(username)
itemcount = userinfo["items_count"]
useritems = []
for page in range(1, 100):
fetched = (page - 1) * 100
if fetched > itemcount:
break
useritems.extend(fetch_qiita_useritems(username, page, 100))
page += 1
return useritems
# とりあえず自分のユーザー名を指定
username = "katabamisan"
useritems = fetch_qiita_userallitems(username)
titles = [entry["title"] for entry in useritems]
pp(titles)
注意
Qiita API v2ドキュメントによるとAPIは失敗時にエラーを表現するオブジェクトを含むレスポンスを返します。一方、Python 3のurllib.request
はこのときのステータスコードがエラーであることから例外を発生させます。この投稿では関数の呼び出し側が例外を処理することを想定してエラーオブジェクトは特別に処理していません。