【Bitcoinをもらったので加筆。】bitFlyer LightningのHTTP Public APIを呼び出し、Bitcoinの価格を取得するPython3のプログラムを書いてみた。

By | 2020年2月9日 , Last update: 2020年5月8日

はじめに

Bitcoin始めました。

本Webサイトとは別のWebサイトで運用している忍者AdMaxで入手したポイントとBitcoinが交換できるということで、bitFlyerのアカウントを作成し、500円分(実際には手数料を差し引かれるので、485円分くらいになりますが…)のBitcoinと交換してみました。

Bitcoinへの交換手続き中に日本円との交換レートが短い間隔でかつ大きめに変化してしまうせいか、4回続けて交換に失敗してしまい、本当に交換できるのかどうか不安になってしまいましたが、5回目の挑戦で交換に成功しました。

もらってみた。

Bitcoinへの交換に成功した後で、bitFlyerにログインしてみると、bitFlyerのリンク経由で買い物やサービスを購入または利用することでBitcoinがもらえるそうなので、かなりたくさんあるメニューの中からドミノ・ピザを注文してみることにしました。

bitFlyerのリンク経由でドミノ・ピザでピザを注文すると、商品価格の2.4%(この記事を最初に書いた時点(2020年2月)の情報です。)相当のBitcoinをもらえるそうです。ただ、最終的にもらうためには中の人達の間でそれなりの手続きが必要らしく、かなり先の話になりそうです。

[2020/05/08追加] その後、5月8日に最初にドミノ・ピザで注文した際にもらえる予定だったBitcoinがようやく振り込まれました。

Bitcoinが振り込まれるタイミングは翌月末(つまり3月末)以降とのことでしたが、時間がかかることもあるようです。

閑話休題。

スポンサーリンク


スポンサーリンク

bitFlyerはbitFlyerとの間でBitcoin等の売買を行う方式(「販売所」方式)の他にBitcoinとEthereumについては板取引ができます(「取引所」方式)。さらに、板取引ができる取引所の方(「bitFlyer Lightning」)についてはその情報をAPIを通して取得することができます。

そこで、bitFlyer LightningのAPIのうち、認証なしで取得できるもの(HTTP Public API)を使って、現在の取引値などの情報を取得して、データベースに格納するPython3のプログラムとMariaDB用のSQL文を書いてみることにします。

スポンサーリンク

システムの構成

システムは2個のサブシステムから構成される単純なものです。

  1. Python3によるデータ取得プログラム。
  2. MariaDB上に構築した取得データ格納用のテーブル。

以前この記事でも書きましたが、bitFlyer LightningのAPIについても他に公開されているAPI(Googleの各種APIやAmazonのProduct Advertising API等)と同様に時間あたりのAPIの呼び出し可能回数に上限が設けられていますので、WebサイトへのアクセスがあるごとにAPIを呼び出すという使い方は現実的ではありません。

そこで、データ取得プログラムから取得されたデータをMariaDB上に構築した取得データ格納用のテーブルに書き込んでおき、ある一定程度の時間にわたって使い回すことを想定しています。

サクサクと構築します。

前節で列挙した順番とは逆になりますが、MariaDB上に構築した取得データ格納用のテーブルから構築します。

MariaDB上に構築した取得データ格納用のテーブル

以下のSQL文を書き、MariaDBに流し込んでテーブルを作ります。


スポンサーリンク

なお、大変勝手ながらテーブル名はcrypto_currency_info_cacheとさせていただきました。🙇‍♂️

-- See https://pandanote.info/?p=5966 for details.
drop table if exists crypto_currency_info_cache;
create table crypto_currency_info_cache (
id int (11) not null auto_increment,
product_code varchar(40) unique,
info_at datetime,
tick_id int,
best_bid double,
best_ask double,
best_bid_size double(20,8),
best_ask_size double(20,8),
total_bid_depth double(20,8),
total_ask_depth double(20,8),
ltp double,
volume double(20,8),
volume_by_product double(20,8),
primary key(id)
) ENGINE=InnoDB default charset=utf8mb4;

カラム名は”GET /v1/getticker”リクエストのレスポンスに含まれるデータ項目名に準じていますが、”timetable”については予約語っぽい単語は避けるべく、”info_at”に項目名を変更しています。

Python3によるデータ取得プログラム

以下のPython3のプログラムを書きます。データベースへの接続に必要な情報(ユーザ名、パスワード、データベースサーバ名及びデータベース名)はJSON形式で記述し、”db_config.json”という名前で以下のPython3と同じディレクトリに保管します。

#!/usr/bin/env python3
#
# See https://pandanote.info/?p=5966 for details.
#
import sys
import os
import re
import json
import httplib2
from datetime import datetime
import dateutil.parser
import mysql.connector
db_config_file = 'db_config.json'
db_config = {}
with open(db_config_file) as dbfile:
t = dbfile.read()
dbconfig = json.loads(t)
h = httplib2.Http(".cache")
(resp_headers,content) = h.request("https://api.bitflyer.com/v1/getticker","GET")
conn = mysql.connector.connect(user=dbconfig["user"],password=dbconfig["password"],host=dbconfig["host"],database=dbconfig["dbname"])
c = json.loads(content)
info_at = dateutil.parser.parse(c["timestamp"]).strftime("%Y-%m-%dT%H:%M:%S.%f")
#print(info_at)
insert_sql="insert into crypto_currency_info_cache(product_code,info_at,tick_id,best_bid,best_ask,best_bid_size,best_ask_size,total_bid_depth,total_ask_depth,ltp,volume,volume_by_product) values('{0:s}','{1:s}',{2:d},{3:f},{4:f},{5:f},{6:f},{7:f},{8:f},{9:f},{10:f},{11:f}) on duplicate key update info_at='{12:s}',tick_id={13:d},best_bid={14:f},best_ask={15:f},best_bid_size={16:f},best_ask_size={17:f},total_bid_depth={18:f},total_ask_depth={19:f},ltp={20:f},volume={21:f},volume_by_product={22:f}".format(c["product_code"],info_at,c["tick_id"],c["best_bid"],c["best_ask"],c["best_bid_size"],c["best_ask_size"],c["total_bid_depth"],c["total_ask_depth"],c["ltp"],c["volume"],c["volume_by_product"],info_at,c["tick_id"],c["best_bid"],c["best_ask"],c["best_bid_size"],c["best_ask_size"],c["total_bid_depth"],c["total_ask_depth"],c["ltp"],c["volume"],c["volume_by_product"])
cur = conn.cursor()
cur.execute(insert_sql)
conn.commit()
cur.close()
conn.close()

実行例

プログラムが書けたら、以下のコマンドを実行します。

$ python3 ./getticker.py

 
上記のプログラムは何も出力することなく終了します。

終了したら、MariaDBのデータベース上のテーブルを確認します。
MariaDB [test]> select * from crypto_currency_info_cache;
+----+--------------+---------------------+---------+----------+----------+---------------+---------------+-----------------+-----------------+---------+-----------------+-------------------+
| id | product_code | info_at | tick_id | best_bid | best_ask | best_bid_size | best_ask_size | total_bid_depth | total_ask_depth | ltp | volume | volume_by_product |
+----+--------------+---------------------+---------+----------+----------+---------------+---------------+-----------------+-----------------+---------+-----------------+-------------------+
| 1 | BTC_JPY | 2020-02-09 09:00:16 | 4630260 | 1107008 | 1107274 | 0.20000000 | 0.10000000 | 1488.57143800 | 1690.66916800 | 1107000 | 123589.43611500 | 4905.63955900 |
+----+--------------+---------------------+---------+----------+----------+---------------+---------------+-----------------+-----------------+---------+-----------------+-------------------+
1 row in set (0.001 sec)

上記のような感じで格納されていれば、動作確認完了です。(`・ω・´)シャキーン

まとめ & おまけ

ここまでできたら、次はgetticker.pyをcronで定期的に実行させたりとかするとデータが取得できて、いろいろな分析の材料にできたりして面白くなってくるのかもしれませんが、それは記事を改めて書くことにします。

なお、このたび作成したアカウントのBitcoinのアドレスは以下の通りです。

3BtVUbG9Jxg6EnV8LCqXCaxGDJET7snZx6

また、BitcoinのアドレスのQRコードは以下の通りです↓

QR code of pandanote.info

手元のスマホ(Zenfone 4(ZE554KL))で読み込むことができ、読み取りの結果が上記のアドレスと一致しましたので、寄付を募集する際などに何とか使えそうです(なお、上のアドレスまたはQRコードを直接寄付のために使うこともできます🙇‍♂️)。

この記事は以上です。

References / 参考文献