【推奨】APIへのリクエストが1日1回で済む方法
先月、「今日は何の日API」のドメイン移行と新機能の追加をお知らせしました。
その直後にAPIが突如停止、全てのリクエストに"429 too many requests"を返すようになりました。慌ててメールを確認すると、APIをデプロイしたPaaSから「リクエストが多すぎてデータの月間割当を超過したので止めました。サンキュー」というお知らせが来ておりました。
利用者が増えてきたんですね。
で、APIのアクセスログを確認したのですが、おそらく、一部の利用者さまは1日に何十回も同じリクエストをかけておられると思います。
たぶんこのままでは、また止まります。
こちらで特定のIPアドレスにレート制限をかけることもできそうです。…できそうですが、その前に、ちょっと小技をお知らせしておこうと思いまして。本当にちょこっとコードを修正するだけで、1日1回のリクエストで済むはずなのです。
例えばレスポンスをjsonファイルにdumpする方法。
ここでは「d.json」という空のファイルを作成して、サーバにアップしておきます。そして1日1回、以下のようなpythonファイルをcron実行してリクエストをかけます。
import json
import datetime
import requests
today = datetime.date.today()
mmdd = today.strftime('%m%d')
path = "/**ファイルのパス**/d.json"
url = "https://api.whatistoday.cyou/v2/anniv/" + mmdd
r = requests.get(url).json()
with open(path, encoding="utf-8", mode="w") as f:
json.dump(r, f, ensure_ascii=False, indent=2)
これでjsonファイルにレスポンスが保存されます。以下のように。
{
"_count": 1,
"_last": null,
"_items": [
{
"anniv1": "北方領土の日",
"anniv2": "フナの日",
"anniv3": "ふるさとの日(福井県)",
"anniv4": "長野の日(オリンピックメモリアルデー)",
"anniv5": "",
"key": "38",
"mmdd": "0207"
}
]
}
後はそのjsonファイルから何度でも取り出すことができます。
import json
path = "/**ファイルのパス**/d.json"
j = open(path, 'r')
l = json.load(j)
anniv1 = l['_items'][0]['anniv1']
print(anniv1)
#北方領土の日
この他に、データベースへの保存もおすすめです。SQLiteとかMySQLとか。
なるべくAPIへのリスクエスト回数を減らすことに、ご協力をお願いいたします。PaaSの利用規約には「何回も割当超過するならアカウントを取り消します」ということも書いてあるので、本APIにとって、中々に差し迫った状況といえます。今月も止まるようでしたら、来月以降は問題のIPアドレスはブロックさせていただきます。
お心当たりの方は、なにとぞ、ご協力のほど、よろしくお願いいたします。
2024.2.7 「北方領土の日」に sooz
この記事が気に入ったらサポートをしてみませんか?