Projet Python pour débutants: Notifications de prix Bitcoin

Projet Python pour débutants: Notifications de prix Bitcoin

Bienvenue dans le premier article d'une série d'articles sur les projets Python pour les débutants!

Dans ce didacticiel, nous allons créer un service de notification de prix Bitcoin—

Au cours de ce projet, vous découvrirez les requêtes HTTP et comment les envoyer à l'aide du package (correctement nommé)requests.

Vous allez découvrir les webhooks et comment les utiliser pour connecter votre application Python à des services externes, tels que les notifications téléphoniques ou les messages Telegram.

Avec relativement peu de code (~ 50 lignes), vous allez arriver à un service de notification de prix Bitcoin à part entière qui sera facilement extensible à d'autres crypto-monnaies et services.

Alors, allons droit au but:

Notifications de prix Bitcoin avec Python

Comme nous le savons tous, le prix du Bitcoin est une chose inconstante. On ne sait jamais vraiment où ça va être à la fin de la journée. Donc, au lieu de vérifier constamment sur divers sites les dernières mises à jour, créons une application Python pour faire le travail pour vous.

Pour cela, nous allons utiliser le site Web d'automatisation populaireIFTTT. IFTTT («si ceci, alors cela») est un service Web qui comble le fossé entre les différentes applications et appareils.

Nous allons créer deux applets IFTTT:

  • Un pour la notification d'urgence lorsque le prix du Bitcoin tombe sous un certain seuil; et

  • un autre pour les mises à jour régulières deTelegram sur le prix Bitcoin.

Les deux seront déclenchés par notre application Python qui consommera les données desCoinmarketcap API.

Une applet IFTTT est composée de deux parties: un déclencheur et une action.

Dans notre cas, le déclencheur sera un service de webhook fourni par IFTTT. Vous pouvez considérer les webhooks comme des «callbacks HTTP définis par l'utilisateur» et en savoir plus sur euxhere.

Notre application Python fera une requête HTTP à l'URL du webhook qui déclenchera une action. Maintenant, c'est la partie amusante - l'action pourrait être presque tout ce que vous voulez. IFTTT propose une multitude d'actions comme l'envoi d'un e-mail, la mise à jour d'une feuille de calcul Google et même l'appel de votre téléphone.

Configuration du projet

Commençons par configurer unvirtual environment. Exécutez cette commande pour obtenir un nouvel environnement virtuel Python 3:

$ mkvirtualenv -p $(which python3) bitcoin_notifications

Avant de continuer, vous devez activer l'environnement virtuel et installer les dépendances requises:

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

Vous pouvez désactiver l'environnement virtuel en exécutant la commande shelldeactivate.

Récupération du prix du Bitcoin

Il est temps de se salir les mains. Nous pouvons commencer par obtenir le dernier prix de l'API Coinmarketcap dans la console Python:

Tout d'abord, nous devons importer le modulerequests et définir la variablebitcoin_api_url qui contient l'URL de l'API Coinmarketcap pour Bitcoin.

Ensuite, nous envoyons une requête HTTP GET à l'URL en utilisant la fonctionrequests.get() et enregistrons la réponse. Puisque l'API renvoie une réponse JSON, nous pouvons la convertir en objet Python en appelant la fonction.json() sur la réponse. Comme vous pouvez le voir, l'API a renvoyé une liste avec un élément contenant les données de prix Bitcoin:

>>>

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

La propriété qui nous intéresse le plus est'price_usd', le prix du Bitcoin en dollars américains.

Envoi d'une notification IFTTT de test

Nous pouvons maintenant passer du côté IFTTT. Pour utiliser IFTTT, vous devez d'abordset up a new account et installer leur application mobile (si vous souhaitez recevoir des notifications téléphoniques de votre application Python). Une fois que vous avez configuré cela, nous allons àcreate une nouvelle applet IFTTT pourtesting purposes.

Pour créer une nouvelle applet de test, procédez comme suit:

  1. Cliquez sur le gros bouton“this”

  2. Recherchez le service“webhooks” et sélectionnez le déclencheur“Receive a web request”

  3. Nommons l'événementtest_event

  4. Sélectionnez maintenant le gros bouton“that”

  5. Recherchez le service“notifications” et sélectionnez les“Send a notification from the IFTTT app”

  6. Changez le message enI just triggered my first IFTTT action! et cliquez sur“Create action”

  7. Cliquez sur le bouton“Finish” et nous avons terminé

Pour voir la documentation sur l'utilisation des webhooks IFTTT, accédez à cepage et cliquez sur le bouton“Documentation” dans le coin supérieur droit. La page de documentation contient l'URL du webhook et ressemble à ceci:

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

Ensuite, vous devrez remplacer la partie{event} par le nom que vous avez donné à notre événement à l'étape 3, lorsque vous avez créé l'applet. La partie{your-IFTTT-key} est déjà remplie avec votre clé IFTTT.

Copiez maintenant l'URL du webhook et démarrez une autre console Python. Encore une fois, nous importons le modulerequests et définissons la variable URL du webhook. Il ne nous reste plus qu'à envoyer une requête HTTP POST à ​​l'URL du webhook IFTTT en utilisant la fonctionrequests.post():

>>>

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

Après avoir exécuté la dernière ligne, vous devriez voir une notification sur votre téléphone:

Python + IFTTT: Test Notification

Création d'applets IFTTT

Maintenant, nous sommes enfin prêts pour la partie principale. Avant de commencer avec le code, nous devons créer deux nouvelles applets IFTTT: une pour les notifications de prix Bitcoin d'urgence et une pour les mises à jour régulières.

Applet de notification de prix Bitcoin d'urgence:

  1. Choisissez le service“webhooks” et sélectionnez le déclencheur“Receive a web request”

  2. Nommez l'événementbitcoin_price_emergency

  3. Pour l'action sélectionnez le service“Notifications” et sélectionnez l'action“Send a rich notification from the IFTTT app”

  4. Donnez-lui un titre, comme“Bitcoin price emergency!”

  5. Définissez le message surBitcoin price is at ${{Value1}}. Buy or sell now! (nous reviendrons à la partie{{Value1}} plus tard)

  6. Vous pouvez éventuellement ajouter une URL de lien à la page Bitcoin Coinmarketcap:https://coinmarketcap.com/currencies/bitcoin/

  7. Créez l'action et terminez la configuration de l'applet

Applet de mises à jour régulières des prix:

  1. Choisissez à nouveau le service“webhooks” et sélectionnez le déclencheur“Receive a web request”

  2. Nommez l'événementbitcoin_price_update

  3. Pour l'action sélectionnez le service“Telegram” et sélectionnez l'action“Send message”

  4. Définissez le texte du message sur:Latest bitcoin prices:<br>{{Value1}}

  5. Créez l'action et terminez avec l'applet

Note: Lors de la création de cette applet, vous devrez autoriser le bot IFTTT Telegram.

Mettre tous ensemble

Maintenant que IFTTT est à l'écart, commençons à coder! Vous allez commencer par créer le squelette d'application en ligne de commande Python illustré ci-dessous. Prenez ce code et enregistrez-le dans un fichier appelébitcoin_notifications.py:

import requests
import time
from datetime import datetime

def main():
    pass

if __name__ == '__main__':
    main()

Ensuite, nous devons traduire les deux sessions de console Python précédentes en deux fonctions qui retourneront le dernier prix Bitcoin et publieront sur le webhook IFTTT respectivement. Ajoutez les fonctions suivantes au-dessus de la fonction principale:

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)

Leget_latest_bitcoin_price est à peu près le même, sauf pour la partie où nous devons convertir le prix d'une chaîne en un nombre à virgule flottante. Lepost_ifttt_webhook prend deux paramètres:event etvalue.

Le paramètreevent correspond au nom d'événement que nous avons donné à notre déclencheur lors de la configuration de l'applet IFTTT. De plus, les webhooks IFTTT nous permettent d'envoyer des données supplémentaires avec la demande sous forme de données au format JSON.

C’est pourquoi nous avons besoin du paramètrevalue: lors de la configuration de nos applets, nous avons laissé une balise{{Value1}} dans nos champs de message. Cette balise est remplacée par le texte'value1' de la charge utile JSON. La fonctionrequests.post() nous permet d'envoyer des données JSON supplémentaires simplement en ajoutant le mot cléjson.

Nous pouvons maintenant passer au cœur de notre application dans la fonctionmain. Il sera composé d'une bouclewhile True puisque nous voulons que notre application s'exécute pour toujours. Dans la boucle, nous appellerons l'API Coinmarketcap pour obtenir le dernier prix Bitcoin et enregistrer la date et l'heure actuelles.

Sur la base du prix actuel, nous déciderons si nous voulons envoyer une notification d'urgence. Pour nos mises à jour régulières de Telegram, nous ajouterons également le prix actuel et la date à une listebitcoin_history. Une fois que la liste atteint un certain nombre d'éléments (par ex. 5) nous formaterons les éléments, enverrons la mise à jour à Telegram et réinitialiserons l'historique pour les futures mises à jour.

Wheew! Comme vous pouvez le voir, il se passe beaucoup de choses dans cette application. Si vous rencontrez des problèmes pour suivre le code que nous avons obtenu jusqu'à présent, faites une pause rapide et relisez lentement la section ci-dessus. Ce n'est pas facile, alors prenez votre temps et ne vous inquiétez pas de tout rendre parfait la première fois.

Une chose importante est d'éviter d'envoyer ces demandes trop fréquemment, pour deux raisons:

  • l'API Coinmarketcap déclare qu'elle ne met à jour les données qu'une fois toutes les 5 minutes, il est donc inutile de recharger les dernières informations de tarification plus fréquemment que cela.

  • si votre application envoie trop de demandes à l'API Coinmarketcap, votre adresse IP pourrait être interdite ou temporairement suspendue.

C'est pourquoi nous devons «nous endormir» (arrêter l'exécution de la boucle) pendant au moins 5 minutes avant d'obtenir de nouvelles données. Le code ci-dessous implémente toutes les fonctionnalités requises que j'ai mentionnées ci-dessus:

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)

Nous avons presque fini! La seule chose qui manque est la fonctionformat_bitcoin_history. Il prend lebitcoin_history comme argument et le formate en utilisant certaines des balises HTML de base autorisées par Telegram, comme<br>,<b>,<i>, etc. Copiez cette fonction au-dessus de la fonctionmain:

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)

Voici à quoi devrait ressembler le résultat final sur votre téléphone:

Python + IFTTT: Bitcoin Telegram

Pour exécuter votre application de notification de prix, exécutez ce qui suit dans votre terminal de ligne de commande:

$ python bitcoin_notifications.py

C'est ça! En un peu plus de 50 lignes de code Python, vous avez créé votre propre service de notification Bitcoin. Toutes nos félicitations! Ci-dessous, j'ai ajouté le code entier afin que vous puissiez comparer et voir si vous avez oublié quelque chose:

Récapitulatif et prochaines étapes

Dans cet article, nous avons créé notre propre service de notification Bitcoin. Vous avez appris à envoyer des requêtes HTTP GET et POST à ​​l'aide du packagerequests. Vous avez vu à quel point il était facile de connecter votre application Python à des services externes à l'aide d'IFTTT et de webhooks.

Maintenant, où devriez-vous aller ensuite? Avec Python et IFTTT, le ciel est la limite. Mais voici quelques suggestions qui peuvent vous aider à démarrer:

  • Vous aimez les feuilles de calcul? Utilisez une action IFTTT qui ajoutera les prix du Bitcoin à une feuille de calcul Google

  • Améliorez la conditionif price < BITCOIN_PRICE_THRESHOLD pour ne recevoir la notification qu'une fois par jour (sinon cela deviendra assez ennuyeux si Bitcoin est toujours bas)

  • Vous aimez mieux Ethereum / Litecoin / Dogecoin? Changez lesget_latest_bitcoin_price enget_latest_cryptocurrency_price qui prendront une crypto-monnaie comme paramètre et renverront son prix

  • Vous voulez le prix dans une autre devise? Vérifiez l'API Coinmarketcap pour le paramètreconvert.

En outre, ce sera une série en cours avec plus de projets Python que vous pouvez créer pour développer vos compétences. Ne manquez pas le prochain tutoriel:

Get Notified: Ne manquez pas la suite de ce tutoriel - https: //realpython.com/bonus/newsletter-dont-miss-updates/ [Cliquez ici pour rejoindre la newsletter Real Python] et vous saurez quand le prochain épisode sort.

Bonne chance et Happy Pythoning! Faites-moi savoir ce que vous avez construit en utilisant Python et IFTTT dans les commentaires ci-dessous!