https://d226lax1qjow5r.cloudfront.net/blog/blogposts/build-a-whatsapp-currency-conversion-bot-with-node-js/blog_node-js_whatsapp_1200x600.png

Construire un robot de conversion de devises WhatsApp avec Node.js

Publié le May 11, 2021

Temps de lecture : 9 minutes

Dans ce tutoriel, nous allons voir comment construire un simple Chat Bot WhatsApp en utilisant Node.js et Vonage. Le Bot sera chargé de convertir tout nombre donné d'unités dans une devise de base à l'équivalent dans la devise préférée.

Le robot sera construit à l'aide de l'API Messages API de Vonage ainsi que Expressle framework Node.

Voici un exemple de conversation avec le robot :

Interacting with the finished bot

Conditions préalables

  • Node.js

  • Ngrok qui vous permet d'exposer votre serveur web local à l'internet. Pour en savoir plus sur la façon de configurer votre environnement local avec Ngrok, vous pouvez consulter notre documentation.

  • Soit un compte WhatsApp business, soit configurer le bac à sable de l'API Messages comme nous le ferons dans ce tutoriel pour mettre les numéros sur liste blanche.

Vonage API Account

To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.

Configurer votre application

Commencez par cloner le dépôt sur votre machine locale : https://github.com/Dotunj/vonage-whatsapp-bot.

Suivant cd dans le répertoire du projet et exécutez la commande suivante pour installer les dépendances du projet :

npm install

Construire le robot

Chaque fois que notre robot reçoit un message sur WhatsApp, Vonage envoie une requête HTTP Post à un point de terminaison. La demande contiendra une charge utile de message.

app.post("/webhooks/inbound-message", (req, res) => {
  eventEmitter.emit("inbound-message", req.body);
  return res.send("Received Webhook successfully");
});

Ci-dessus, nous avons défini une route à /webhooks/inbound-message qui émet l'événement inbound-message à l'aide du module Node.js Event, puis renvoie une réponse 200 à Vonage.

Le module Node.js Event comprend la classe EventEmitter qui est utilisée pour lever et gérer des événements. Pour en savoir plus sur la gestion et l'envoi d'événements dans Node.js ici.

eventEmitter.on("inbound-message", (body) => {
  performCurrencyConversion(body).catch((err) => console.log(err));
});

Chaque fois que l'événement inbound-message est émis, la méthode eventEmitter.on() est également déclenchée. Cette fonction enregistre une fonction d'écoute, qui invoque simplement la méthode performCurrencyConversion() en lui transmettant la charge utile du message.

function standardResponse() {
  let response = "Welcome to the WhatsApp Bot For Currency Conversion \n";
  response += "Please use the following format to chat with the Bot \n";
  response += "Convert 5 USD to CAD \n";
  response +=
    "Where 5 is the number of units to convert, USD is the base currency and CAD is the currency you would like to convert to.";
  return response;
}

La fonction standardResponse est une réponse générique qui indique à l'utilisateur comment communiquer avec le robot.

La méthode performCurrencyConversion() est chargée de déchiffrer le contenu du message envoyé au bot et d'envoyer une réponse à l'utilisateur.

Le contenu du message reçu est converti en un tableau à l'aide de la fonction split(). Sur la base du format de messagerie convenu, le nombre d'éléments contenus dans le tableau devrait être de 5.

Si le contenu du message a été divisé en un tableau et que le nombre d'éléments contenus dans ce tableau est inférieur à 5, une réponse standard est envoyée à l'utilisateur pour l'informer de la manière d'utiliser le robot.

Si la vérification de la longueur du contenu du message est réussie, nous pouvons maintenant supposer que les éléments contenus dans les index 1, 2 et 4 du tableau seront les unités, la devise de base et la devise que vous souhaitez convertir.

Convertir avec Coinbase

Maintenant que nous avons la devise de base et la devise vers laquelle vous convertissez, nous pouvons vérifier que ces codes de devises sont valides et pris en charge par Coinbase.

L'API de Coinbase fournit des points de terminaison pour traiter les devises ainsi que les taux de change. Pour en savoir plus sur l Coinbase API ici.

async function getCurrencyCode(baseCurrency, toCurrency) {
  try {
    const currency = await axios.get(`${coinbaseUrl}/currencies`);
    const currencyCode = currency.data.data;
    const isSupportedCurrencyCodes = currencyCode.filter(
      (c) => c.id === baseCurrency || c.id === toCurrency
    );
    if (isSupportedCurrencyCodes.length < 2) return;
    return isSupportedCurrencyCodes;
  } catch (error) {
    console.error(error);
  }
}

C'est là que la fonction getCurrencyCode() entre en jeu.

Il accepte les baseCurrency ainsi que le toCurrency et fait ensuite un appel à l'API https://api.coinbase.com/v2/currencies pour obtenir une liste de toutes les devises prises en charge. Une vérification est ensuite effectuée pour s'assurer que les éléments baseCurrency et le code toCurrency se trouvent dans la liste des monnaies prises en charge.

Si aucun de ces codes n'est trouvé, une réponse est envoyée à l'utilisateur pour l'informer qu'il doit fournir un code monétaire valide.

Ensuite, après avoir validé les codes des devises avec la fonction getCurrencyCode() la méthode getBaseExchangeRate() est appelée.

async function getBaseExchangeRate(baseCurrency, toCurrency) {
  try {
    const response = await axios.get(
      `${coinbaseUrl}/exchange-rates?currency=${baseCurrency}`
    );
    const rates = response.data.data.rates;
    const baseRate = rates[toCurrency];
    return baseRate;
  } catch (error) {
    console.error(error);
  }
}

Cette méthode accepte le baseCurrency ainsi que le toCurrency également.

Un appel à l'API est alors effectué vers le point de terminaison https://api.coinbase.com/v2/exchange-rates en transmettant le code baseCurrency comme valeur du paramètre currency paramètre de la requête.

Ce point de terminaison renvoie les taux pour une unité de la devise de base. Ensuite, il suffit de renvoyer le taux équivalent pour la devise toCurrency.

Voici un exemple de la réponse reçue lors de l'appel au point de terminaison en utilisant USD comme élément de réponse. baseCurrency:

"data": {
        "currency": "USD",
        "rates": {
            "AED": "3.673015",
            "AFN": "77.06341",
            "ALGO": "1.5885623510722797",
            "ALL": "104.873298",
            "AMD": "481.616228",
            "ANG": "1.794578",
            "AOA": "589.0",
            "ARS": "73.1365",
            ...

Après avoir obtenu le taux de base, il suffit de multiplier les unités par le taux de base pour obtenir le montant équivalent dans la devise que l'utilisateur essaie de convertir, puis d'arrondir la valeur à deux décimales. Une réponse est ensuite envoyée à l'utilisateur pour l'informer du taux de change.

La fonction sendWhatsAppMessage() envoie une réponse à l'utilisateur via WhatsApp.

Une requête HTTP POST est envoyée au point d'accès https://messages-sandbox.nexmo.com/v0.1/messages en spécifiant l'élément from, to, et message sont spécifiés.

Le champ from est le numéro de l'API Sandbox de WhatsApp. Je vous montrerai bientôt comment l'obtenir et nous l'ajouterons à nos variables d'environnement. Le champ to est le numéro qui a envoyé le message initial et il est obtenu à partir de la charge utile du message.

Pour s'authentifier auprès de l'API, nous spécifions notre clé API Vonage ainsi que notre clé secrète. De même, nous obtiendrons bientôt ces valeurs et les ajouterons à nos variables d'environnement.

Mise en place de Ngrok

Comme notre application est actuellement locale, il n'y a aucun moyen pour Vonage d'envoyer des requêtes POST au point de terminaison que nous venons de créer chaque fois que notre Bot reçoit un message. Nous pouvons utiliser Ngrok pour mettre en place une URL publique temporaire afin que notre application soit accessible sur le web.

Pour démarrer l'application, exécutez la commande suivante à partir du terminal :

node index.js

Une fois l'application lancée, exécutez la commande suivante dans une seconde fenêtre de terminal pour démarrer ngrok :

ngrok http 3000

Dans cette commande, 3000 fait référence au port sur lequel votre application Express est actuellement à l'écoute.

Un écran similaire à celui ci-dessous devrait s'afficher :

Ngrok

Prenez note de la deuxième URL de transfert, car c'est elle qui sera utilisée pour configurer notre crochet Web de Vonage.

Configurer l'Environnement de test de WhatsApp

Nous utiliserons la Vonage WhatsApp Sandbox pour cette démonstration, car votre entreprise doit être approuvée par WhatsApp avant de pouvoir utiliser son API en production.

Rendez-vous dans l'API Sandbox de Messages pour mettre votre numéro WhatsApp sur liste blanche afin que nous puissions tester le robot.

The WhatsApp Sandbox

Pour ajouter votre Numbers WhatsApp afin de pouvoir commencer à recevoir et envoyer des messages, vous pouvez scanner le code QR via WhatsApp ou cliquer sur le lien qui vous est présenté et appuyer sur envoyer sur le message pré-rempli. Prenez note du numéro de bac à sable WhatsApp car nous l'ajouterons à notre variable d'environnement sous peu.

Ensuite, sur le même écran, configurez l'URL pour le Webhook entrant en collant l'URL de Ngrok que nous avons noté plus tôt. N'oubliez pas d'ajouter /webhooks/inbound-message à la fin de l'URL.

Webhooks

Rendez-vous dans votre Paramètres du tableau de bord et notez vos API Key et API Secret.

Ajout de variables d'environnement

Puisque nous avons noté toutes les variables d'environnement dont notre Bot aura besoin ainsi que leurs valeurs, nous pouvons maintenant les ajouter à notre projet. Depuis la racine du répertoire de votre projet, créez un fichier .env et ajoutez les valeurs suivantes :

VONAGE_API_KEY=xxxx
VONAGE_API_SECRET=xxxx
VONAGE_FROM_NUMBER=xxxx

N'oubliez pas de remplacer xxxx par les valeurs réelles que nous avons notées précédemment.

Essais

Vous pouvez tester le fonctionnement du robot en lui envoyant des messages depuis votre smartphone à l'aide de WhatsApp.

Conclusion

Dans ce tutoriel, nous avons vu comment construire un Chatbot WhatsApp simple pour effectuer des conversions de devises en utilisant les taux de change fournis par Coinbase. Ce tutoriel peut servir de guide de départ pour apprendre à recevoir et à envoyer des messages via WhatsApp en utilisant l'API de messages de Vonage.

Lectures complémentaires recommandées :

Partager:

https://a.storyblok.com/f/270183/250x250/d288ec8a73/dotun.png
Dotun Jolaoso

Software Developer who loves building awesome tools and products. I currently work with Laravel, PHP and Vue.