Empfang von konkatenierten SMS

SMS-Nachrichten, die eine bestimmte Länge überschreiten werden in zwei oder mehr kürzere Nachrichten aufgeteilt und als mehrere SMS verschickt.

Wenn Sie die SMS API verwenden, um Folgendes zu empfangen eingehende SMS die länger als die für eine einzelne SMS zulässige Byte-Länge sein können, müssen Sie überprüfen, ob die Nachrichten an Ihren Webhook eigenständig oder ein Teil einer mehrteiligen SMS sind. Wenn die Nachricht aus mehreren Teilen besteht, müssen Sie diese wieder zusammensetzen, um den vollständigen Nachrichtentext anzuzeigen.

Diese Anleitung zeigt Ihnen, wie das geht.

In diesem Lernprogramm

In diesem Tutorial werden Sie eine Node.js-Anwendung mit dem Express-Framework erstellen, die eingehende SMS über einen Webhook empfängt und feststellt, ob es sich um eine ein- oder mehrteilige SMS handelt.

Wenn die eingehende SMS aus mehreren Teilen besteht, wartet die Anwendung, bis sie alle Teile der Nachricht erhalten hat, und kombiniert sie dann in der richtigen Reihenfolge, um sie dem Nutzer anzuzeigen.

Um dies zu erreichen, führen Sie die folgenden Schritte durch:

  1. Das Projekt erstellen - eine Node.js/Express-Anwendung erstellen
  2. Öffnen Sie Ihre Anwendung für das Internet - Verwendung ngrok um Vonage den Zugriff auf Ihre Anwendung über einen Webhook zu ermöglichen
  3. Erstellen Sie die Basisanwendung - eine Anwendung mit einem Webhook zum Empfang eingehender SMS erstellen
  4. Registrieren Sie Ihren Webhook bei Vonage - Informieren Sie die Server von Vonage über Ihren Webhook
  5. Senden Sie eine Test-SMS - sicherstellen, dass Ihr Webhook eingehende SMS empfangen kann
  6. Handhabung von mehrteiligen SMS - eine mehrteilige SMS wieder zu einer einzigen Nachricht zusammenfügen
  7. Test des Empfangs einer verketteten SMS - sehen Sie es in Aktion!

Voraussetzungen

Um das Tutorial abzuschließen, benötigen Sie:

  • A Vonage-Konto - für Ihren API-Schlüssel und Ihr Geheimnis.
  • ngrok - (optional), um Ihren Entwicklungs-Webserver über das Internet für die Server von Vonage zugänglich zu machen.
  • Alle in den USA ansässigen Kunden müssen eine Marke und eine Kampagne registrieren, um die 10 DLC-Leitlinien.

Das Projekt erstellen

Erstellen Sie ein Verzeichnis für Ihre Anwendung, cd in das Verzeichnis und verwenden Sie dann den Node.js-Paketmanager npm zur Erstellung einer package.json Datei für die Abhängigkeiten Ihrer Anwendung:

mkdir myapp cd myapp npm init

Drücken Sie [Enter], um alle Standardeinstellungen zu akzeptieren, außer entry point für die Sie Folgendes eingeben sollten server.js.

Installieren Sie dann die express Web Application Framework und die body-parser Pakete:

npm install express body-parser --save

Öffnen Sie Ihre Anwendung für das Internet

Wenn die SMS API eine SMS empfängt, die für eine Ihrer virtuellen Numbers bestimmt ist, benachrichtigt sie Ihre Anwendung über eine Webhook. Der Webhook bietet einen Mechanismus, mit dem die Server von Vonage mit den Ihren kommunizieren können.

Damit Ihre Anwendung für die Server von Vonage zugänglich ist, muss sie im Internet öffentlich zugänglich sein. Eine Möglichkeit, dies während der Entwicklung und des Testens zu erreichen, ist die Verwendung von ngrokein Dienst, der lokale Server über sichere Tunnel dem öffentlichen Internet zugänglich macht. Siehe dieser Blogbeitrag für weitere Einzelheiten.

Herunterladen und installieren ngrokund starten Sie ihn dann mit dem folgenden Befehl:

ngrok http 5000

Dadurch werden öffentliche URLs (HTTP und HTTPS) für jede Website erstellt, die an Port 5000 auf Ihrem lokalen Rechner läuft.

Verwenden Sie die ngrok Webschnittstelle unter http://localhost:4040 und notieren Sie sich die URLs, die ngrok zur Verfügung: Sie benötigen sie, um dieses Tutorial zu beenden.

Erstellen Sie die Basisanwendung

Erstellen einer server.js Datei in Ihrem Anwendungsverzeichnis mit folgendem Code, mit dem wir beginnen werden:

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');

Dieser Code bewirkt Folgendes:

  • Initialisiert die Abhängigkeiten (die express Rahmen und body-parser zum Parsen von
    POST
    -Anfragen).
  • Registriert eine /webhooks/inbound-sms Route mit Express, die sowohl
    GET
    - als auch
    POST
    -Anfragen annimmt. Dies ist der Webhook, den die APIs von Vonage verwenden, um mit unserer Anwendung zu kommunizieren, wenn eine unserer virtuellen Nummern eine SMS erhält.
  • Erzeugt eine Handler-Funktion für die Route namens handleInboundSms() die eine Nachricht anzeigt, dass wir eine eingehende SMS erhalten haben, und eine HTTP success Antwort an die APIs von Vonage. Dieser letzte Schritt ist wichtig, da Vonage sonst weiter versucht, die SMS zuzustellen, bis die Zeit abgelaufen ist.
  • Führt den Anwendungsserver auf Port 5000 aus.

Registrieren Sie Ihren Webhook bei Vonage

Nachdem Sie nun Ihren Webhook erstellt haben, müssen Sie Vonage mitteilen, wo er sich befindet. Melden Sie sich bei Ihrem Vonage Account-Dashboard und besuchen Sie die Einstellungen Seite.

In Ihrer Anwendung befindet sich der Webhook unter /webhooks/inbound-sms. Wenn Sie Ngrok verwenden, sieht der vollständige Webhook-Endpunkt, den Sie konfigurieren müssen, wie folgt aus https://demo.ngrok.io/webhooks/inbound-sms, wobei demo ist die von Ngrok bereitgestellte Subdomain (typischerweise etwas wie 0547f2ad).

Geben Sie Ihren Webhook-Endpunkt in das Feld mit der Bezeichnung Webhook-URL für eingehende Nachricht und klicken Sie auf die Schaltfläche [Änderungen speichern].

Wenn nun eine Ihrer virtuellen Numbers eine SMS erhält, ruft Vonage diesen Webhook-Endpunkt mit den Details der Nachricht an.

Senden Sie eine Test-SMS

  1. Öffnen Sie ein neues Terminalfenster und führen Sie den Befehl server.js Datei, damit sie auf eingehende SMS wartet:

    node server.js
  2. Senden Sie von Ihrem Mobilgerät eine Test-SMS mit einer kurzen Textnachricht an Ihre Vonage-Nummer. Zum Beispiel: "Dies ist eine kurze Textnachricht".

Wenn alles richtig konfiguriert ist, sollten Sie eine Inbound SMS received Nachricht im Terminalfenster, in dem server.js.

Schreiben wir nun etwas Code, um die eingehende SMS zu analysieren und zu sehen, was die Nachricht enthält.

  1. Drücken Sie [CTRL+C], um das laufende Programm zu beenden. server.js Anwendung.

  2. Erstellen Sie eine neue Funktion in server.js genannt. displaySms():

    const displaySms = (msisdn, text) => {
        console.log('FROM: ' + msisdn);
        console.log('MESSAGE: ' + text);
        console.log('---');
    }
    
  3. Auch in server.js und bevor Ihr Code die 204 Antwort, fügen Sie einen Aufruf an displaySms() unter Verwendung der folgenden Parameter:

    displaySms(params.msisdn, params.text);
    
  4. Neustart server.js und senden Sie dann eine weitere Kurznachricht von Ihrem mobilen Gerät aus. Dieses Mal sollten Sie im Terminalfenster Folgendes sehen server.js:

    Inbound SMS received FROM: <YOUR_MOBILE_NUMBER> MESSAGE: This is a short text message.
  5. Behalten Sie server.js Aber dieses Mal verwenden Sie Ihr mobiles Gerät, um eine Nachricht zu versenden, die wesentlich länger ist als eine einzelne SMS es erlaubt. Zum Beispiel den ersten Satz aus Dickens' "A Tale of Two Cities":

    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. Prüfen Sie die Ausgabe im Terminalfenster, das gerade läuft server.js. Sie sollten etwas sehen, das dem Folgenden ähnelt:

    ---
    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.
    ---
    

Was ist passiert? Die Nachricht hat das Limit für ein einzelnes SMS-Byte überschritten und wurde daher als mehrere SMS-Nachrichten gesendet.

Damit wir unseren Nutzern solche Nachrichten in dem Format präsentieren können, für das sie gedacht waren, müssen wir erkennen, ob eine eingehende Nachricht auf diese Weise aufgeteilt wurde, und sie dann aus den Teilen wieder zusammensetzen.

In der obigen Ausgabe ist zu erkennen, dass die Teile nicht in der richtigen Reihenfolge eingetroffen sind. Dies ist nicht ungewöhnlich, daher müssen wir unseren Webhook so kodieren, dass er mit dieser Eventualität umgehen kann.

Handhabung von mehrteiligen SMS

Vonage übergibt vier spezielle Parameter an Ihren Webhook, wenn eine eingehende SMS verkettet wird. (Sie erscheinen nicht in der Anfrage, wenn es sich um eine einteilige SMS handelt.) Sie können sie verwenden, um die einzelnen Teile wieder zu einem kohärenten Ganzen zusammenzufügen:

  • concat:true - wenn die Nachricht verkettet wird
  • concat-ref - eine eindeutige Referenz, mit der Sie feststellen können, zu welcher SMS ein bestimmter Nachrichtenteil gehört
  • concat-total - die Gesamtzahl der Teile, aus denen sich die gesamte SMS zusammensetzt
  • concat-part - die Position dieses Nachrichtenteils in der gesamten Nachricht, so dass Sie die Teile in der richtigen Reihenfolge wieder zusammensetzen können

Erkennen, ob eine Nachricht verkettet ist

Zunächst müssen Sie erkennen, ob eine Nachricht verkettet ist. Ändern Sie die handleInboundSms() so dass sie dem Benutzer eine einteilige SMS auf die übliche Weise anzeigt, aber eine zusätzliche Verarbeitung für mehrteilige SMS durchführt, die Sie in einem späteren Schritt implementieren werden:

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();
}

Speichern Sie mehrteilige SMS zur späteren Verarbeitung

Wir müssen alle eingehenden SMS, die Teil einer größeren Nachricht sind, speichern, damit wir sie verarbeiten können, sobald wir alle Teile haben.

Deklarieren Sie ein Array außerhalb der handleInboundSms() Funktion genannt concat_sms. Wenn eine eingehende SMS Teil einer längeren Nachricht ist, speichern Sie sie in dem Array:

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();
}

Sammeln Sie alle Teile der Nachricht

Bevor wir überhaupt versuchen, die Nachricht aus ihren Teilen wieder zusammenzusetzen, müssen wir sicherstellen, dass wir alle Teile für eine bestimmte Nachrichtenreferenz haben. Denken Sie daran, dass es keine Garantie dafür gibt, dass alle Teile in der richtigen Reihenfolge eintreffen, es geht also nicht nur darum, zu prüfen, ob concart-part ist gleich concat-total.

Wir können dies durch Filtern der concat_sms Array, um nur die SMS-Objekte aufzunehmen, die dieselbe concat-ref als die SMS, die wir erhalten haben. Wenn die Länge dieses gefilterten Arrays gleich ist wie concat-totaldann haben wir alle Teile für diese Nachricht und können sie wieder zusammensetzen:

    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);
        }
    } 

Setzen Sie die Nachrichtenteile wieder zusammen

Da wir nun alle Teile der Nachricht haben, aber nicht unbedingt in der richtigen Reihenfolge, können wir die Array.sort() Funktion, um sie in der folgenden Reihenfolge wieder zusammenzusetzen concat-part. Erstellen Sie die processConcatSms() Funktion, um dies zu tun:

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 des Empfangs einer verketteten SMS

ausführen. server.js und verwenden Sie Ihr mobiles Gerät, um die lange Textnachricht erneut zu senden, die Sie in Schritt 5 der Anleitung Senden Sie eine Test-SMS Abschnitt oben.

Wenn Sie alles richtig kodiert haben, wird in der server.js Fenster sollten Sie sehen, wie die einzelnen Teile der Nachricht ankommen. Wenn alle Teile eingetroffen sind, wird die vollständige Nachricht angezeigt:

[ { 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.
---

Schlussfolgerung

In diesem Lehrgang haben Sie eine Anwendung erstellt, die Ihnen zeigt, wie Sie eine verkettete SMS aus ihren einzelnen Teilen wieder zusammensetzen können. Sie haben gelernt, wie die concat, concat-ref, concat-totalund concat-part Anforderungsparameter für Ihren eingehenden SMS-Webhook und wie Sie sie zur Bestimmung verwenden können:

  • Wenn eine eingehende SMS verkettet wird
  • Zu welcher Nachricht ein bestimmter Nachrichtenteil gehört
  • Wie viele Nachrichtenteile die vollständige Nachricht ausmachen
  • Die Reihenfolge eines bestimmten Nachrichtenteils innerhalb der vollständigen Nachricht

Wie geht es weiter?

Die folgenden Ressourcen helfen Ihnen, Number Insight in Ihren Applications zu verwenden: