DEVGRU

プログラミングと競馬予想について書きます

Zaif のREST APIエラー時にリトライする

例のZaif だが、拙宅のStreaming APIを403にした件ですでにうんざりだが、 それに加えて混雑のせいでBot のリクエストが通りづらくなっている。

しばらく待ってリクエストする、を繰り返せばいいのだが リトライするべきエラーとそうではないエラー(資産不足とか)を区別する必要がある。

混雑時に発生するエラーのうち、リトライするべきエラーについて解説する。

パターンは大きく分けて2つある。

trade temporarily unavailable.

1つは、HTTPレスポンスのステータスコードは200が返ってくるが、 その内容は以下のようなJSONとなっているもの。

{"success": 0, "error": "trade temporarily unavailable."}

成功時はsuccessが1だが、失敗時はsuccessは0で、errorに理由が書かれている。

この場合は、以下のようなPythonコードで判定できる。

response.json()["success"] != 1 and response.json()["error"] ==  "trade temporarily unavailable."

真なら10秒ぐらい待ってリトライしよう。

502 Bad gateway

もっと重症なのは、HTTPレスポンスのステータスコードが502で返ってくるケース。 技術的には、リバースプロキシとその向こう側とのやり取りで何か起きている状況。

この時、bodyはHTMLを返すので、Pythonのrequestsで.json()なぞ呼び出してJSONとしてパースしようものならJSONDecodeErrorでお陀仏である。

以下で判定する。

response.status_code == 502

その他、504を返した時もあった気がするので、それも判定すると良いかもしれない。


最近のZaifは注文受け付けられない具合が半端じゃないので、API取引は上記のコード必須である。

しかし、最近はブラウザからの通常取引もなかなか通らないのが辛い...

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

Fluent Python ―Pythonicな思考とコーディング手法

Fluent Python ―Pythonicな思考とコーディング手法

  • 作者: Luciano Ramalho,豊沢聡,桑井博之,梶原玲子
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2017/10/07
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

PythonユーザのためのJupyter[実践]入門

PythonユーザのためのJupyter[実践]入門

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目