4.APIでデータのやり取り(1) 「お手製 python bitflyer Trading Bot」

APIを叩いてbitcoinのデータを受け取る

まずはブラウザにアドレスを入れてデータを得る。

データは見れますが、見るかコピーするかのアナログになりますので、やはり連続的に取得するにはプログラムです。

 


Windows10 powershellでcurlを叩く

 

2018年4月に配布された Windows 10 の大型アップデート (RS4, 1803) から使えるようになったそうです。

powershellでもコマンドプロンプト(dos窓)でも両方使えますが違いがあります。

 

【DOS窓でhttps://api.bitflyer.jp/v1/markets】

marketsを叩くと、取引所のペア一覧が帰ってきます。

[{"product_code":"BTC_JPY"},{"product_code":"FX_BTC_JPY"},{"product_code":"ETH_BTC"},{"product_code":"BCH_BTC"},{"product_code":"BTCJPY27DEC2019","alias":"BTCJPY_MAT1WK"},{"product_code":"ETH_JPY"},{"product_code":"BTCJPY27MAR2020","alias":"BTCJPY_MAT3M"},{"product_code":"BTCJPY03JAN2020","alias":"BTCJPY_MAT2WK"}]

 

【powershell で https://api.bitflyer.jp/v1/markets】

こりゃ良いわ!

ステータス200(OK番号)も表示されるし、細かい情報も表示されてるし、行の長さまで帰ってきてるし。ただ、本体は省略されてますが、どうなんでしょうか?

StatusCode        : 200
StatusDescription : OK
Content           : [{"product_code":"BTC_JPY"},{"product_code":"FX_BTC_JPY"},{"product_code":"ETH_BTC"},{"product_code
                    ":"BCH_BTC"},{"product_code":"BTCJPY27DEC2019","alias":"BTCJPY_MAT1WK"},{"product_code":"ETH_JPY"},
                    {"...
RawContent        : HTTP/1.1 200 OK
                    Pragma: no-cache
                    X-RateLimit-Period: 300
                    X-RateLimit-Remaining: 499
                    X-RateLimit-Reset: 1576941169
                    Request-Context: appId=cid-v1:edafd9df-f22e-4349-b71f-1c468550add5
                    X-Content-Typ...
Forms             : {}
Headers           : {[Pragma, no-cache], [X-RateLimit-Period, 300], [X-RateLimit-Remaining, 499], [X-RateLimit-Reset, 1
                    576941169]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 315

 

PowershellでBitflyerのprivete APIを叩いてみると

curl https://api.bitflyer.com/v1/me/getpermissions
curl : {"status":-500,"error_message":"ACCESS-KEY header is required","data":null}
発生場所 行:1 文字:1
+ curl https://api.bitflyer.com/v1/me/getpermissions
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest]、WebExce
    ption
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

コード-500(失敗)access-key が必要ですが空っぽですといってます。

Tikerを送らせてみるか

curl https://api.bitflyer.jp/v1/getticker


StatusCode        : 200
StatusDescription : OK
Content           : {"product_code":"BTC_JPY","timestamp":"2019-12-21T15:32:02.087","tick_id":2800431,"best_bid":781439
                    .0,"best_ask":781832.0,"best_bid_size":0.1,"best_ask_size":0.001,"total_bid_depth":1945.51205548,"t
                    ot...
RawContent        : HTTP/1.1 200 OK
                    Pragma: no-cache
                    X-RateLimit-Period: 300
                    X-RateLimit-Remaining: 499
                    X-RateLimit-Reset: 1576942623
                    Request-Context: appId=cid-v1:edafd9df-f22e-4349-b71f-1c468550add5
                    X-Content-Typ...
Forms             : {}
Headers           : {[Pragma, no-cache], [X-RateLimit-Period, 300], [X-RateLimit-Remaining, 499], [X-RateLimit-Reset, 1
                    576942623]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 301

パラメーターで通貨ペアを指定しないとデフォルトのBTC_JPYの情報が返ってくる。

FX_BTC_JPYを指定してみる。

curl https://api.bitflyer.jp/v1/getticker?'product_code'='FX_BTC_JPY'


StatusCode        : 200
StatusDescription : OK
Content           : {"product_code":"FX_BTC_JPY","timestamp":"2019-12-21T15:33:00.023","tick_id":64093035,"best_bid":78
                    9699.0,"best_ask":789735.0,"best_bid_size":0.4518,"best_ask_size":0.02,"total_bid_depth":7008.45756
                    71...
RawContent        : HTTP/1.1 200 OK
                    Pragma: no-cache
                    X-RateLimit-Period: 244
                    X-RateLimit-Remaining: 498
                    X-RateLimit-Reset: 1576942624
                    Request-Context: appId=cid-v1:edafd9df-f22e-4349-b71f-1c468550add5
                    X-Content-Typ...
Forms             : {}
Headers           : {[Pragma, no-cache], [X-RateLimit-Period, 244], [X-RateLimit-Remaining, 498], [X-RateLimit-Reset, 1
                    576942624]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 308

 

絵面的にはこうです↓

上の青い画面がpowershell、下の黒い画面がコマンドプロンプト。

以上「ノンプログラムでAPIを叩け!」でした。

 


ここから、「PythonでAPIを叩け!」です

2行のソースでtickerを取得

import requests
print(requests.get('https://api.bitflyer.jp/v1/getticker?product_code=FX_BTC_JPY').text)
結果出力 適当に改行してますが、1行で出力されます
{"product_code":"FX_BTC_JPY","timestamp":"2019-11-28T03:07:47.373",
"tick_id":48758132,"best_bid":835866.0,"best_ask":835921.0,"best_bid_size":0.17,
"best_ask_size":0.05,"total_bid_depth":7282.15239273,"total_ask_depth":6286.49114921,
"ltp":835866.0,"volume":165037.83266976,"volume_by_product":164994.16153915}

 

1行ずつ解析(解ってないので解説ではない)

requests.get('https://api.bitflyer.jp/v1/getticker?product_code=FX_BTC_JPY')

requests というライブラリーを利用して、BFのtickerを出力してくれるAPIのアドレスを指定して中身を受け取ってもらう。

 Response [200]

帰ってきたのは、GETが成功したという報告の番号200。

中身が見えないので、text形式で返してもらうようにする

print(requests.get('https://api.bitflyer.jp/v1/getticker?product_code=FX_BTC_JPY').text)

最後に、.textをつけるとテキストで返してくれるのでprint出来る

しかし、何の区切りもないので、今後もっと大量のデータを受け取る時に、見やすい方法として、pprintという関数を使う。(クラスのメソッドかもしれないが、中身を調べる知恵と時間がない。)

見づらいので、変更①json形式で受け取って、②整形出力してくれるpprintを使う

import requests
import pprint

pprint.pprint(requests.get('https://api.bitflyer.jp/v1/getticker?product_code=FX_BTC_JPY').json())

pprintを使うのに、pprint.pprintと2回重ねないとエラーになる。
( from pprint import pprintとすれば2回重ねなくて良いようだ)

{'best_ask': 835681.0,
 'best_ask_size': 0.00388161,
 'best_bid': 835680.0,
 'best_bid_size': 0.01,
 'ltp': 835681.0,
 'product_code': 'FX_BTC_JPY',
 'tick_id': 48940600,
 'timestamp': '2019-11-28T03:23:31.993',
 'total_ask_depth': 6271.30917723,
 'total_bid_depth': 7289.90711293,
 'volume': 163964.68897911,
 'volume_by_product': 163921.0188485}

pprintは丁寧に改行してくれている。

欲しい値をキーで取り出す。

データの中から、ラストプライス’ltp’を取り出そう。

まず毎回getする必要はないので、一旦変数’tk’に代入する。

そこからキーが’ltp’のデータを取り出す。

tk=(requests.get('https://api.bitflyer.jp/v1/getticker?product_code=FX_BTC_JPY').json())
print(tk['ltp'])

ltpの値が取り出せました。

835681.0

追記中

 


BF API エラー処理

コメント

amazon 本日のタイムセール Time Sale
現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 動画290本28.5時間 \24,000 (毎月月初数日間は 1800円)
楽天モバイル、妻がiphone SE2、息子がiphone11で使ってます。一番安くて通信品質イマイチ
タイトルとURLをコピーしました