Réception de SMS concaténés

Les messages SMS qui dépasser une certaine longueur sont divisés en deux ou plusieurs messages plus courts et envoyés sous la forme de plusieurs SMS.

Lorsque vous utilisez l'API SMS pour recevoir des SMS entrant qui pourraient être plus longs que la longueur d'octet autorisée pour un seul SMS, vous devez vérifier si les messages livrés à votre webhook sont autonomes ou font partie d'un SMS en plusieurs parties. Si le message comporte plusieurs parties, vous devez les réassembler pour afficher le texte complet du message.

Ce tutoriel vous montre comment faire.

Dans ce tutoriel

Dans ce tutoriel, vous allez créer une application Node.js utilisant le framework Express qui reçoit des SMS entrants via un webhook et détermine si le message est un SMS en une ou plusieurs parties.

Si le SMS entrant est composé de plusieurs parties, l'application attend de recevoir toutes les parties du message, puis les combine dans le bon ordre pour les afficher à l'utilisateur.

Pour ce faire, vous devez suivre les étapes suivantes :

  1. Créer le projet - créer une application Node.js/Express
  2. Exposez votre application à l'Internet - utiliser ngrok pour permettre à Vonage d'accéder à votre application via un webhook
  3. Créer l'application de base - construire une application avec un webhook pour recevoir des SMS entrants
  4. Enregistrez votre webhook auprès de Vonage - informer les serveurs de Vonage de l'existence de votre webhook
  5. Envoyer un SMS test - assurez-vous que votre webhook peut recevoir des SMS entrants
  6. Traiter les SMS en plusieurs parties - réassembler un SMS en plusieurs parties en un seul message
  7. Test de réception d'un SMS concaténé - le voir en action !

Conditions préalables

Pour compléter le tutoriel, vous avez besoin de :

  • A Account Vonage - pour votre clé d'API et votre secret.
  • ngrok - (facultatif) pour rendre votre serveur web de développement accessible aux serveurs de Vonage sur Internet.
  • Tous les clients basés aux États-Unis doivent enregistrer une marque et une campagne afin de se conformer à la législation européenne. 10 lignes directrices DLC.

Créer le projet

Créez un répertoire pour votre application, cd dans le répertoire, puis utiliser le gestionnaire de paquets Node.js npm pour créer un package.json pour les dépendances de votre application :

mkdir myapp cd myapp npm init

Appuyez sur [Enter] pour accepter toutes les valeurs par défaut, à l'exception de entry point pour lequel vous devez saisir server.js.

Ensuite, installez le express et le cadre d'application web analyseur de corps paquets :

npm install express body-parser --save

Exposez votre application à l'Internet

Lorsque l'API SMS reçoit un SMS destiné à l'un de vos numéros virtuels, elle en avertit votre application par l'intermédiaire d'un webhook. Le webhook fournit un mécanisme permettant aux serveurs de Vonage de communiquer avec les vôtres.

Pour que votre application soit accessible aux serveurs de Vonage, elle doit être publiquement disponible sur Internet. Une façon d'y parvenir pendant le développement et les essais est d'utiliser la fonction ngrokUn service qui expose les serveurs locaux à l'Internet public par le biais de tunnels sécurisés. Voir aussi cet article de blog pour plus de détails.

Télécharger et installer ngrokpuis démarrez-le avec la commande suivante :

ngrok http 5000

Cela crée des URL publiques (HTTP et HTTPS) pour tout site web fonctionnant sur le port 5000 de votre machine locale.

Utiliser le ngrok à l'interface web à l'adresse http://localhost:4040 et notez les URL que ngrok fournit : vous en avez besoin pour compléter ce tutoriel.

Créer l'application de base

Créer un server.js dans le répertoire de votre application avec le code suivant, qui sera notre point de départ :

require('dotenv').config();
const app = require('express')();
const bodyParser = require('body-parser');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app
    .route('/webhooks/inbound-sms')
    .get(handleInboundSms)
    .post(handleInboundSms);

const handleInboundSms = (request, response) => {
    const params = Object.assign(request.query, request.body);

    // Send OK status
    response.status(204).send();
}

app.listen('5000');

Ce code effectue les opérations suivantes :

  • Initialise les dépendances (l'élément express cadre et body-parser pour l'analyse des requêtes
    POST
    ).
  • Enregistre un /webhooks/inbound-sms avec Express qui accepte les requêtes
    GET
    et
    POST
    . Il s'agit du webhook que les Applications de Vonage utiliseront pour communiquer avec notre application lorsque l'un de nos numéros virtuels recevra un SMS.
  • Crée une fonction de traitement pour l'itinéraire appelé handleInboundSms() qui affiche un message nous indiquant que nous avons reçu un SMS entrant et renvoie un message HTTP success aux API de Vonage. Cette dernière étape est importante, sinon Vonage continuera à essayer d'envoyer le SMS jusqu'à ce qu'il s'arrête.
  • Exécute le serveur d'application sur le port 5000.

Enregistrez votre webhook auprès de Vonage

Maintenant que vous avez créé votre webhook, vous devez indiquer à Vonage où il se trouve. Connectez-vous à votre Tableau de bord du compte Vonage et visitez le site paramètres page.

Dans votre application, le webhook se trouve à l'adresse suivante /webhooks/inbound-sms. Si vous utilisez Ngrok, le point de terminaison complet du webhook que vous devez configurer ressemble à https://demo.ngrok.io/webhooks/inbound-smsdemo est le sous-domaine fourni par Ngrok (typiquement quelque chose comme 0547f2ad).

Saisissez votre point de terminaison webhook dans le champ étiqueté URL du webhook pour le message entrant et cliquez sur le bouton [Enregistrer les modifications].

Désormais, si l'un de vos Numbers virtuels reçoit un SMS, Vonage appellera ce point de terminaison webhook avec les détails du message.

Envoyer un SMS test

  1. Ouvrez une nouvelle fenêtre de terminal et exécutez la commande server.js pour qu'il écoute les SMS entrants :

    node server.js
  2. Envoyez un SMS de test à votre numéro Vonage depuis votre appareil mobile, avec un message texte court. Par exemple, "Ceci est un message texte court".

Si tout est configuré correctement, vous devriez recevoir un Inbound SMS received dans la fenêtre du terminal en cours d'exécution server.js.

Maintenant, écrivons un peu de code pour analyser le SMS entrant et voir ce qu'il contient.

  1. Appuyez sur [CTRL+C] pour mettre fin à l'exécution. server.js l'application.

  2. Créer une nouvelle fonction dans server.js appelé displaySms():

    const displaySms = (msisdn, text) => {
        console.log('FROM: ' + msisdn);
        console.log('MESSAGE: ' + text);
        console.log('---');
    }
    
  3. Également dans server.js et avant que votre code n'envoie le 204 ajouter un appel à displaySms() à l'aide des paramètres suivants :

    displaySms(params.msisdn, params.text);
    
  4. Redémarrage server.js puis envoyez un autre message court à partir de votre appareil mobile. Cette fois, la fenêtre du terminal en cours d'exécution devrait afficher le message suivant server.js:

    Inbound SMS received FROM: <YOUR_MOBILE_NUMBER> MESSAGE: This is a short text message.
  5. Garder server.js mais cette fois-ci, utilisez votre appareil mobile pour envoyer un message beaucoup plus long qu'un simple SMS ne le permet. Par exemple, la première phrase du "Conte de deux villes" de Dickens :

    It was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epoch of incredulity, it was the season of Light, it was the season of Darkness, it was the spring of hope, it was the winter of despair, we had everything before us, we had nothing before us, we were all going direct to Heaven, we were all going direct the other way ... in short, the period was so far like the present period, that some of its noisiest authorities insisted on its being received, for good or for evil, in the superlative degree of comparison only.'
    
  6. Vérifiez la sortie dans la fenêtre du terminal qui exécute server.js. Vous devriez voir quelque chose qui ressemble à ce qui suit :

    ---
    Inbound SMS received
    FROM: <YOUR_MOBILE_NUMBER>
    MESSAGE: It was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epo
    ---
    Inbound SMS received
    FROM: <YOUR_MOBILE_NUMBER>
    MESSAGE: ch of incredulity, it was the season of Light, it was the season of Darkness, it was the spring of hope, it was the winter of despair, we had everything
    ---
    Inbound SMS received
    FROM: <YOUR_MOBILE_NUMBER>
    MESSAGE: e the present period, that some of its noisiest authorities insisted on its being received, for good or for evil, in the superlative degree of compariso
    ---
    Inbound SMS received
    FROM: <YOUR_MOBILE_NUMBER>
    MESSAGE:  before us, we had nothing before us, we were all going direct to Heaven, we were all going direct the other way ... in short, the period was so far lik
    ---
    Inbound SMS received
    FROM: <YOUR_MOBILE_NUMBER>
    MESSAGE: n only.
    ---
    

Que s'est-il passé ? Le message a dépassé la limite d'un octet par SMS et a donc été envoyé sous forme de plusieurs messages SMS.

Pour nous permettre de présenter ces messages à nos utilisateurs dans le format prévu, nous devons détecter si un message entrant a été divisé de cette manière et le réassembler à partir de ses différentes parties.

Remarquez dans le résultat ci-dessus que les pièces ne sont pas arrivées dans le bon ordre. Cela n'est pas rare et nous devons donc coder notre webhook pour gérer cette éventualité.

Traiter les SMS en plusieurs parties

Vonage transmet quatre paramètres spéciaux à votre webhook lorsqu'un SMS entrant est concaténé (ils n'apparaissent pas dans la demande lorsque le SMS est en une seule partie). (Vous pouvez les utiliser pour réassembler les différentes parties en un tout cohérent :

  • concat:true - lorsque le message est concaténé
  • concat-ref - une référence unique qui permet de déterminer à quel SMS appartient une partie de message donnée
  • concat-total - le nombre total de pièces qui composent l'ensemble du SMS
  • concat-part - la position de cette partie du message dans l'ensemble du message, afin que vous puissiez réassembler les parties dans l'ordre correct

Détecter si un message est concaténé

Tout d'abord, vous devez détecter si un message est concaténé. Modifiez l'élément handleInboundSms() de sorte qu'elle affiche un SMS en une seule partie à l'utilisateur de la manière habituelle, mais qu'elle effectue un traitement supplémentaire pour les SMS en plusieurs parties, que vous mettrez en œuvre dans une étape ultérieure :

const handleInboundSms = (request, response) => {
    const params = Object.assign(request.query, request.body);

    if (params['concat'] == 'true') {
        // Perform extra processing
    } else {
        // Not a concatenated message, so display it
        displaySms(params.msisdn, params.text);
    }   
    
    // Send OK status
    response.status(204).send();
}

Stocker les SMS en plusieurs parties pour un traitement ultérieur

Nous devons stocker tous les SMS entrants qui font partie d'un message plus important afin de pouvoir les traiter une fois que nous en aurons tous les éléments.

Déclarer un tableau en dehors de l'interface handleInboundSms() fonction appelée concat_sms. Si un SMS entrant fait partie d'un message plus long, il est stocké dans le tableau :

let concat_sms = []; // Array of message objects

const handleInboundSms = (request, response) => {
    const params = Object.assign(request.query, request.body);

    if (params['concat'] == 'true') {
        /* This is a concatenated message. Add it to an array
           so that we can process it later. */
        concat_sms.push({
            ref: params['concat-ref'],
            part: params['concat-part'],
            from: params.msisdn,
            message: params.text
        });
    } else {
        // Not a concatenated message, so display it
        displaySms(params.msisdn, params.text);
    }   
    
    // Send OK status
    response.status(204).send();
}

Rassembler tous les éléments du message

Avant même d'essayer de réassembler le message à partir de ses éléments, nous devons nous assurer que nous disposons de tous les éléments pour une référence de message donnée. N'oubliez pas qu'il n'y a aucune garantie que toutes les parties arriveront dans le bon ordre, et qu'il ne s'agit donc pas seulement de vérifier si concart-part égaux concat-total.

Nous pouvons le faire en filtrant le concat_sms pour n'inclure que les objets SMS qui partagent la même concat-ref comme le SMS que nous avons reçu. Si la longueur de ce tableau filtré est égale à concat-totalNous disposons alors de tous les éléments de ce message et nous pouvons les réassembler :

    if (params['concat'] == 'true') {
        /* This is a concatenated message. Add it to an array
           so that we can process it later. */
        concat_sms.push({
            ref: params['concat-ref'],
            part: params['concat-part'],
            from: params.msisdn,
            message: params.text
        });

        /* Do we have all the message parts yet? They might
           not arrive consecutively. */
        const parts_for_ref = concat_sms.filter(part => part.ref == params['concat-ref']);

        // Is this the last message part for this reference?
        if (parts_for_ref.length == params['concat-total']) {
            console.dir(parts_for_ref);
            processConcatSms(parts_for_ref);
        }
    } 

Remonter les éléments du message

Maintenant que nous avons toutes les parties du message, mais pas nécessairement dans le bon ordre, nous pouvons utiliser la fonction Array.sort() pour les réassembler dans l'ordre de concat-part. Créer le processConcatSms() pour ce faire :

const processConcatSms = (all_parts) => {

    // Sort the message parts
    all_parts.sort((a, b) => a.part - b.part);

    // Reassemble the message from the parts
    let concat_message = '';
    for (i = 0; i < all_parts.length; i++) {
        concat_message += all_parts[i].message;
    }

    displaySms(all_parts[0].from, concat_message);
}

Test de réception d'un SMS concaténé

Exécuter server.js et utilisez votre appareil mobile pour renvoyer le message texte long que vous avez envoyé à l'étape 5 de l'écran d'accueil. Envoyer un SMS test ci-dessus.

Si vous avez tout codé correctement, dans le fichier server.js vous devriez voir arriver les différentes parties du message. Lorsque toutes les parties ont été reçues, le message complet s'affiche :

[ { ref: '08B5',
    part: '3',
    from: '<YOUR_MOBILE_NUMBER>',
    message: ' before us, we had nothing before us, we were all going direct to Heaven, we were all going direct the other way ... in short, the period was so far lik' },
  { ref: '08B5',
    part: '1',
    from: '<YOUR_MOBILE_NUMBER>',
    message: 'It was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epo' },
  { ref: '08B5', part: '5', from: 'TEST-NEXMO', message: 'n only.' },
  { ref: '08B5',
    part: '2',
    from: '<YOUR_MOBILE_NUMBER>',
    message: 'ch of incredulity, it was the season of Light, it was the season of Darkness, it was the spring of hope, it was the winter of despair, we had everything' },
  { ref: '08B5',
    part: '4',
    from: '<YOUR_MOBILE_NUMBER>',
    message: 'e the present period, that some of its noisiest authorities insisted on its being received, for good or for evil, in the superlative degree of compariso' } ]
FROM: <YOUR_MOBILE_NUMBER>
MESSAGE: It was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epoch of incredulity, it was the season of Light, it was the season of Darkness, it was the spring of hope, it was the winter of despair, we had everything before us, we had nothing before us, we were all going direct to Heaven, we were all going direct the other way ... in short, the period was so far like the present period, that some of its noisiest authorities insisted on its being received, for good or for evil, in the superlative degree of comparison only.
---

Conclusion

Dans ce didacticiel, vous avez créé une application qui vous montre comment réassembler un SMS concaténé à partir de ses éléments constitutifs. Vous avez appris à connaître l'outil concat, concat-ref, concat-totalet concat-part à votre webhook SMS entrant et comment vous pouvez les utiliser pour déterminer :

  • Si un SMS entrant est concaténé
  • A quel message appartient une partie spécifique du message
  • Combien de parties du message constituent le message complet ?
  • L'ordre d'une partie spécifique du message dans le message complet

Quelle est la prochaine étape ?

Les ressources suivantes vous aideront à utiliser Number Insight dans vos Applications :