初心者向けPythonプロジェクト:ビットコイン価格通知

初心者向けPythonプロジェクト:ビットコイン価格通知

初心者向けのPythonプロジェクトに関する一連の記事の最初の記事へようこそ!

このチュートリアルでは、ビットコイン価格通知サービスを構築します—

このプロジェクトでは、HTTPリクエストと、(適切な名前の)requestsパッケージを使用してリクエストを送信する方法について学習します。

ウェブフックと、それらを使用してPythonアプリを電話通知や電報メッセージなどの外部サービスに接続する方法について学習します。

比較的少ないコード(約50行)で、他の暗号通貨やサービスに簡単に拡張できる本格的なビットコイン価格通知サービスにたどり着きます。

すぐに飛びましょう:

Pythonによるビットコイン価格通知

ご存じのとおり、ビットコインの価格は気まぐれなものです。 一日の終わりにどこに行くのか本当にわかりません。 そのため、さまざまなサイトで常に最新の更新を確認する代わりに、Pythonアプリを作成して作業を行ってみましょう。

このために、人気のある自動化WebサイトIFTTTを使用します。 IFTTT(「これなら、それなら」)は、さまざまなアプリとデバイスの間のギャップを埋めるWebサービスです。

2つのIFTTTアプレットを作成します。

  • 1つは、ビットコインの価格が特定のしきい値を下回った場合の緊急通知用です。そして

  • 別のビットコイン価格の定期的なTelegram更新用。

どちらも、Coinmarketcap APIからのデータを消費するPythonアプリによってトリガーされます。

IFTTTアプレットは、トリガーとアクションの2つの部分で構成されています。

この場合、トリガーはIFTTTが提供するwebhookサービスになります。 Webhookは「ユーザー定義のHTTPコールバック」と考えることができ、それらの詳細についてはhereを読むことができます。

Pythonアプリは、アクションをトリガーするwebhook URLにHTTPリクエストを送信します。 さて、これは楽しい部分です。アクションはほとんど何でも可能です。 IFTTTは、メールの送信、Googleスプレッドシートの更新、電話の呼び出しなど、さまざまなアクションを提供します。

プロジェクトのセットアップ

virtual environmentを設定することから始めましょう。 次のコマンドを実行して、新しいPython 3仮想環境を取得します。

$ mkvirtualenv -p $(which python3) bitcoin_notifications

続行する前に、仮想環境をアクティブにし、必要な依存関係をインストールする必要があります。

$ workon bitcoin_notifications  # To activate the virtual environment
$ pip install requests==2.18.4  # We only need the requests package

deactivateシェルコマンドを実行すると、仮想環境を非アクティブ化できます。

ビットコイン価格の取得

手を汚す時間です。 PythonコンソールのCoinmarketcap APIから最新の価格を取得することから始めます。

まず、requestsモジュールをインポートし、ビットコインのCoinmarketcap API URLを含むbitcoin_api_url変数を定義する必要があります。

次に、requests.get()関数を使用してHTTP GETリクエストをURLに送信し、レスポンスを保存します。 APIはJSON応答を返すため、応答で.json()関数を呼び出すことでPythonオブジェクトに変換できます。 ご覧のとおり、APIはビットコインの価格データを含む1つの要素を含むリストを返しました。

>>>

>>> import requests
>>> bitcoin_api_url = 'https://api.coinmarketcap.com/v1/ticker/bitcoin/'
>>> response = requests.get(bitcoin_api_url)
>>> response_json = response.json()
>>> type(response_json) # The API returns a list

>>> # Bitcoin data is the first element of the list
>>> response_json[0]
{'id': 'bitcoin', 'name': 'Bitcoin', 'symbol': 'BTC', 'rank': '1',
 'price_usd': '10226.7', 'price_btc': '1.0', '24h_volume_usd': '7585280000.0',
 'market_cap_usd': '172661078165', 'available_supply': '16883362.0',
 'total_supply': '16883362.0', 'max_supply': '21000000.0',
 'percent_change_1h': '0.67', 'percent_change_24h': '0.78',
 'percent_change_7d': '-4.79', 'last_updated': '1519465767'}

私たちが最も関心を持っているプロパティは、'price_usd'(米ドルでのビットコイン価格)です。

テストIFTTT通知の送信

これで、物事のIFTTT側に進むことができます。 IFTTTを使用するには、最初にset up a new accountを実行し、モバイルアプリをインストールする必要があります(Pythonアプリから電話通知を受信する場合)。 これを設定したら、createtesting purposes用の新しいIFTTTアプレットを作成します。

新しいテストアプレットを作成するには、次の手順に従います。

  1. 大きな“this”ボタンをクリックします

  2. “webhooks”サービスを検索し、“Receive a web request”トリガーを選択します

  3. イベントにtest_eventという名前を付けましょう

  4. 次に、大きな“that”ボタンを選択します

  5. “notifications”サービスを検索し、“Send a notification from the IFTTT app”を選択します

  6. メッセージをI just triggered my first IFTTT action!に変更し、“Create action”をクリックします

  7. “Finish”ボタンをクリックすると完了です

IFTTT Webhookの使用方法に関するドキュメントを表示するには、このpageに移動し、右上隅にある“Documentation”ボタンをクリックします。 ドキュメントページにはw​​ebhook URLが含まれており、次のようになります。

https://maker.ifttt.com/trigger/{event}/with/key/{your-IFTTT-key}

次に、アプレットを作成したときに、手順3でイベントに付けた名前で{event}部分を置き換える必要があります。 {your-IFTTT-key}の部分には、すでにIFTTTキーが入力されています。

次に、webhook URLをコピーして、別のPythonコンソールを起動します。 ここでも、requestsモジュールをインポートし、WebhookURL変数を定義します。 ここで、requests.post()関数を使用してHTTPPOSTリクエストをIFTTTWebhookURLに送信する必要があります。

>>>

>>> import requests
>>> # Make sure that your key is in the URL
>>> ifttt_webhook_url = 'https://maker.ifttt.com/trigger/test_event/with/key/{your-IFTTT-key}'
>>> requests.post(ifttt_webhook_url)

最後の行を実行すると、携帯電話に通知が表示されます。

Python + IFTTT: Test Notification

IFTTTアプレットの作成

これで、メインパートの準備が整いました。 コードを開始する前に、2つの新しいIFTTTアプレットを作成する必要があります。1つは緊急のビットコイン価格通知用、もう1つは定期的な更新用です。

緊急ビットコイン価格通知アプレット:

  1. “webhooks”サービスを選択し、“Receive a web request”トリガーを選択します

  2. イベントにbitcoin_price_emergencyという名前を付けます

  3. アクションには、“Notifications”サービスを選択し、“Send a rich notification from the IFTTT app”アクションを選択します

  4. “Bitcoin price emergency!”のようなタイトルを付けます

  5. メッセージをBitcoin price is at ${{Value1}}. Buy or sell now!に設定します(後で{{Value1}}の部分に戻ります)

  6. オプションで、リンクURLをCoinmarketcapビットコインページに追加できます:https://coinmarketcap.com/currencies/bitcoin/

  7. アクションを作成し、アプレットのセットアップを完了します

通常価格更新アプレット:

  1. もう一度“webhooks”サービスを選択し、“Receive a web request”トリガーを選択します

  2. イベントにbitcoin_price_updateという名前を付けます

  3. アクションには、“Telegram”サービスを選択し、“Send message”アクションを選択します

  4. メッセージテキストを次のように設定します:Latest bitcoin prices:<br>{{Value1}}

  5. アクションを作成し、アプレットで終了します

Note:このアプレットを作成するときは、IFTTTTelegramボットを承認する必要があります。

すべてを一緒に入れて

IFTTTが邪魔にならないので、コーディングを始めましょう! まず、以下に示す標準のPythonコマンドラインアプリスケルトンを作成します。 このコードを取得して、bitcoin_notifications.pyというファイルに保存します。

import requests
import time
from datetime import datetime

def main():
    pass

if __name__ == '__main__':
    main()

次に、2つの以前のPythonコンソールセッションを、最新のビットコイン価格を返す2つの関数に変換し、それぞれIFTTT Webhookに投稿する必要があります。 メイン関数の上に次の関数を追加します。

BITCOIN_API_URL = 'https://api.coinmarketcap.com/v1/ticker/bitcoin/'
IFTTT_WEBHOOKS_URL = 'https://maker.ifttt.com/trigger/{}/with/key/{your-IFTTT-key}'

def get_latest_bitcoin_price():
    response = requests.get(BITCOIN_API_URL)
    response_json = response.json()
    # Convert the price to a floating point number
    return float(response_json[0]['price_usd'])


def post_ifttt_webhook(event, value):
    # The payload that will be sent to IFTTT service
    data = {'value1': value}
    # inserts our desired event
    ifttt_event_url = IFTTT_WEBHOOKS_URL.format(event)
    # Sends a HTTP POST request to the webhook URL
    requests.post(ifttt_event_url, json=data)

get_latest_bitcoin_priceは、価格を文字列から浮動小数点数に変換する必要がある部分を除いて、ほとんど同じです。 post_ifttt_webhookは、eventvalueの2つのパラメーターを取ります。

eventパラメーターは、IFTTTアプレットをセットアップするときにトリガーに付けたイベント名に対応します。 また、IFTTT Webhookを使用すると、JSON形式のデータとしてリクエストとともに追加のデータを送信できます。

そのため、valueパラメータが必要です。アプレットを設定するときに、メッセージフィールドに{{Value1}}タグを残しました。 このタグは、JSONペイロードの'value1'テキストに置き換えられます。 requests.post()関数を使用すると、jsonキーワードを追加するだけで追加のJSONデータを送信できます。

これで、main関数でアプリのコアに進むことができます。 アプリを永久に実行したいので、while Trueループで構成されます。 ループでは、Coinmarketcap APIを呼び出して、最新のビットコイン価格を取得し、現在の日付と時刻を記録します。

現在の価格に基づいて、緊急通知を送信するかどうかを決定します。 定期的なTelegramの更新では、現在の価格と日付をbitcoin_historyリストに追加します。 リストが特定の数のアイテムに達すると(例: 5)アイテムをフォーマットし、更新をTelegramに送信し、将来の更新のために履歴をリセットします。

ヒュー! ご覧のとおり、このアプリでは多くのことが行われています。 これまでに取得したコードを追跡できない場合は、少し休憩を取り、上記のセクションをゆっくりと読み直してください。 これは簡単なことではないので、時間をかけて最初にすべてを完璧にすることを心配しないでください。

重要なことは、次の2つの理由により、これらのリクエストを頻繁に送信しないようにすることです。

  • Coinmarketcap APIでは、5分ごとにデータを更新するだけであるため、それよりも頻繁に最新の価格情報を再ロードしても意味がありません

  • アプリがCoinmarketcap APIに送信するリクエストが多すぎる場合、IPが禁止されたり、一時的に停止される可能性があります。

そのため、新しいデータを取得する前に少なくとも5分間「スリープ状態にする」(ループの実行を停止する)必要があります。 以下のコードは、上記の必要な機能をすべて実装しています。

BITCOIN_PRICE_THRESHOLD = 10000  # Set this to whatever you like

def main():
    bitcoin_history = []
    while True:
        price = get_latest_bitcoin_price()
        date = datetime.now()
        bitcoin_history.append({'date': date, 'price': price})

        # Send an emergency notification
        if price < BITCOIN_PRICE_THRESHOLD:
            post_ifttt_webhook('bitcoin_price_emergency', price)

        # Send a Telegram notification
        # Once we have 5 items in our bitcoin_history send an update
        if len(bitcoin_history) == 5:
            post_ifttt_webhook('bitcoin_price_update',
                               format_bitcoin_history(bitcoin_history))
            # Reset the history
            bitcoin_history = []

        # Sleep for 5 minutes
        # (For testing purposes you can set it to a lower number)
        time.sleep(5 * 60)

ほぼ完了です! 欠落しているのはformat_bitcoin_history関数だけです。 引数としてbitcoin_historyを取り、<br><b><i>などのTelegramで許可されている基本的なHTMLタグのいくつかを使用してフォーマットします。 この関数をmain関数の上にコピーします。

def format_bitcoin_history(bitcoin_history):
    rows = []
    for bitcoin_price in bitcoin_history:
        # Formats the date into a string: '24.02.2018 15:09'
        date = bitcoin_price['date'].strftime('%d.%m.%Y %H:%M')
        price = bitcoin_price['price']
        #  (bold) tag creates bolded text
        # 24.02.2018 15:09: $10123.4
        row = '{}: ${}'.format(date, price)
        rows.append(row)

    # Use a 
(break) tag to create a new line # Join the rows delimited by
tag: row1
row2
row3 return '
'.join(rows)

これは、最終結果が携帯電話でどのように表示されるかです。

Python + IFTTT: Bitcoin Telegram

価格通知アプリを実行するには、コマンドラインターミナルで次を実行します。

$ python bitcoin_notifications.py

それでおしまい! 50行強のPythonコードで、独自のビットコイン通知サービスを作成しました。 おめでとうございます。 以下にコード全体を追加したので、何かを見逃していないかどうかを比較して確認できます。

まとめと次のステップ

この記事では、独自のビットコイン通知サービスを作成しました。 requestsパッケージを使用してHTTPGETおよびPOSTリクエストを送信する方法を学習しました。 IFTTTとwebhookを使用して、Pythonアプリを外部サービスに接続するのがどれほど簡単かを見ました。

さて、次にどこに行けばいいですか? PythonとIFTTTでは、空は限界です。 しかし、ここから始めましょう。

  • スプレッドシートが好きですか? Googleスプレッドシートにビットコイン価格を追加するIFTTTアクションを使用します

  • if price < BITCOIN_PRICE_THRESHOLD条件を改善して、通知を1日1回だけ受け取るようにします(そうしないと、ビットコインが一貫して低い場合に非常に煩わしくなります)

  • Ethereum / Litecoin / Dogecoinの方が良いですか? get_latest_bitcoin_priceget_latest_cryptocurrency_priceに変更します。これは、暗号通貨をパラメーターとして受け取り、その価格を返します。

  • 別の通貨で価格が必要ですか? Coinmarketcap APIでconvertパラメータを確認してください。

また、これは、スキルを向上させるためにビルドできるPythonプロジェクトを含む継続的なシリーズになります。 次のチュートリアルをお見逃しなく:

Get Notified:このチュートリアルのフォローアップをお見逃しなく—https://realpython.com/bonus/newsletter-dont-miss-updates/ [ここをクリックしてRealPythonニュースレターに参加してください]いつかわかります次の記事が出ます。

幸運とハッピーパイソン! 以下のコメントで、PythonとIFTTTを使用して構築したものを教えてください!