Recherche de site Web

Comment créer un cryptobot en Python et le connecter à Facebook Messenger


par Paul Pinard

Rencontrez Sato le Cryptobot, capable d'extraire n'importe quel prix de crypto-monnaie à partir d'une API externe !

Les chatbots ont un potentiel incroyable. Pourtant, pour que les robots soient efficaces, ils doivent intégrer et échanger des données avec les services et processus existants.

La possibilité de récupérer des données à partir d'une API externe permet des cas d'utilisation plus complexes qu'une simple logique de questions-réponses. De plus, cette capacité combinée à la PNL offre encore plus d’opportunités.

Par exemple, Sato – le cryptobot que nous allons construire aujourd’hui – est capable de reconnaître toutes les crypto-monnaies, même celles qui ne sont pas encore répertoriées. Je n’aurai rien à faire pour qu’il puisse traiter les requêtes sur les cryptos qui apparaîtront dans quelques années, car Sato, au fond, a compris ce qu’est un symbole de cryptomonnaie (après avoir été nourri avec des milliers d’entre eux).

Que construisons-nous aujourd’hui ?

À la fin de ce didacticiel, nous disposerons d'un robot capable de récupérer des données à partir d'une API tierce en fonction de ce que nos utilisateurs saisissent, et d'y répondre avec la valeur récupérée. Voici le résultat final de ce que nous allons construire aujourd’hui : un cryptobot, également appelé chatbot, capable d’obtenir n’importe quel prix de cryptomonnaie.

Pressé? Voici tout ce dont vous avez besoin pour créer le vôtre :

  • Un chatbot créé avec SAP Conversational AI. Inscrivez-vous ici, c'est totalement gratuit !
  • Le dépôt GitHub

Besoin de le voir pour le croire ? C'est sage ! Cliquez ici!

Ou si vous préférez comprendre comment cela a été réalisé, suivez le tutoriel.

1. Construisez la base de votre chatbot : choisissez votre chemin

L’objectif aujourd’hui est de créer un robot capable de reconnaître une question sur le prix de n’importe quelle crypto-monnaie. Laissez libre cours à votre imagination, il peut s'agir de tout ce qui concerne les données disponibles sur des API tierces.

Avant de plonger dans le didacticiel, permettez-moi de vous donner quelques informations sur le fonctionnement de Sato.

Rencontrez Sato, le cryptobot

Sato est un robot conçu pour répondre aux questions de base sur les crypto-monnaies et récupérer leurs prix. Voici un aperçu de ce qu’il peut faire :

  1. Récupérer les prix des crypto-monnaies (ce que nous allons construire aujourd'hui) : Sato reconnaît le symbole des crypto-monnaies (« ETH », « BTC ») et récupère leur prix sur l'API de comparaison de crypto-monnaie pour enfin restituer la valeur BTC et USD à l'utilisateur.
  2. Répondez aux questions des utilisateurs sur les portefeuilles : portefeuilles en ligne, portefeuilles d'échange, portefeuilles froids et portefeuilles matériels.
  3. Répondez aux questions sur les clés privées et publiques ainsi que sur la sécurité des crypto-monnaies.
  4. Présentez brièvement les principales cryptomonnaies, actuellement BTC, ETH, BCH et LTC.

À l'intérieur de Sato

Aujourd’hui, nous allons nous concentrer sur la compétence permettant de récupérer les prix des cryptomonnaies, car cela nécessite un appel API externe. Essentiellement, Sato a besoin de trois éléments pour pouvoir détecter une question sur le prix de la cryptographie et renvoyer la valeur demandée :

Premièrement, il a besoin d’une intention (@crypto_price) avec diverses expressions et crypto-monnaies mentionnées, afin de pouvoir reconnaître efficacement ces questions. Voici quelques-unes des expressions utilisées pour définir l'intention @crypto_price :

Deuxièmement, pour que Sato soit capable de reconnaître toutes les crypto-monnaies, il aura besoin de la plus grande liste possible. J'en ai trouvé plus de 1 200 sur CoinMarketCap, ce qui est suffisant pour commencer. J'ai créé une gazette des noms de crypto pour améliorer sa compréhension.

Troisièmement, nous devrons créer une compétence qui se déclenche lorsque l'intention @ask_price ou l'entité #crypto_name est reconnue :

Vous pouvez également ajouter #crypto_name comme condition requise, pour vous assurer qu'aucune API appelée n'est déclenchée sans paramètres :

Cette compétence doit également appeler votre webhook que nous allons configurer ci-dessous :

N'oubliez pas d'ajouter une réinitialisation de la mémoire après le déclenchement du webhook, il est nécessaire de nettoyer la mémoire après chaque réponse.

Enfin, nous testerons notre bot directement dans Messenger, vous devrez donc créer une page et une application et les connecter. Tout est documenté dans l'onglet CONNECT et dans le tutoriel de démarrage.

Par souci de concision, ce tutoriel ne détaillera pas la création d'un bot. Nous allons déjà partir d’un bot fonctionnel.

Pour m'y rencontrer, vous avez deux options :

  • Option A : créez votre propre bot (qui n'a pas besoin d'être un cryptobot) en suivant le didacticiel de démarrage et en créant un compte sur SAP Conversational AI.
  • Option B : fourchez Sato et commencez à partir d'ici. C'est pourquoi SAP Conversational AI est une plateforme de chatbot collaborative. Cela fonctionne à peu près comme GitHub !

2. Code du serveur de base et exigences

Puisque nous voulons interagir avec notre bot, nous aurons besoin d'un serveur pour pouvoir recevoir les résultats du NLP réalisé par SAP Conversational AI et renvoyer nos réponses.

Sur le générateur de bot, accédez à l'onglet CODE pour trouver un exemple de code de base requis pour démarrer votre API. Nous donnons des exemples en Node.JS, PHP, Python et Ruby. Ce tutoriel sera uniquement Python.

Voici le code de base pour Python :

from flask import Flask, request, jsonify import json app = Flask(__name__) port = '5000' @app.route('/', methods=['POST']) def index():   print(json.loads(request.get_data()))   return jsonify(     status=200,     replies=[{       'type': 'text',       'content': 'Roger that',     }]  )  @app.route('/errors', methods=['POST']) def errors():   print(json.loads(request.get_data()))   return jsonify(status=200)  app.run(port=port)

Prenez le temps de regarder le code pour mieux comprendre ce que nous allons faire : nous allons nous appuyer sur ce code au cours de ce tutoriel. Vous pouvez l'enregistrer dans votre éditeur de texte préféré pour le moment.

Exigences

Comme vous pouvez le voir, le script serveur utilise Flask comme framework Web, nous en aurons donc besoin.

Pour l’appel API, nous utiliserons également les requêtes. Allons-y et installons les deux :

pip install Flaskpip install requests

3. Testez le serveur : NGROK

Maintenant que nous avons le serveur de base, faisons-le fonctionner et testons-le. Cela nous permettra d'être plus incrémentiels dans le processus afin que le débogage (le cas échéant) soit simplifié.

Pour exposer notre serveur local à Internet, nous aurons besoin de ngrok.

Remarque : si vous utilisez Windows comme moi, il existe un superbe gestionnaire de paquets, Chocolatey, qui fonctionne à peu près comme apt-get sous UNIX. Avec lui, vous pourrez installer ngrok en une seule ligne choco install ngrok_portable. De plus, Chocolatey ajoute ngrok à votre PATH, vous permettant de démarrer ngrok depuis n'importe quel terminal en tapant simplement ngrok.

Il est maintenant temps de démarrer notre serveur et de le tester, cela implique :

  1. Définir un déclencheur webhook dans votre bot (détaillé à l'étape 1)
  2. Exécutez votre script python
  3. Exposez le port 5000 à Internet avec ngrok : ngrok http 5000
  4. Copiez le formulaire d'URL de transfert ngrok et collez-le comme URL de base de votre bot sur SAP Conversational AI

4. Préparation de l'appel API externe

Il est temps de commencer à construire ! Jetons un coup d'œil à l'appel API que nous effectuerons pour obtenir le prix de n'importe quelle crypto-monnaie. Plusieurs API sont disponibles à cet effet, j'ai donc décidé d'en choisir une : l'API Cryptocompare.

L’API Cryptocompare offre des milliers de possibilités, mais par souci de simplicité, nous nous en tiendrons aux bases. Nous voulons le prix de la crypto correspondante en BTC, USD et EUR.

Voici comment l’appel est structuré (ici pour ETH) :

https://min-api.cryptocompare.com/data/price?fsym="ETH"&tsyms=BTC,USD,EUR"

Vous avez deux paramètres :

  • fsym : le symbole de la cryptomonnaie, c'est ici qu'il faudra récupérer le crypto_name reconnu dans l'entité #crypto_name.
  • tsyms : la devise dans laquelle le prix sera renvoyé. Nous avons choisi ici BTC, USD et EUR.

Ainsi, dans notre cas, il nous suffira d’adapter le paramètre fsym à la cryptomonnaie reconnue, le reste de l’appel restant le même.

5. Adaptez l'appel API pour inclure le symbole reconnu dans la saisie utilisateur

Maintenant que nous savons comment récupérer les prix, nous devons revenir au code de notre serveur et le mettre à niveau afin qu'il puisse :

  • Connaissez le #crypto_name reconnu par SAP Conversational AI.
  • Effectuez un appel API à Cryptocompare en utilisant le #crypto_name.

Commençons!

Étape 1 : Trouver nos données dans SAP Conversational AI JSON

Jetons un coup d'œil aux données renvoyées par SAP Conversational AI sur une entrée utilisateur. Pour cela, vous cliquez sur le bouton CHAT AVEC VOTRE BOT présent sur toutes les pages, dans le coin inférieur droit. Ensuite, vous pouvez basculer entre la conversation et la vue JSON en cliquant sur le cercle d'information orange comme ci-dessous :

Ici, notre symbole est accessible avec ['conversation']['memory']['crypto']['raw']. Puisque la valeur et le brut sont identiques dans ce cas, vous pouvez utiliser l'un ou l'autre.

Sur notre serveur, le JSON renvoyé par le panel de test du site est encapsulé dans le dictionnaire data (voir code serveur). Il nous faut donc une étape supplémentaire pour le récupérer sur notre serveur :

# FETCH THE CRYPTO NAMEcrypto_name = data['conversation']['memory']['crypto']['value']

Étape 2 : Effectuer un appel API à l'aide de l'entité reconnue

import requestsr = requests.get("https://min-api.cryptocompare.com/data/price?fsym="+crypto_name+"&tsyms=BTC,USD,EUR")

Allez-y, imprimez-le, mais vous pourriez être déçu :

En effet, si vous souhaitez récupérer les valeurs renvoyées par l'appel, vous devez imprimer r.json(). La bonne nouvelle est que le JSON renvoyé par Cryptocompare est vraiment aussi simple qu'il pourrait l'être :

Super! Il ne nous reste plus qu'une dernière étape à comprendre : renvoyer les prix à l'utilisateur.

Étape 3 : renvoyer les données récupérées à l'utilisateur

Il est maintenant temps de terminer la mise à niveau du code de notre serveur de base : nous devons modifier les réponses renvoyées pour inclure nos données fraîchement récupérées. Pour ce faire, nous allons éditer le message renvoyé par notre code serveur :

return jsonify(     status=200,     replies=[{       'type': 'text',       'content': 'Roger that',     }],

Nous modifierons uniquement les réponses, pour inclure les prix que nous avons récupérés :

replies=[{      'type': 'text',      'content': 'The price of %s is %f BTC and %f USD' % (crypto_name, r.json()['BTC'], r.json()['USD'])    }],

Puisque la réponse est une chaîne, nous devons utiliser l'opérateur modulo (%) pour inclure nos prix dans la chaîne. Ici, le premier %s indique à Python de rechercher une chaîne tandis que les deux %f suivants indiquent des flottants.

Notre serveur mis à jour est maintenant terminé, voici l'intégralité du code :

from flask import Flask, request, jsonifyimport jsonimport requestsapp = Flask(__name__)port = '5000'@app.route('/', methods=['POST'])def index():  data = json.loads(request.get_data())  # FETCH THE CRYPTO NAME  crypto_name = data['conversation']['memory']['crypto']['raw']  # FETCH BTC/USD/EUR PRICES  r = requests.get("https://min-api.cryptocompare.com/data/price?fsym="+crypto_name+"&tsyms=BTC,USD,EUR")  return jsonify(    status=200,    replies=[{      'type': 'text',      'content': 'The price of %s is %f BTC and %f USD' % (crypto_name, r.json()['BTC'], r.json()['USD'])    }]  )@app.route('/errors', methods=['POST'])def errors():  print(json.loads(request.get_data()))  return jsonify(status=200)app.run(port=port)

Notre nouveau serveur étant terminé, nous avons désormais toutes les pièces de notre puzzle. Assemblons-le :

  1. Exécutez votre script python,
  2. Exposez le port 5000 à Internet avec ngrok : ngrok http 5000,
  3. Copiez le formulaire d'URL de transfert ngrok et collez-le comme URL de base de votre bot sur SAP Conversational AI

Maintenant que vous avez les bases pour créer un bot capable de récupérer des données tierces, que va-t-il être ? Vous nous montrez !

PS : Puisque ce tutoriel utilise ngrok, votre ordinateur doit être allumé et ngrok doit être en cours d'exécution pour que votre bot fonctionne.

Publié initialement sur le blog SAP Conversational AI.

Articles connexes