Open1

rate limitがあるAPIを再帰処理する

ryuta gotoryuta goto

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