SMS groupés avec Twilio et Java
Temps de lecture: 7 minutes
La vie est suffisamment compliquée comme ça : pas besoin de rajouter le transfert intempestif des messages entre amis et membres de la famille pour s'assurer que tout le monde est informé de ce qui se passe. Dans ce post, je vais vous expliquer comment j'ai configuré un numéro Twilio que j'ai donné comme étant « mon » numéro de téléphone aux écoles de mes enfants afin que tous les messages reçus et envoyés depuis ce numéro soient automatiquement transférés à ma femme et moi, pour que l'un ou l'autre puisse répondre. Je suis sûr que vous pouvez imaginer des situations dans votre vie où cela serait pratique : livraison de colis, planification d'événements, rappels de rendez-vous, la liste est longue.
Dans ce post, je vais utiliser Java, mais la même approche fonctionne avec n'importe quel langage dans lequel vous pouvez construire une application Web. Si vous êtes à l'aise avec JavaScript, le transfert de SMS vers plusieurs numéros sur Code Exchange est un bon point de départ.
Que construisons-nous ?
Tout est basé sur un seul numéro de téléphone Twilio et un groupe, composé de vous et des membres de votre famille ou de vos amis, qui utilisent des téléphones mobiles. Vous pouvez donner votre numéro Twilio à d'autres personnes comme s'il s'agissait de votre propre numéro.
Nous allons configurer le numéro Twilio pour que n'importe quel message texte reçu par ce numéro soit transféré à tous les membres de votre groupe. Je vais utiliser deux membres de groupe dans cet exemple, mais le code est conçu pour que vous puissiez en utiliser autant que vous le souhaitez.
Lorsque quelqu'un en dehors de votre groupe (le téléphone de gauche) envoie un SMS au numéro Twilio, le message est transféré à tous les membres du groupe (les téléphones de droite). Les messages s'afficheront comme s'ils avaient été envoyés à partir du numéro Twilio. Le numéro de téléphone de l'expéditeur réel sera donc ajouté au début du message.
Lorsqu'un membre de votre groupe répond au numéro Twilio, il doit ajouter le numéro du destinataire réel au début du message, qui sera supprimé avant le transfert du message. Tous les membres de votre groupe reçoivent également une copie du message :
Notez que si vous voulez envoyer un message d'un membre du groupe à tous les autres, vous pouvez le faire en ajoutant votre propre numéro au début du message.
Prérequis
Pour construire ce système, vous aurez besoin des éléments suivants :
- Un compte Twilio, mis à niveau à partir d'un compte d'essai. Si vous n'en avez pas encore, inscrivez-vous à l'aide de ce lien pour obtenir un supplément de 10 $ lors de la mise à niveau.
- Un numéro de téléphone Twilio.
- Java 11 ou une version plus récente. Je recommande SDKMAN pour installer et gérer Java sur ma machine de développement.
- Un environnement de développement Java.
Utilisation de Twilio Programmable Messaging
Pour indiquer à Twilio comment se comporter en réponse à des SMS entrants, nous utiliserons webhooks. Lorsqu'un message est reçu par notre numéro de téléphone, Twilio envoie une requête HTTP à une URL que nous fournissons. Nous construisons une application pour renvoyer des instructions dans la réponse HTTP indiquant à Twilio quelle est la marche à suivre.
Les instructions de la réponse HTTP sont écrites en TwiML, avec plusieurs balises message qui indiquent à Twilio d'envoyer de nouveaux messages texte. Le contenu et la destination de ces messages dépendent de la personne qui a envoyé le message entrant et de ce qu'elle a écrit : des attributs qui font partie de la requête HTTP. Lisez la suite pour découvrir comment construire cette application à l'aide de Java et de Spring Boot
Construire l'application
Spring Boot est le framework le plus populaire pour construire des applications Web en Java. Généralement, je commence de nouveaux projets avec Spring Initializr. Si vous souhaitez suivre le processus de codage, utilisez ce lien qui définit les mêmes options que celles que j'ai utilisées. Sinon, vous trouverez le projet terminé sur GitHub.
Téléchargez, décompressez et ouvrez le projet généré dans votre IDE. Il y aura une seule classe dans src/main/java, dans le package com.example.smsgroupbroadcast
, appelée SmsGroupBroadcastApplication
. Vous n'aurez pas besoin de modifier cette classe, mais elle contient une méthode main
que vous pouvez utiliser pour exécuter l'application.
Dans le même package, créez une nouvelle classe appelée SmsHandler
, dans un nouveau fichier appelé SmsHandler.java
. Pour éviter que les choses ne deviennent trop compliquées, nous allons mettre tout notre code dans cette classe. Une fois terminé, il contiendra environ 100 lignes.
Commencez par le code qui doit être exécuté au démarrage :
[ce code avec les importations sur GitHub]
L'annotation @RestController
indique à Spring que cette classe doit être analysée pour rechercher des méthodes capables de traiter les requêtes HTTP. Nous allons bientôt en rédiger une.
La zone Set<String> groupPhoneNumbers
à la ligne 4 est initialisée dans le constructeur en lisant une variable d'environnement dont la valeur est une chaîne de numéros de téléphone séparés par des virgules au format E.164. Ces numéros doivent inclure votre téléphone mobile et les téléphones de tous les autres membres de votre groupe (du côté droit dans les schémas ci-dessus). Vous pouvez définir des variables d'environnement directement dans votre IDE :
Configuration de variable d'environnement IntelliJ IDEA
Méthode de traitement des requêtes HTTP
Pour faciliter l'écriture correcte en TwiML, nous utiliserons la librairie de Twilio pour Java. Ajoutez l'extrait de code suivant dans la section <dependencies>
de pom.xml
, le fichier de configuration Maven qui se trouve tout en haut de votre projet :
Vous devrez peut-être indiquer à votre IDE d'actualiser les modifications de Maven à ce stade. Ajoutez ensuite ce code à votre classe SmsHandler
:
[ce code avec les importations sur GitHub]
Cette méthode commence par de nombreuses annotations reconnues par Spring :
@RequestMapping
indique à Spring que cette méthode doit être utilisée pour les requêtesGET
etPOST
à/sms
et que leContent-type
de la réponse estapplication/xml
.@ResponseBody
indique à Spring que la valeur de retour de cette méthode doit être utilisée comme le corps de la réponse HTTP.- Les annotations
@RequestParam
demandent à Spring d'extraire les paramètres nommés de la requête HTTP et de les transmettre comme arguments à la méthode. Cela fonctionne à la fois pourGET
etPOST
même si les paramètres se trouvent dans différentes parties de la requête HTTP.
Le corps de la méthode crée une liste d'objets Message
qui est remplie différemment selon que le SMS entrant qui a déclenché ce webhook provient ou non d'un membre du groupe (ligne 12). Nous allons définir les méthodes messagesSentFromGroup
et messagesSentToGroup
dans un instant, mais notez tout d'abord la façon dont la liste des Messages est ajoutée à une MessagingResponse
en utilisant forEach
sur les lignes 19 à 21.
Traitement des messages provenant de personnes en dehors du groupe
Si la vérification groupPhoneNumbers.contains(fromNumber)
dans la méthode ci-dessus renvoie false
, alors nous savons que le message vient de quelqu'un en dehors de notre groupe. Dans ce cas, la méthode messagesSentToGroup
est appelée pour obtenir une liste d'objets Message
représentant une copie du message entrant à transférer à chaque membre du groupe :
[ce code avec les importations sur GitHub]
Nous construisons le finalMessage
et ajoutons un Message à la liste pour chaque membre du groupe. J'ai créé une petite méthode d'aide appelée createMessageTwiml
pour transformer le code du modèle de construction de la librairie Twilio en une seule ligne. J'ai pensé que cela en valait la peine car nous allons construire des objets Message plusieurs fois dans cette classe. Cette méthode se présente comme suit :
[ce code avec les importations sur GitHub]
Messages des membres du groupe
Lorsqu'un membre du groupe envoie un message au numéro Twilio, il doit le faire précéder du numéro de destination réelle :
La partie « Merci ! » du message sera envoyée depuis le numéro Twilio vers le numéro au début du message. Tout le monde dans le groupe en aura aussi une copie. Pour cela, la méthode messagesSentFromGroup
doit diviser le corps du message, vérifier s'il commence par un numéro de téléphone (si ce n'est pas le cas, envoyer un rappel) et créer une liste de messages sortants, comme ceci :
[ce code avec les importations sur GitHub]
La méthode messagesSentFromGroup
peut sembler très fournie en code, mais elle se divise à peu près en deux parties. Les lignes 4 à 9 traitent de la séparation de l'entrée et de la vérification pour voir si le message commence par un numéro de téléphone. La e164Regex
teste un +
suivi de chiffres, ce qui correspond au formatage E.164 pour les numéros de téléphone.
Le reste de messagesSentFromGroup
dresse une liste de tous les messages que nous devons envoyer et la renvoie.
Enfin, il existe une méthode distincte pour createHowToMessage
qu'il valait, à mon avis, la peine de développer pour rendre plus lisible la méthode longue.
Code terminé
La classe SmsHandler
est complète, le code est donc terminé. Pour référence, la classe complète se trouve sur GitHub.
Exécution locale de votre code
Le moyen le plus simple de démarrer l'application est d'utiliser votre IDE pour exécuter la méthode main
dans la classe SmsGroupBroadcasterApplication
que nous avons vue précédemment. Si vous préférez utiliser un terminal de ligne de commande, exécutez ./mvnw spring-boot:run
tout en haut du projet. Dans les deux cas, n'oubliez pas de définir la variable d'environnement GROUP_PHONE_NUMBERS
.
Une fois l'application démarrée, vous pouvez accéder à http://localhost:8080/sms?From=__from__&To=__to__&Body=__body__ et vous devriez voir une réponse du type :
GROUP_MEMBER_1
et GROUP_MEMBER_2
seront les numéros de votre variable d'environnement GROUP_PHONE_NUMBERS
.
Utilisation de votre code avec Twilio
Pour que Twilio puisse utiliser votre application pour ses webhooks, il lui faudra une URL publique. Il existe de nombreuses façons de déployer du code Java en ligne, mais pour plus de simplicité, je vous recommande d'utiliser ngrok.
Après avoir installé ngrok, vous pouvez exécuter ngrok http 8080
et vous verrez une URL de transfert https
que vous devrez définir pour le moment où « un message arrive » sur la page de configuration de votre numéro de téléphone. N'oubliez pas d'ajouter le chemin de /sms
à l'URL :
Si vous voulez tester le système avant de donner le vrai numéro, recrutez quelques amis avec des téléphones ou utilisez d'autres numéros Twilio pour essayer. Une fois satisfait, déplacez l'application vers un cloud public toujours actif pour ne pas avoir à maintenir en permanence votre machine de développement en fonctionnement. Je m'éloigne du sujet de ce post, mais la documentation de Spring sur les packages et le déploiement présente de nombreuses options. Vous n'avez besoin que d'une seule requête HTTP pour chaque SMS envoyé à votre numéro Twilio, les exigences sont donc très restreintes.
Pour aller plus loin
Vous pouvez apporter de nombreuses améliorations à cette application, par exemple :
- Pour les grands groupes, il peut s'avérer utile d'inclure le numéro de l'expéditeur dans les messages en copie.
- Ajoutez un « carnet d'adresses » dans votre application pour pouvoir ajouter le nom plutôt que le numéro lors de l'envoi à des destinataires en dehors du groupe.
- Il n'existe aucune vérification pour s'assurer que les requêtes HTTP proviennent effectivement de Twilio. Il ne s'agit que d'un problème mineur pour cette application car si quelqu'un d'autre fait appel à votre application, il recevra du TwiML en retour, mais cela ne vous coûtera rien. Si vous voulez ajouter cette vérification, j'ai rédigé l'article Sécuriser vos webhooks Twilio en Java qui vous montrera comment faire.
N'hésitez pas à me faire part des projets que vous construisez avec Twilio ! Contactez-moi sur Twitter : @MaximumGilliard ou à l'adresse mgilliard@twilio.com. J'ai hâte de voir ce que vous allez construire !
Articles associés
Ressources connexes
Twilio Docs
Des API aux SDK en passant par les exemples d'applications
Documentation de référence sur l'API, SDK, bibliothèques d'assistance, démarrages rapides et didacticiels pour votre langage et votre plateforme.
Centre de ressources
Les derniers ebooks, rapports de l'industrie et webinaires
Apprenez des experts en engagement client pour améliorer votre propre communication.
Ahoy
Le hub de la communauté des développeurs de Twilio
Meilleures pratiques, exemples de code et inspiration pour créer des expériences de communication et d'engagement numérique.