Pythonでビットコインの値段(BTC/USDT)を取得する方法-ビットコインの価格を表示するガジェット作り①

目的

ビットコインの資産をもっていると、「今いくらかな?」ってなるときがたくさんあります。
なぜなら、普通の株取引は夜はないですし、休日もお休みですが、
ビットコインは24時間営業なので、常に「いくらかなー??」ってなるのです。

しかし、毎度アプリ開いたり、webで確認したりするのに「指紋認証きかないなー」とかいってめんどくさいです。
なんとかビットコインの価格を持ってきてそれを7セグで表示できたらいいなと思い、今回やってみることにしました。

どうやってBTC価格を手元に持ってくるか

最初はウェブスクレイピングを思いつきました。
私はBTCの価格をドル表示でよく見てるので、ドル表示で作りたかったです。
ウェブスクレイピングでビットフライヤーから日本円での価格を持ってくる記事がいろいろネット上にありましたが、なかなかドル表示の記事はありませんでした。
そこで、ビットフライヤーから日本円のBTC価格を持ってくる記事を参考にし、よく使ってるBinanceからドル表示のBTC価格を持ってこようかと思いました。

Webスクレイピングやってみた

ウェブスクレイピングやったことがないので、練習がてらに、こんなコード書きました
あと、当方は詳しくないので、スクレイピングについて学ぶなら他サイトに行ったほうがいいと思います。
ちなみにPythonです。

import requests
from bs4 import BeautifulSoup

url = 'https://yahoo.co.jp'
r = requests.get(url)
soup = BeautifulSoup(r.content, 'html.parser') # または、'html.parser'
print(soup.title)
for a in soup.find_all('a'):
    print(a.get('href'))

これは、Yahoo!のトップページを読んでいます。
2行目:PythonでwebスクレイピングするときはBeautifulSoupというのが必要です。
これは以下でインストールします。

pip install beautifulsoup4

5行目:スクレイピング対象の URL にリクエストを送り HTML を取得する
6行目:レスポンスの HTML から BeautifulSoup オブジェクトを作る
7行目:soup.titleでタイトル名を取得して表示しています。以下のように表示されます。

<title>Yahoo! JAPAN</title>

8行目:ページに含まれるリンクを全て取得。そして以下のように表示されます。(長いので一部だけ載せます)

よく考えたらヤフーのトップページはリンクだらけでした

スクレイピングでBinanceからBTC/USDTを持ってくる(未解決)

こんな感じでWebスクレイピングに成功した猫。
ここでBinanceのページに行ってみます。
ちなみに、Binanceとは海外の仮想通貨取引所のことです。
https://www.binance.com/en/trade/BTC_USDT

Chromeを使っているので、右クリックの検証でHTMLを見ます。
ヘッダーの中身を見ると、現在の価格がリアルタイムで更新されているのがわかります。

じゃあ<title>8,876.52 | BTCUSDT | Buy Bitcoin | Binance </title>
を探してくればいいんじゃないかとスクレイピングしたところ、
| BTCUSDT | Buy Bitcoin | Binance
とだけしか持ってこれずに肝心の数値が持ってこれませんでした。

さらに、「Last Price」と検索かけたところ、ここにもリアルタイムで表示が変わっているところがありました。

そこで、とりあえず<span>のある部分だけ持ってくればいいかと思い、やってみました。書いたコードは以下です。

import requests
from bs4 import BeautifulSoup

url = 'https://www.binance.com/en/trade/BTC_USDT'
r = requests.get(url)
soup = BeautifulSoup(r.content, 'html.parser') # または、'html.parser'
for a in soup.find_all('span'):
    print(a)

実行したら次のようになりました。

赤く囲んだところに、価格が表示されました。
ここで猫は喜びました。しかし・・
【悲報】何回実行してもこの価格しか出ない件
1分くらい時間開ければ、更新されるんですけど、連続して実行すると、価格が同じままです。
もうこれは、猫なんでちょっとよくわからなかったです。
どうしようかと思ってググってました。

【朗報】BinanceのAPIがPythonで使える

BinaceのAPIが実は用意されていました。これを使えば、簡単に価格やら自分の残高などの情報が一瞬で取得できます。
神APIが降臨してました。
APIを使うにはパスワード的なもの(API Key , Secret Key)が必要となります。まずはそれを準備していきます。

まずBinanceのアカウントがある必要があります。
アカウントを持っていたのでAPIを使えるようにしていきたいと思います。
詳しくは別のサイトなどを見てほしいのですが、簡単にステップを書いておきます。
取得はめっちゃ簡単です。

  • Binanceにログイン
  • Binanceのアカウントのボタンから「API Management」をクリック
  • 任意のラベル(自分はBinanceApiとした)を入力し、Create New Keyをクリック
  • 2段階認証をクリア
  • 届いたメールの「Confirm New API Key」をクリック
  • するとAPI KeyとSecret Keyが表示されます。
  • それらを確実に記録しておきます。
  • これで下準備1は終了

おもったより簡単でした。それではこのAPIをPythonで使ってみます。
APIを使うにはPythonにpython-binanceというものをインストールしなくてはいけません。
コマンドプロンプトを開いて、以下のように入力します。

pip install python-binance

これで下準備2は完了です。
次に実際にPythonを書いていきます。
一応言っておくのですが、Pythonが最初からインストールされているという前提で話を進めています。
なにもインストールしていない方はPythonとエディタをインストールしてください。
おすすめエディタはVScodeです。

from binance.client import Client

class BinanceAPI:
    def __init__(self):
        API_KEY = '取得したAPIキー'
        API_SECRET = '取得したシークレットキー'
        self.client = Client(API_KEY, API_SECRET)

    def get_ticker(self, pair):
        try:
            value = self.client.get_ticker(symbol=pair)
            return value
        except Exception as e:
            print('Exception Messege : {}'.format(e))
            return None

def main():
    binance_set = BinanceAPI()
    ticker = binance_set.get_ticker('BTCUSDT')
    print(ticker['lastPrice'])

if __name__ == '__main__':
    main()

こんな感じで書いて実行してみると現在の価格が表示できるはずです。5行目と6行目は人によって異なってきますので、ご自身のものに書き換えてください。

8858.12000000

20行目あたりなんですが、以下のようにmain()を変えて、tickerをそのまま表示させてみます。

def main():
    binance_set = BinanceAPI()
    ticker = binance_set.get_ticker('BTCUSDT')
    print(ticker)

表示結果は以下のようになります。

{'symbol': 'BTCUSDT', 'priceChange': '61.75000000', 'priceChangePercent': '0.702', 'weightedAvgPrice': '8918.34306645', 'prevClosePrice': '8794.91000000', 'lastPrice': '8856.67000000', 'lastQty': '0.00127900', 'bidPrice': '8856.36000000', 'bidQty': '0.18397500', 'askPrice': '8856.68000000', 'askQty': '0.00281600', 'openPrice': '8794.92000000', 'highPrice': '9118.58000000', 'lowPrice': '8760.00000000', 'volume': '78227.37309000', 'quoteVolume': '697658550.40378199', 'openTime': 1588614847027, 'closeTime': 1588701247027, 'firstId': 309031600, 'lastId': 309854229, 'count': 822630}

これを見ると、現在の価格以外にもいろんな情報が取得できていることがわかります。


長くなってきたので自分がいろいろアレンジを加えたPythonを以下に示しておきます。ただ、当方プログラムスキルあんまりないので、汚いです。すみません。

from binance.client import Client
from datetime import datetime
import time

class BinanceAPI:

    def __init__(self):
        API_KEY = '取得したもの'
        API_SECRET = '取得したもの'
        self.client = Client(API_KEY, API_SECRET)

    def get_ticker(self, pair):
        try:
            value = self.client.get_ticker(symbol=pair)
            return value
        except Exception as e:
            print('Exception Messege : {}'.format(e))
            return None

    def get_asset(self, symbol):
        try:
            value = self.client.get_asset_balance(asset=symbol)
            return value
        except Exception as e:
            print('Exception Messege : {}'.format(e))
            return None

def get_BTC_USDT(binance_set):
    ticker = binance_set.get_ticker('BTCUSDT')
    price=ticker['lastPrice']
    price=round(float(price),1)
    return price

def get_balance(binance_set):
    asset_dict = binance_set.get_asset("BTC")
    return float(asset_dict['free'])

def main():
    binance_set = BinanceAPI()
    print(" BTC価格"," 残高")
    for i in range(20):
        time.sleep(0.2)
        BTC_price=get_BTC_USDT(binance_set)
        balance=round(BTC_price*get_balance(binance_set),1)
        print("$"+str(BTC_price),"$"+str(balance))

def main2():
    binance_set = BinanceAPI()
    print(" BTC価格")
    BTC_price_tmp=get_BTC_USDT(binance_set)
    while True:
        time.sleep(10)
        BTC_price=get_BTC_USDT(binance_set)
        date=datetime.now().strftime("%H:%M:%S")

        if BTC_price>BTC_price_tmp:
            print("$"+str(BTC_price),"➚",date)
        elif BTC_price<BTC_price_tmp:
            print("$"+str(BTC_price),"➘",date)
        else:
            print("$"+str(BTC_price),"-",date)
        BTC_price_tmp=BTC_price

if __name__ == '__main__':
    main2()

詳しく見ていきます。関数の説明をします。あまり詳しくは説明しません。

def get_ticker(self, pair):

は、実際に指定された通貨のいろんな情報を取得する関数です。

 def get_asset(self, symbol):

は、指定された通貨の残高に関する情報を取得する関数です。

def get_BTC_USDT(binance_set):

は、関数get_tickerを使って、指定された通貨の情報を取得し、小数を整えて、現在の価格を返す関数です。

def get_balance(binance_set):

は、関数get_assetを使って、指定された通貨の残高に関する情報を取得し、それらから現在自由に使える金額を返す関数です。

def main():

は、BTC価格と自分の残高をドルで表示する関数です。この場合、0.2秒毎に20回表示します。
自分の残高[$]=現在のBTC/USDT価格×自分の持っているBTCの量
という計算式を使っています。

def main2():

は、BTC価格を時刻とともに永遠に10秒毎に表示します。前回取得した価格よりも上昇していたら上矢印、同じ場合はハイフン、下落した場合は下矢印も表示します。

最後に

if __name__ == '__main__':
    main2()

で関数main2を使用しています。もちろん、

if __name__ == '__main__':
    main()

とやっても使えます。

とりあえずこんなものができた。

関数main2をコンソールに表示した場合

VScodeで関数mainを使った場合

私の資産は隠しておきます。
こんな感じで、BTCの価格を表示させることができました。
次回はハードウェアを作成したいと思います。

にゃんこ
  • にゃんこ
  • よく遊ぶゲームは
    ・CitiesSkylines
    ・RUST
    ・TransportFever2
    です。
    使える言語は
    C++、Pythonぐらいです
    趣味としては旅行だったり、メルカリ・ヤフオクで売ってたりします

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)