見出し画像

【推奨】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

この記事が気に入ったらサポートをしてみませんか?