bitflyerのAPIから返されるエラーのまとめ
現在、仮想通貨取引所bitflyerのAPIを使って自動売買のプログラムを組んでいるのですが、bitflyerのAPIを叩いたときに返されるレスポンスが「雑」すぎて毎回エラー処理に時間を取られます。
そのためこれまで生じたエラーをまとめておき、次回の時短につなげられる自分用のメモを作ります。
bitflyerのAPI
bitflyerではAPIが用意されているため、プログラムの知識があればアプリを作ったり自動売買を組んだりできます。
私は独学ながらPHP(プログラムの一つ)をある程度使えるようになったので、現在PHPを使って自動売買のプログラムを作っています。
その際、APIでのやりとりで「エラー」が返ってくることが多々あるのですが、bitflyerから返ってくるレスポンスが雑すぎてエラー処理がやりにくいのです。
レスポンスが雑すぎる!
bitflyerのAPIを叩く際、
- リクエストボディ
- アクセスサイン
- ヘッダー
を組み立てて次のように「curl」を使ってリクエストを投げています。
//CURL開始 $curl = curl_init(); //CURL初期化の確認 if($curl == false){ echo "エラー[ curl_init() ]:" . curl_error($curl); } curl_setopt($curl, CURLOPT_URL, $target_url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($curl, CURLOPT_POSTFIELDS, $request_body); //CURLの実行 $response = curl_exec($curl); //CURLの実行確認 if($response == false){ echo "エラー[ curl_exec() ]:" . curl_error($curl); } //CURL終了 curl_close($curl); //レスポンスをJSONデコード $json_decode = json_decode($response, true); //出力 print_r($json_decode);
例えば・・・APIでの新規注文が成功した場合は次のレスポンスが返されます。
Array ( [child_order_acceptance_id] => JRF20180226-205521-300000 )
一方、新規注文が失敗した場合は次のレスポンスが返されます。
Array ( [status] => -200 [error_message] => Insufficient funds [data] => )
このように成功した場合はステータスコードが明示的に返されずに注文番号のみ、失敗したときは「-200」が返ってきます。
また、サーバーがメンテナンス中の場合はステータスコード「-2」が返されたりとなんだかレスポンスに統一性がありません。
APIのエラー
ということで、以下にbitflyerのAPIを叩いたときに返されるエラー内容をまとめます。
サーバーダウン時
bitflyerのサーバーがダウンしているときや何らかの原因でAPIアクセスができなかった場合は
null
が返ってきます。
メンテナンス時
bitflyerでは午前4時00分から10分間サーバーのメンテナンスがあるのですが、そのメンテナンス時にアクセスすると次のエラーが返されます。
Array ( [status] => -2 [error_message] => Under maintenance [data] => )
新規注文の失敗
新規注文を出す際、「/v1/me/sendchildorder」のAPIを叩きますが、
- 買い注文時:日本円が足りない
- 売り注文時:ビットコインが足りない
場合、次のエラーが返ってきます。
Array ( [status] => -200 [error_message] => Insufficient funds [data] => )
また、相場急変時にサーバーが重い or 何らかの理由で注文が受け付けられなかった場合は次のエラーが返されます。
Array ( [status] => -208 [error_message] => Order is not accepted. Please try again later. [data] => )
そして、現在レートから低すぎるレートで注文を出した場合は次のエラーができます。
Array ( [status] => -106 [error_message] => The price is too low. [data] => )
逆に高すぎるレートで注文を出した場合はこのエラーが返ってきます。
Array ( [status] => -107 [error_message] => The price is too high. [data] => )
エラー処理
以上を踏まえてエラー処理を書くとしたら次のようになるでしょうか?(かなり大雑把ですが)
//エラー処理 if($json_decode == NULL){ echo "エラー:bitFlyerのサーバーにリクエストできませんでした"; }elseif($json_decode["status"] == -106){ echo "エラー:注文価格が現在レートから低すぎます"; }elseif($json_decode["status"] == -107){ echo "エラー:注文価格が現在レートから高すぎます"; }elseif($json_decode["status"] == -200){ echo "エラー:残高不足により新規注文できませんでした"; }elseif($json_decode["status"] == -208){ echo "エラー:注文が受け付けられませんでした。もう一度実行してください"; }elseif($json_decode["status"] == -2){ echo "エラー:現在サーバーのメンテナンス中です"; }
あわせて読んでほしい!
コメント
2:管理人:2019/09/12 22:19:22
「Invalid signature」(無効な認証)とあるようにAPIを叩くための認証がうまくいってないようです。
3:たかはっしゅ:2019/09/13 10:31:52
有難うございます!頑張ってみます。
1:たかはっしゅ:2019/09/11 22:00:45
BitflyerのAPIで以下のrequestしたら、エラーが出ました。
壁にぶつかってしまいこのサイトに辿り着きました。なにか解決方法わかりましたらご教授いただけますでしょうか?
request:
'me/getcollateral?product_code='
error:
{ status: -500, error_message: 'Invalid signature', data: null }