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

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

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

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

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

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

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

すぐに飛びましょう:

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

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

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

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

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

  • もう1つは、ビットコインの価格に関する定期的なhttps://telegram.org/[Telegram]アップデートです。

両方とも、https://coinmarketcap.com/api/[Coinmarketcap API]からのデータを消費するPythonアプリによってトリガーされます。

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

この場合、トリガーはIFTTTが提供するwebhookサービスになります。 webhookは「ユーザー定義のHTTPコールバック」と考えることができ、それらについて詳しく読むことができますhttp://timothyfitz.com/2009/02/09/what-webhooks-are-and-why-you-should-care/[ここに]。

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

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

仮想環境を設定することから始めましょう。 次のコマンドを実行して、新しい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 `モジュールをインポートし、Bitcoinの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
<class '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を使用するには、まずhttps://ifttt.com/join [新しいアカウントを設定]してモバイルアプリをインストールする必要があります(Pythonアプリから電話通知を受信する場合)。 それを設定したら、https://ifttt.com/create [作成] テスト目的用の新しいIFTTTアプレットを作成します。

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

  1. 大きな_「this」_ボタンをクリックします

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

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

  4. 大きな_「that」_ボタンを選択します

  5. 「通知」_サービスを検索し、「IFTTTアプリから通知を送信する」_を選択します

  6. メッセージを「最初のIFTTTアクションをトリガーしました!」に変更し、_「アクションを作成」_をクリックします。

  7. _「完了」_ボタンをクリックして完了です。

IFTTT Webhookの使用方法に関するドキュメントを参照するには、このhttps://ifttt.com/maker_webhooks[page]にアクセスし、右上隅の[ドキュメント] _ボタンをクリックしてください。 ドキュメントページにはw​​ebhook URLが含まれており、次のようになります。

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

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

次に、webhook URLをコピーして、別のPythonコンソールを起動します。 再度、 `+ requests `モジュールをインポートし、webhook URL変数を定義します。 ここで、 ` requests.post()+`関数を使用して、HTTP POSTリクエストをIFTTT webhook URLに送信するだけです。

>>>

>>> 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)
<Response [200]>

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

Python + IFTTT:Test Notification、width = 1440、height = 328

IFTTTアプレットの作成

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

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

  1. 「webhooks」_サービスを選択し、「Webリクエストの受信」_トリガーを選択します

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

  3. アクションについては、「通知」_サービスを選択し、「IFTTTアプリからリッチ通知を送信する」_アクションを選択します

  4. _「ビットコイン価格緊急!」_のようなタイトルを付けます

  5. メッセージを「+ Bitcoin price is at $ {{Value1}}」に設定します。 今すぐ購入または販売!+ (後ほど + {{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. メッセージテキストを次のように設定します: +最新のビットコイン価格:<br> {{Value1}} +

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

_ *注意:*このアプレットを作成する場合、IFTTT Telegramボットを認証する必要があります。 _

すべてを一緒に入れて

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 +`は2つのパラメーターを取ります: `+ event +`と `+ value +

`+ 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']
        # <b> (bold) tag creates bolded text
        # 24.02.2018 15:09: $<b>10123.4</b>
        row = '{}: $<b>{}</b>'.format(date, price)
        rows.append(row)

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

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

Python + IFTTT:Bitcoin Telegram、width = 256、height = 134

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

$ python bitcoin_notifications.py

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

まとめと次のステップ

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

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

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

  • 「+ if価格<BITCOIN_PRICE_THRESHOLD +」条件を改善して、1日に1回だけ通知を取得します(そうしないと、Bitcoinが一貫して低い場合、非常に迷惑になります)

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

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

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

*通知を受け取る:*このチュートリアルのフォローアップをお見逃しなく—https://realpython.com/bonus/newsletter-dont-miss-updates/[Real Python Newsletterに参加するにはここをクリックしてください]次の分割払いが出てきます。

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