Open1
rate limitがあるAPIを再帰処理する
Pythonとrequestsを使うケースが多いので、こんな感じで書くとRate Limitに到達してもよしなに待機して再実行できる。
import time
import requests
from requests import HTTPError, Response
def call_api (url, **kwargs) -> Response:
try:
# 参考までに、GETで。requests.request(method, url, **kwargs)みたにするともっと汎用的かも
res = requests.get(url, **kwargs)
res.raise_for_status()
return res
except HTTPError as httperr:
if httperr.response.status_code == 429:
# Rate Limitに到達したケース
# レスポンスヘッダのretry-afterに待ち時間が格納されている
wait_time = int(httperr.response.headers["retry-after"])
time.sleep(wait_time)
# 再帰呼び出し
return call_api(url, **kwargs)
else:
# 本来は適切なログを取るコードを記載するべきだが割愛
raise
except Exception:
# 本来は適切なログを取るコードを記載するべきだが割愛
raise