ブラウザのアドレスバーにアドレスを入れてデータを得る
アドレスバーに貼り付けるだけ→https://api.bitflyer.jp/v1/getticker
データは見れますが、これではプログラムで利用できないので、データとして連続的に取得するにはコードを書いて取り込む。
注:api.bitflyer.jp と api.bitflyer.comが混在してますがどちらでも同じです
(comが新しいので、どちらかというとcomがいいが、ネットの残骸はまだjpだらけ)
プログラムコードでデータを取得
超シンプルに、requesutsモジュールを使ってTickerのAPIを叩く
import requests print(requests.get('https://api.bitflyer.jp/v1/getticker'))
<Response [200]>
返されたのは、200という「成功しました」のコード
返されたデータの中身を見てみる。
最後に.textを付けると、テキスト形式で返してくれということになるらしい。
(らしいというのは適当だが、requestsというモジュールにサービスで含まれていることなので、モジュールの中を見てみなければわからない。しかも見ても難しくてわからない。)
import requests print(requests.get('https://api.bitflyer.jp/v1/getticker').text)
{"product_code":"BTC_JPY","timestamp":"2019-12-28T17:37:39.95","tick_id":7012032,"best_bid":800199.0,"best_ask":800266.0,"best_bid_size":0.20332786,"best_ask_size":2.8076,"total_bid_depth":1912.61316213,"total_ask_depth":1625.32662773,"ltp":800266.0,"volume":70727.30266907,"volume_by_product":2245.69306647}
次はWEBのデータのやり取りで常識的に使われるJSON形式で表示してみる。
import requests import json print(requests.get('https://api.bitflyer.jp/v1/getticker').json())
{'product_code': 'BTC_JPY', 'timestamp': '2019-12-28T17:37:39.95', 'tick_id': 7012032, 'best_bid': 800199.0, 'best_ask': 800266.0, 'best_bid_size': 0.20332786, 'best_ask_size': 2.8076, 'total_bid_depth': 1912.61316213, 'total_ask_depth': 1625.32662773, 'ltp': 800266.0, 'volume': 70727.29266907, 'volume_by_product': 2245.69306647}
さっきの.TEXTは文字列が”ダブルクォーテーション”で囲まれていたが、こちら.JSONは文字列が’シングルクォーテーション’で囲まれている。
返ってくるデータは同じで、表示のさせ方がモジュールによって違うということだ。
ここで、改行のないデータを見やすく整形してくれるモジュールがあるので使ってみる。
pprintというモジュールで整形して表示する
import requests import json import pprint pprint.pprint(requests.get('https://api.bitflyer.jp/v1/getticker').json()
{'best_ask': 802347.0, 'best_ask_size': 0.05, 'best_bid': 802190.0, 'best_bid_size': 0.17, 'ltp': 802190.0, 'product_code': 'BTC_JPY', 'tick_id': 7026244, 'timestamp': '2019-12-28T18:05:12.5', 'total_ask_depth': 1633.92080608, 'total_bid_depth': 1946.41346145, 'volume': 71077.46781321, 'volume_by_product': 2219.83940682}
一対の辞書データごとに改行されていて見やすい。
一行のコードを汎用性のため関数にする
今までは、printの中に文を詰め込んでいたが、他のAPIも叩けるように関数にする。
#import requests def getdata(): url="https://api.bitflyer.com" path="/v1/ticker" return (requests.get(url+path).json()) #url+path=https://api.bitflyer.jp/v1/getticker print(getdata()) #プリントの中でgetdata()を呼んでデータを貰っている
URLを基本部分と変化する部分に分けて後で連結しているだけだ。
path=の部分を別のAPI用アドレスに変えれば別な関数になり、別な動作をする。
ビットコインの価格を取り出す
データの中から’ltp'(last price=最終価格=現在価格)を取る
import requests def getdata(): url="https://api.bitflyer.jp" path="/v1/ticker" return (requests.get(url+path).json()) print(getdata()['ltp'])
getdata()で取り出したデータ群から
{
‘product_code’: ‘BTC_JPY’,
・・・・・CUT
‘best_bid’: 800199.0,
‘best_ask’: 800266.0,
‘ltp‘: 802190.0,
‘volume’: 70727.29266907,
‘volume_by_product’: 2245.69306647
}
getdata()で返される、階層のない辞書から‘ltp’の値を取り出すには、[キー]と指定する
print(getdata()[‘ltp‘]) #ltpキーで値をゲットしてprint
798010.0
型はなにかチェックする関数type()で調べる
print(type(getdata()[‘ltp’])) #802190.0の型は何かtype()で調べる
結果は
<class ‘float’>
float型、大きい数字や少数を扱う数字型ですね。
type()で型を確認しながらコーディングするとエラーが出にくい。
繰り返しビットコインの価格を取り出す
繰り返す命令は while か for です
通常はさっきの関数getdata()をwhileの傘の下に置けばいいだけです
import requests import time #時間を操るモジュール def getdata(): url="https://api.bitflyer.jp" path="/v1/ticker" print(requests.get(url+path).json()['ltp']) while True: getdata() time.sleep(1)#timeモジュールの中のsleep関数を呼び、(1)秒休む
結果、 一秒ごとに最新に価格が出力されます。
無限ループになってますので止めるときは ^C (windows)
797930.0 797930.0 797983.0 797983.0 797983.0 797983.0 797983.0 797983.0 797983.0 797983.0 797983.0 797983.0 797983.0 797983.0 797983.0 797983.0 797883.0 797867.0 797867.0 797867.0 797867.0 797867.0 797867.0
この値を「変数」に格納すれば、最低限必要な情報は手にできます。
・最低価格(1番安いものと入れ替える)
・最高価格(1番高いものと入れ替える)
・現在価格
・買った価格or売った価格
この4つでプログラム売買できます。
近い将来億り人ですわ。(今 ±0円/日の辺り)