Le guide ultime pour envoyer des SMS groupés avec Twilio et Node.js

December 18, 2017
Rédigé par
Phil Nash
Twilion

Le guide ultime pour envoyer des SMS groupés avec Twilio et Node.js

Envoyer un seul SMS avec Twilio est une affaire relativement simple, mais que faire si vous devez envoyer 10 messages ? Ou 10 000 ?

Imaginez que vous êtes vendeur de glaces. Vous voulez améliorer vos affaires en envoyant des alertes SMS lorsque vous êtes dans votre camionnette afin que vos clients sachent que vous êtes sur le point de livrer des rafraîchissements.

L'application météo iPhone montrant 31°C et ensoleillé.

Je sais ce que vous pensez : « On est en décembre, ce n'est pas la période des glaces ! ». Mais je suis à Melbourne en ce moment par une journée d'été à 31 °C, alors je pense beaucoup à des aliments froids et glacés.

Dans ce post, nous allons étudier comment partir de l'envoi du premier message à l'abonné numéro 1 jusqu'à 10 000 messages avec Node.js.

Préparation

Pour suivre ce post et coder les mêmes fonctionnalités, vous allez avoir besoin de quelques éléments :

Une fois ces éléments en place, créez un nouveau répertoire dans lequel travailler et initialisez-le avec npm, puis installez les modules requis :

mkdir ice-cream-alerts
cd ice-cream-alerts
npm init -y
npm install twilio dotenv node-env-run --save

Dans ce cas, j'utilise dotenv pour stocker les identifiants requis pour interagir avec l'API. Pour les charger encore plus facilement, j'ai également inclus le node-env-run de Dominik. Ajoutons maintenant ces informations d'identification. Créez un fichier nommé .env et entrez les éléments suivants, en remplaçant les espaces réservés par vos identifiants de compte et votre numéro Twilio :

TWILIO_ACCOUNT_SID=YOUR_ACCOUNT_SID
TWILIO_AUTH_TOKEN=YOUR_AUTH_TOKEN
TWILIO_NUMBER=YOUR_TWILIO_NUMBER

Vous avez tout ça ? Bien, envoyons quelques messages !

La première cuillère

Tout commence par un seul message à votre premier abonné. Il s'agit du test alpha pour votre abonnement aux alertes de livraison de crème glacée. Vous n'avez besoin d'envoyer qu'un seul message. Écrivons ce code.

Créez un fichier nommé firstsdoop.js, ouvrez-le et ajoutez les éléments suivants :

// firstscoop.js
const twilio = require('twilio')(
  process.env.TWILIO_ACCOUNT_SID,
  process.env.TWILIO_AUTH_TOKEN
);
const body = 'Ice creams are coming!';

Ce code importe le module Twilio Node.js et initialise un nouveau client API à l'aide de votre Account ID et de votre jeton d'autorisation (Auth Token). Nous configurons également le message que nous allons envoyer.

Nous avons besoin d'un numéro auquel envoyer le message. Puisqu'il s'agit du test alpha, vous pouvez peut-être ajouter votre propre numéro pour l'instant. Assurez-vous que votre numéro ici, et tout au long de ce post, est au format E.164.

const number = YOUR_NUMBER_HERE;

Maintenant, utilisez le client API que nous avons créé ci-dessus pour envoyer le message de votre numéro Twilio à votre numéro.

twilio.messages
  .create({
        to: number,
        from: process.env.TWILIO_NUMBER,
        body: body
  })
  .then(message => {
        console.log(message.sid);
  })
  .catch(err => console.error(err));

Ceci crée le message et l'envoie. Si la demande réussit, le SID du message est enregistré, sinon le message d'erreur est consigné.

Pour faciliter l'exécution, ajoutez ce qui suit à votre fichier package.json :

  "scripts": {
    "firstscoop": "nodenv firstscoop.js"
  },

Testez le code en exécutant npm run firstscoop. Vous devriez voir le SID du message sur la ligne de commande et recevoir votre première alerte de crème glacée. Ça marche ! Prenez une glace pour fêter ça !

Animation d'une glace à l'air joyeux en train de faire du skateboard et des sauts.

Multi-pack

Les nouvelles de votre service d'alertes de glaces se sont répandues parmi vos amis. Vous avez maintenant un petit groupe de bénévoles disposés à agir comme votre groupe de testeurs bêta. Ils pensent également qu'ils obtiendront des glaces gratuites, mais vous pourrez en décider plus tard.

Vous pourriez simplement exécuter le fichier existant une fois pour chacun d'eux, en changeant le numéro à chaque fois, mais ce n'est pas très évolutif. Voyons comment le mettre à jour pour envoyer des messages à plusieurs numéros.

Créez un nouveau fichier, multipack.js, et ouvrez-le dans votre éditeur. Le code commence alors de la même manière :

// multipack.js
const twilio = require('twilio')(
  process.env.TWILIO_ACCOUNT_SID,
  process.env.TWILIO_AUTH_TOKEN
);
const body = 'Ice creams are coming!';

Cette fois, nous allons utiliser un tableau d'abonnés. Si vous ne disposez que d'un seul numéro à tester, le fait de le transformer en tableau nous permettra de nous rapprocher d'un groupe.

const numbers = [YOUR_NUMBER_HERE, OTHER_NUMBER, ... ];

Nous devons maintenant passer en boucle ces numéros et envoyer les messages. Au préalable, il est judicieux d'envisager la croissance de l'activité. Vous avez peut-être 5 ou 10 abonnés pour l'instant, mais nous espérons que d'autres arriveront bientôt. Un numéro Twilio normal ne peut envoyer qu'un message par seconde. Si nous avons jusqu'à 60 abonnés, cela va prendre une minute entière pour envoyer les messages et cela va s'aggraver au-delà. Dans certains pays, les opérateurs implémentent le filtrage sur vos numéros, et l'envoi de messages à plus de 200 abonnés à partir d'un seul numéro peut déclencher ce filtrage.

Nous pouvons nous y préparer avec un service de messagerie. Les services de messagerie peuvent regrouper des numéros et faire évoluer l'envoi sur l'ensemble du pool. Au fur et à mesure que notre base d'abonnés augmente, nous pouvons ajouter des numéros pour répondre à la demande et éviter que nos messages ne soient filtrés.

Accédez à la console Twilio et créez un nouveau service de messagerie, entrez un nom convivial comme « Notifications de crème glacée » et sélectionnez « Notifications, outbound only » (Notifications, sortantes uniquement) dans la liste déroulante des cas d'utilisation.

Vue du formulaire pour créer un service de messagerie.

Accédez maintenant à la section des numéros de ce service et ajoutez le numéro que vous avez utilisé pour envoyer des SMS.

Sur l'écran de configuration du nouveau service de messagerie créé, cliquez sur « Numbers » (Numéros) dans le menu pour configurer les numéros de ce service

Au lieu d'utiliser un numéro d'expéditeur (« de ») pour envoyer des messages, nous pouvons maintenant utiliser le SID de ce service de messagerie. Saisissez le SID et ajoutez-le à votre fichier .env.

TWILIO_MESSAGING_SERVICE_SID=YOUR_MESSAGING_SERVICE_SID

De retour dans multipack.js, nous pouvons faire une boucle sur le tableau des numéros et leur envoyer chacun une alerte à l'aide du service de messagerie.

Promise.all(
  numbers.map(number => {
    return twilio.messages.create({
      to: number,
      from: process.env.TWILIO_MESSAGING_SERVICE_SID,
      body: body
    });
  })
)
  .then(messages => {
    console.log('Messages sent!');
  })
  .catch(err => console.error(err));

Dans ce code, nous mappons les numéros et envoyons un message pour chacun d'eux. Cela renvoie une promesse à chaque fois. Nous collectons donc les résultats de toutes les promesses à l'aide de Promise.all et, une fois qu'elles sont terminées, nous affichons un message de réussite. Si l'une des promesses échoue, nous affichons l'erreur.

Ajoutons une autre ligne à package.json pour faciliter l'exécution de ce fichier.

  "scripts": {
        "firstscoop": "nodenv firstscoop.js",
        "multipack": "nodenv multipack.js"
  },

Maintenant, nous exécutons le code avec npm run multipack et nous envoyons plusieurs messages à l'aide de notre nouveau service de messagerie.

Patrick Étoile, de Bob l'Éponge, dégustant un cornet de glace.

« 99 problèmes, mais un flake n'en est pas un »

Votre abonnement aux alertes est public et vos amis en ont tous parlé à leurs amis. À mesure que vos chiffres commencent à augmenter, vous envoyez de plus en plus de notifications concernant la livraison imminente de crèmes glacées. Si vous avez beaucoup de succès, vous pourriez dépasser rapidement le cap des 100 abonnés, mais le succès peut engendrer des problèmes. En raison de la nature asynchrone de Node.js et des limites de simultanéité de l'API Twilio, vous pouvez rencontrer des erreurs.

Nous pourrions écrire le code pour mettre en file d'attente les messages à envoyer, ce qui crée une plus grande complexité dans notre application, ou nous pourrions piocher dans le sac des astuces de Twilio et en extraire une qui va nous faire gagner beaucoup de temps et réduire nos efforts.

L'astuce ici est Twilio Notify. Avec Notify, vous pouvez envoyer des centaines, voire des milliers de messages dans une seule requête API. Voyons comment.

Tout d'abord, vous devez créer vous-même un nouveau service Notify dans la console Twilio. Cela fait, vous devez le configurer avec le service de messagerie que vous avez créé à la dernière étape.

Sur la page de configuration du service Notify, vous devez sélectionner le service de messagerie que vous avez créé précédemment dans le menu déroulant intitulé « Messaging Service Sid »

Saisissez le SID du service Notify et ajoutez-le à votre fichier .env.

TWILIO_NOTIFY_SERVICE_SID=YOUR_NOTIFY_SERVICE_SID

Il est temps d'écrire le code. Créez un fichier appelé 99flake.js et ouvrez-le. Commencez par les mêmes 3 lignes à partir de multipack.js.

// 99flake.js
const twilio = require('twilio')(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN);
const body = "Ice creams are coming!";
const numbers = [YOUR_NUMBER_HERE, OTHER_NUMBER, ... ];

Cette fois, nous allons utiliser notre service Notify :

const service = twilio.notify.services(process.env.TWILIO_NOTIFY_SERVICE_SID);

Nous devons transformer nos numéros en format de liaison de Notify. Les liaisons sont normalement créées une seule fois et utilisées comme partie des segments lors de l'envoi de notifications par SMS, iOS, Android et d'autres canaux. Mais si nous voulons juste envoyer des messages immédiatement, nous pouvons créer les liaisons à la volée.

Pour ce faire, nous allons transformer chaque numéro en un objet JSON de type :{"binding_type":"sms", "address": NUMBER}. Le code à utiliser se présente comme suit :

const bindings = numbers.map(number => {
  return JSON.stringify({ binding_type: 'sms', address: number });
});

Twilio limite la taille d'une requête API à 1 Mo au total, ce qui est généralement suffisant pour l'envoi à environ 10 000 numéros. Si vous avez d'autres messages à envoyer, vous devrez diviser les requêtes.

Remarque : si vous envoyez à autant de numéros à la fois, vous voudrez peut-être ajouter plusieurs numéros ou un numéro court à votre groupe de numéros. Consultez les conseils de filtrage des opérateurs pour en savoir plus.

Utilisez le service pour créer une notification qui sera envoyée à chacune des liaisons :

service.notifications
  .create({
        toBinding: bindings,
        body: body
  })
  .then(notification => {
        console.log(notification);
  })
  .catch(err => {
        console.error(err);
  });

Enregistrez le fichier et ajoutez cette ligne au fichier package.json :

  "scripts": {
        "firstscoop": "nodenv firstscoop.js",
        "multipack": "nodenv multipack.js",
        "99flake": "nodenv 99flake.js"
  },

Exécutez npm run 99flake et vous enverrez toutes vos notifications en utilisant la puissance combinée de Twilio Notify et de votre service de messagerie. Notify gère l'envoi des messages après votre appel d'API unique et le service de messagerie peut les distribuer sur les numéros de votre pool de numéros.

Animation de langues léchant des crèmes glacées.

Des glaces pour tout le monde

Vous connaissez maintenant les différentes options dont vous disposez pour envoyer un message, quelques messages ou beaucoup de messages. Si vous devez les envoyer un par un, alors l'API normale suffit. Dès que vous avez besoin d'envoyer quelques messages, un service de messagerie peut aider à modifier l'échelle de cet envoi, et si vous avez des centaines ou des milliers de messages à envoyer, alors Notify vous couvre. Vous pouvez consulter le code de ce post sur GitHub.

Avez-vous d'autres questions sur l'envoi de SMS groupés avec Node.js ? Faites-le-moi savoir dans les commentaires, sur Twitter ou par e-mail à philnash@twilio.com.

Restez frais.