Python-Projekt für Anfänger: Bitcoin-Preisbenachrichtigungen

Python-Projekt für Anfänger: Bitcoin-Preisbenachrichtigungen

Willkommen zum ersten Artikel in einer Reihe von Artikeln über Python-Projekte für Anfänger!

In diesem Tutorial erstellen wir einen Bitcoin-Preisbenachrichtigungsdienst.

Während dieses Projekts erfahren Sie mehr über HTTP-Anforderungen und wie Sie diese mit dem Paket (entsprechend benannt)requestsenden.

Sie erfahren mehr über Webhooks und wie Sie sie verwenden können, um Ihre Python-App mit externen Diensten wie Telefonbenachrichtigungen oder Telegrammnachrichten zu verbinden.

Mit relativ wenig Code (~ 50 Zeilen) gelangen Sie zu einem vollwertigen Bitcoin-Preisbenachrichtigungsdienst, der problemlos auf andere Kryptowährungen und Dienste erweitert werden kann.

Also lasst uns gleich loslegen:

Bitcoin-Preisbenachrichtigungen mit Python

Wie wir alle wissen, ist der Bitcoin-Preis eine launische Sache. Man weiß nie wirklich, wo es am Ende des Tages sein wird. Anstatt ständig auf verschiedenen Websites nach den neuesten Updates zu suchen, erstellen wir eine Python-App, die die Arbeit für Sie erledigt.

Dazu verwenden wir die beliebte AutomatisierungswebsiteIFTTT. IFTTT („wenn dies, dann das“) ist ein Webdienst, der die Lücke zwischen verschiedenen Apps und Geräten schließt.

Wir werden zwei IFTTT-Applets erstellen:

  • Eine für die Notfallbenachrichtigung, wenn der Bitcoin-Preis unter einen bestimmten Schwellenwert fällt. und

  • eine weitere für regelmäßigeTelegram-Updates zum Bitcoin-Preis.

Beide werden von unserer Python-App ausgelöst, die die Daten ausCoinmarketcap API verbraucht.

Ein IFTTT-Applet besteht aus zwei Teilen: einem Trigger und einer Aktion.

In unserem Fall ist der Auslöser ein von IFTTT bereitgestellter Webhook-Dienst. Sie können sich Webhooks als "benutzerdefinierte HTTP-Rückrufe" vorstellen und mehr darüber lesenhere.

Unsere Python-App sendet eine HTTP-Anfrage an die Webhook-URL, die eine Aktion auslöst. Nun, das ist der lustige Teil - die Action könnte fast alles sein, was Sie wollen. IFTTT bietet eine Vielzahl von Aktionen wie das Senden einer E-Mail, das Aktualisieren einer Google-Tabelle und sogar das Anrufen Ihres Telefons.

Projektaufbau

Beginnen wir mit dem Einrichten vonvirtual environment. Führen Sie diesen Befehl aus, um eine neue virtuelle Python 3-Umgebung zu erhalten:

$ mkvirtualenv -p $(which python3) bitcoin_notifications

Bevor Sie fortfahren, müssen Sie die virtuelle Umgebung aktivieren und die erforderlichen Abhängigkeiten installieren:

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

Sie können die virtuelle Umgebung deaktivieren, indem Sie den Shell-Befehldeactivateausführen.

Abrufen des Bitcoin-Preises

Zeit, uns die Hände schmutzig zu machen. Wir können damit beginnen, den neuesten Preis von der Coinmarketcap-API in der Python-Konsole abzurufen:

Zuerst müssen wir das Modulrequests importieren und die Variablebitcoin_api_url definieren, die die Coinmarketcap API-URL für Bitcoin enthält.

Als Nächstes senden wir mithilfe der Funktionrequests.get()eine HTTP-GET-Anforderung an die URL und speichern die Antwort. Da die API eine JSON-Antwort zurückgibt, können wir sie in ein Python-Objekt konvertieren, indem wir die Funktion.json()für die Antwort aufrufen. Wie Sie sehen können, hat die API eine Liste mit einem Element zurückgegeben, das die Bitcoin-Preisdaten enthält:

>>>

>>> 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'}

Die Eigenschaft, an der wir am meisten interessiert sind, ist'price_usd' - der Bitcoin-Preis in US-Dollar.

Senden einer Test-IFTTT-Benachrichtigung

Jetzt können wir uns der IFTTT-Seite der Dinge zuwenden. Um IFTTT verwenden zu können, müssen Sie zuerstset up a new account eingeben und die mobile App installieren (wenn Sie telefonische Benachrichtigungen von Ihrer Python-App erhalten möchten). Sobald Sie dies eingerichtet haben, wirdcreateein neues IFTTT-Applet fürtesting purposes.

Gehen Sie folgendermaßen vor, um ein neues Test-Applet zu erstellen:

  1. Klicken Sie auf die große Schaltfläche“this”

  2. Suchen Sie nach dem Dienst“webhooks”und wählen Sie den Auslöser“Receive a web request”aus

  3. Nennen wir das Ereignistest_event

  4. Wählen Sie nun die große Schaltfläche“that”

  5. Suchen Sie nach dem Dienst“notifications”und wählen Sie“Send a notification from the IFTTT app”aus

  6. Ändern Sie die Nachricht inI just triggered my first IFTTT action! und klicken Sie auf“Create action”

  7. Klicken Sie auf die Schaltfläche“Finish” und wir sind fertig

Um die Dokumentation zur Verwendung der IFTTT-Webhooks anzuzeigen, gehen Sie zupage und klicken Sie auf die Schaltfläche“Documentation” in der oberen rechten Ecke. Die Dokumentationsseite enthält die Webhook-URL und sieht folgendermaßen aus:

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

Als Nächstes müssen Sie den{event}-Teil durch den Namen ersetzen, den Sie unserem Ereignis in Schritt 3 beim Erstellen des Applets gegeben haben. Der Teil von{your-IFTTT-key} ist bereits mit Ihrem IFTTT-Schlüssel gefüllt.

Kopieren Sie nun die Webhook-URL und starten Sie eine andere Python-Konsole. Wieder importieren wir das Modulrequests und definieren die Webhook-URL-Variable. Jetzt müssen wir nur noch eine HTTP-POST-Anfrage mit der Funktionrequests.post()an die IFTTT-Webhook-URL senden:

>>>

>>> 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)

Nachdem Sie die letzte Zeile ausgeführt haben, sollte auf Ihrem Telefon eine Benachrichtigung angezeigt werden:

Python + IFTTT: Test Notification

IFTTT-Applets erstellen

Jetzt sind wir endlich bereit für den Hauptteil. Bevor wir mit dem Code beginnen, müssen wir zwei neue IFTTT-Applets erstellen: eines für Bitcoin-Notfallbenachrichtigungen und eines für regelmäßige Updates.

Notfall-Applet zur Benachrichtigung über Bitcoin-Preise:

  1. Wählen Sie den Dienst“webhooks”und den Auslöser“Receive a web request”

  2. Nennen Sie das Ereignisbitcoin_price_emergency

  3. Wählen Sie für die Aktion den Dienst“Notifications”und die Aktion“Send a rich notification from the IFTTT app”aus

  4. Geben Sie ihm einen Titel wie“Bitcoin price emergency!”

  5. Setzen Sie die Nachricht aufBitcoin price is at ${{Value1}}. Buy or sell now! (wir werden später zum Teil{{Value1}}zurückkehren).

  6. Optional können Sie der Coinmarketcap Bitcoin-Seite eine Link-URL hinzufügen:https://coinmarketcap.com/currencies/bitcoin/

  7. Erstellen Sie die Aktion und beenden Sie die Einrichtung des Applets

Applet für regelmäßige Preisaktualisierungen:

  1. Wählen Sie erneut den Dienst“webhooks”und den Auslöser“Receive a web request”

  2. Nennen Sie das Ereignisbitcoin_price_update

  3. Wählen Sie für die Aktion den Dienst“Telegram”und die Aktion“Send message”aus

  4. Setzen Sie den Nachrichtentext auf:Latest bitcoin prices:<br>{{Value1}}

  5. Erstellen Sie die Aktion und beenden Sie mit dem Applet

Note: Beim Erstellen dieses Applets müssen Sie den IFTTT-Telegramm-Bot autorisieren.

Alles zusammenfügen

Nachdem wir IFTTT aus dem Weg geräumt haben, beginnen wir mit dem Codieren! Zunächst erstellen Sie das unten gezeigte Standard-Python-Befehlszeilen-App-Skelett. Nehmen Sie diesen Code und speichern Sie ihn in einer Datei namensbitcoin_notifications.py:

import requests
import time
from datetime import datetime

def main():
    pass

if __name__ == '__main__':
    main()

Als nächstes müssen wir die beiden vorherigen Python-Konsolensitzungen in zwei Funktionen übersetzen, die den neuesten Bitcoin-Preis zurückgeben und an den IFTTT-Webhook senden. Fügen Sie über der Hauptfunktion die folgenden Funktionen hinzu:

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)

Dasget_latest_bitcoin_price ist ziemlich gleich, mit Ausnahme des Teils, in dem wir den Preis von einer Zeichenfolge in eine Gleitkommazahl umwandeln müssen. post_ifttt_webhook akzeptiert zwei Parameter:event undvalue.

Der Parameterevent entspricht dem Ereignisnamen, den wir unserem Trigger beim Einrichten des IFTTT-Applets gegeben haben. Mit den IFTTT-Webhooks können wir außerdem zusätzliche Daten zusammen mit der Anforderung als JSON-formatierte Daten senden.

Deshalb benötigen wir den Parametervalue: Beim Einrichten unserer Applets haben wir ein{{Value1}}-Tag in unseren Nachrichtenfeldern hinterlassen. Dieses Tag wird durch den Text von'value1'aus der JSON-Nutzlast ersetzt. Mit der Funktionrequests.post()können wir zusätzliche JSON-Daten senden, indem wir einfach das Schlüsselwortjsonhinzufügen.

Jetzt können wir in dermain-Funktion zum Kern unserer App übergehen. Es wird aus einerwhile True-Schleife bestehen, da unsere App für immer ausgeführt werden soll. In der Schleife rufen wir die Coinmarketcap-API auf, um den neuesten Bitcoin-Preis zu erhalten und das aktuelle Datum und die aktuelle Uhrzeit aufzuzeichnen.

Basierend auf dem aktuellen Preis werden wir entscheiden, ob wir eine Notfallbenachrichtigung senden möchten. Für unsere regelmäßigen Telegramm-Updates werden wir auch den aktuellen Preis und das aktuelle Datum an einebitcoin_history-Liste anhängen. Sobald die Liste eine bestimmte Anzahl von Elementen erreicht (z. 5) Wir werden die Elemente formatieren, das Update an Telegram senden und den Verlauf für zukünftige Updates zurücksetzen.

Wheew! Wie Sie sehen, ist in dieser App viel los. Wenn Sie Probleme haben, dem Code zu folgen, den wir bisher haben, machen Sie eine kurze Pause und lesen Sie den obigen Abschnitt langsam noch einmal durch. Dieses Zeug ist nicht einfach, nehmen Sie sich also Zeit und sorgen Sie sich nicht darum, dass beim ersten Mal alles perfekt wird.

Eine wichtige Sache ist es, diese Anfragen aus zwei Gründen nicht zu häufig zu versenden:

  • Die Coinmarketcap-API gibt an, dass die Daten nur einmal alle 5 Minuten aktualisiert werden. Es macht also keinen Sinn, die neuesten Preisinformationen häufiger neu zu laden

  • Wenn Ihre App zu viele Anforderungen an die Coinmarketcap-API sendet, wird Ihre IP möglicherweise gesperrt oder vorübergehend gesperrt.

Aus diesem Grund müssen wir mindestens 5 Minuten lang „schlafen gehen“ (die Ausführung der Schleife stoppen), bevor wir neue Daten erhalten. Der folgende Code implementiert alle erforderlichen Funktionen, die ich oben angegeben habe:

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)

Wir sind fast fertig! Es fehlt nur noch die Funktionformat_bitcoin_history. Es nimmtbitcoin_history als Argument und formatiert es mit einigen der grundlegenden HTML-Tags, die von Telegramm zugelassen werden, wie<br>,<b>,<i> usw. Kopieren Sie diese Funktion über die Funktionmain:

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)

So sollte das Endergebnis auf Ihrem Telefon aussehen:

Python + IFTTT: Bitcoin Telegram

Führen Sie zum Ausführen Ihrer Preisbenachrichtigungs-App Folgendes in Ihrem Befehlszeilenterminal aus:

$ python bitcoin_notifications.py

Das ist es! In etwas mehr als 50 Zeilen Python-Code haben Sie Ihren eigenen Bitcoin-Benachrichtigungsdienst erstellt. Herzliche Glückwünsche! Unten habe ich den gesamten Code hinzugefügt, damit Sie vergleichen und sehen können, ob Sie etwas verpasst haben:

Rückblick und nächste Schritte

In diesem Artikel haben wir unseren eigenen Bitcoin-Benachrichtigungsdienst erstellt. Sie haben gelernt, wie Sie HTTP-GET- und POST-Anforderungen mit dem Paketrequestsenden. Sie haben gesehen, wie einfach es war, Ihre Python-App mithilfe von IFTTT und Webhooks mit externen Diensten zu verbinden.

Wohin solltest du als nächstes gehen? Bei Python und IFTTT ist der Himmel die Grenze. Aber hier sind einige Vorschläge, die Ihnen den Einstieg erleichtern können:

  • Wie Tabellenkalkulationen? Verwenden Sie eine IFTTT-Aktion, mit der die Bitcoin-Preise zu einer Google-Tabelle hinzugefügt werden

  • Verbessern Sie die Bedingung vonif price < BITCOIN_PRICE_THRESHOLD, um die Benachrichtigung nur einmal pro Tag zu erhalten (andernfalls wird es ziemlich ärgerlich, wenn Bitcoin konstant niedrig ist).

  • Wie Ethereum / Litecoin / Dogecoin besser? Ändern Sie dieget_latest_bitcoin_price inget_latest_cryptocurrency_price, die eine Kryptowährung als Parameter verwenden und ihren Preis zurückgeben

  • Sie möchten den Preis in einer anderen Währung? Überprüfen Sie die Coinmarketcap-API auf den Parameterconvert.

Dies wird auch eine fortlaufende Reihe mit weiteren Python-Projekten sein, die Sie erstellen können, um Ihre Fähigkeiten zu erweitern. Verpassen Sie nicht das nächste Tutorial:

Get Notified: Verpassen Sie nicht das Follow-up zu diesem Tutorial - https://realpython.com/bonus/newsletter-dont-miss-updates/ [Klicken Sie hier, um am Real Python Newsletter teilzunehmen] und Sie werden wissen, wann Die nächste Rate kommt heraus.

Viel Glück und Happy Pythoning! Lassen Sie mich in den Kommentaren unten wissen, was Sie mit Python und IFTTT erstellt haben!