Krypto-Kurse tracken mit Python

Heute schreiben wir ein einfaches Python-Skript, mit dem wir den Kurs von beliebigen Kryptowährungen beobachten können. Das Skript wird aller paar Sekunden nach dem aktuellen Kurs schauen. Und sobald der Kurs einen bestimmten Wert übersteigt, werden wir benachrichtigt. Schauen wir uns an, wie’s funktioniert

Unsere Datenquelle

Unsere Daten können wir aus verschiedenen Quellen beziehen. Wir nutzen für unser Skript coinapi.io. Dort kann man sich kostenlos anmelden und hat dann Zugriff auf allerhand nützliche Daten.

Sobald wir uns angemeldet haben, wird uns ein eigener API-Key per E-Mail zugeschickt. Und der ermöglicht es uns, dass Python mit coinapi.io kann.

Eine API-Anfrage stellen

Wir können mit unserem API-Key nun Anfragen an coinapi stellen. Dafür nutzen wir das Modul requests. Das können wir bequem über das Terminal installieren.

pip3 install requests

Alles, was wir über die API von coinapi.io wissen müssen, finden wir in deren Dokumentation. Aus dieser Dokumentation suchen wir nun die passende Anfrage heraus. Ich zeig euch hier mal exemplarisch wie ihr den Bitcoin-Kurs in USD auslesen könnt, das funktioniert aber mit jeder beliebigen Krypowährung genaus so.

In unserem Fall wollen wir also auf die Markt-Daten zugreifen, genauer gesagt auf einen bestimmten Wechselkurs. Deshalb wähle ich aus den Market-Data den Bereich Get spefic rate aus.

Die Dokumentation enthält bereits eine passende Anfrage.

Oben rechts kann ich mir den entsprechenden Quellcode in verschiedenen Programmiersprachen anzeigen lassen. Ich schnappe mir den Python-Code und nehme ihn mit in mein Skript.

import requests # das Skript wird importiert
url = 'https://rest.coinapi.io/v1/exchangerate/BTC/USD' # diese URL wird bei der Anfrage aufgerufen
headers = {'X-CoinAPI-Key' : '73034021-THIS-IS-SAMPLE-KEY'} # unser API-Key wird mitgegeben
response = requests.get(url, headers=headers) # wird starten die Anfrage

Der API-Key stimmt jetzt natürlich noch nicht. Deshalb füge ich meinen persönlichen Key jetzt in das Skript ein. Den habe ich ja bereits per E-Mail bekommen.

Das sollte jetzt auch schon funktionieren. Um herauszufinden, was uns für Daten zurückgegeben werden, lass ich mir die entsprechende Antwort ausgeben.

print(response.text)

Aus der Antwort interessiert uns jetzt eigentlich nur ein Wert, und zwar der aktuelle Kurs. Und genau den lesen wir nun aus.

current_rate = response.json()['rate']
print(current_rate)

Und damit haben wir jetzt schon unsere erste Funktion. Ich gebe meiner Funktion einen Namen und rücke den Quellcode ein, sodass er in der Funktion hinterlegt ist. Und ganz am Ende der Funktion lasse ich mir den Wert mit dem Schlüsselwort return zurückgeben.

def get_current_rate():
    url = 'https://rest.coinapi.io/v1/exchangerate/BTC/USD'
    headers = {'X-CoinAPI-Key' : 'yyyyyyxxxxxxxxyyyyyyyyxxxxx'
    response = requests.get(url, headers=headers)
    
    current_rate = response.json()['rate']
    return current_rate

Bitcoin-Kurs tracken

Als nächstes wollen wir den Kurs vergleichen und benachrichtigt werden, wenn der Kurs eine bestimmte Marke übersteigt. Auch das tun wir in einer eigenen Funktion. Den Zielwert, auf den wir warten wollen, hinterlegen wir gleich mal in einer eigenen Variable. Und sobald dieser Zielerwert erreicht wird, wollen wir dann benachrichtigt werden.

goal_rate = 65000
def compare_current_rate_with_goal():
    current_rate = get_current_rate()

    if current_rate >= goal_rate:
        notify_user()

    print(f'Aktueller Kurs: {round(current_rate)} USD')

Eine Benachrichtigung einrichten

Die Benachrichtigung des Nutzers kann jetzt auf ganz viele verschiedene Weisen erfolgen. Ich kann mir z.B. Benachrichtigungen per Mail oder per Telegram schicken lassen. Entsprechende Tutorials dazu verlinke ich euch in der Videobeschreibung. Wir machen das jetzt aber mal etwas einfacher. Und zwar soll einfach ein Soundeffekt abgespielt werden und eine Nachricht im Terminal angezeigt werden.

Zum Abspielen von Sounds können wir das Modul simpleaudio verwenden. Das funktioniert auf allen Plattformen und ist ziemlich einfach zu bedienen.

pip3 install simpleaudio
import simpleaudio

Wo wir den Soundeffekt jetzt hernehmen, ist im Prinzip egal. Es gibt online ja eine Menge kostenloser Quellen für Soundeffekte, die wir für solche Projekte nutzen können. Oder ihr macht es wie ich und nervt eure Freundin so lange, bis sie mit euch gemeinsam eine kleine Aufnahmesession macht. Wir haben uns dafür einfach ein Glas geschnappt und ein paar Münzen reingeschmissen. Das Ganze habe wir einfach mit meinem China-Handy aufgenommen und schon hatten wir einen hübschen und vor allem copyrightfreien Soundeffekt.

Den aufgenommenen Soundeffekt nehme ich dann und lege ihn in meinem Projektordner ab. Das mache ich idealerweise in einem Unterordner, damit das Projekt übersichtlich bleibt.

Anschließend lege ich die Funktion an, die den Nutzer benachrichtigt und den Soundeffekt abspielt.

def notify_user():
    print(f'Der Kurs hat die Zielmarke von {goal_rate} USD erreicht!')

    wave_object = simpleaudio.WaveObject.from_wave_file('./sounds/coins.wav')
    play_object = wave_object.play()
    play_object.wait_done()
    exit()

Funktion in Schleife ausführen

Unser Programm hat jetzt an sich alles was es braucht. Als letztes basteln wir jetzt noch eine kleine Schleife, die sich auf die Lauer legt und regelmäßig für uns den Kurs checkt. Dafür importieren wir uns die Funktion time.sleep().

from time import sleep

Und mit der schreiben wir jetzt eine Schleife, die z.B. aller 5 Sekunden den Kurs checkt.

def track_rate():

    while True:
        print('\nTracke Bitcoin-Kurs...')
        compare_current_rate_with_goal()
        sleep(5)

Wichtig ist hier allerdings zu wissen, dass wir pro Tag 100 API-Anfragen kostenlos stellen können. Deshalb ist es empfehlenswert, in unsere Sleepfunktion eine wesentlich größere Sekundenanzahl anzugeben. Für jetzt ist 5 Sekunden aber erstmal okay – so könnt ihr gut sehen, wie das Programm arbeitet.

Und zu guter Letzt legen wir jetzt noch fest, dass diese Funktion immer aufgerufen werden soll, wenn wir das Skript direkt aufrufen. Dafür nutzen wir die if __name__ == „__main__“ Funktion.

if __name__ == "__main__":
    track_rate()

Und damit haben wir es geschafft.

✅ Kompletter Quellcode

import requests
import simpleaudio
from time import sleep


goal_rate = 65000


def get_current_rate():
    url = 'https://rest.coinapi.io/v1/exchangerate/BTC/USD'
    headers = {'X-CoinAPI-Key' : '_____________________________'}
    response = requests.get(url, headers=headers)

    current_rate = response.json()['rate']
    return current_rate


def notify_user():
    print(f'Der Kurs hat die Zielmarke von {goal_rate} USD erreicht!')

    wave_object = simpleaudio.WaveObject.from_wave_file('./sounds/coins.wav')
    play_object = wave_object.play()
    play_object.wait_done()

    exit()


def compare_current_rate_with_goal():
    current_rate = get_current_rate()

    if current_rate >= goal_rate:
        notify_user()

    print(f'Aktueller Kurs: {round(current_rate)} USD')


def track_rate():

    while True:
        print('\nTracke Bitcoin-Kurs...')
        compare_current_rate_with_goal()
        sleep(3)


if __name__ == "__main__":
    track_rate()