Recebimento de SMS concatenadas

Mensagens SMS que ultrapassar um determinado comprimento são divididas em duas ou mais mensagens mais curtas e enviadas como várias mensagens SMS.

Quando você usa a SMS API para receber SMS recebidas que pode ser maior do que o comprimento em bytes permitido para um único SMS, você deve verificar se as mensagens entregues ao seu webhook podem ser mensagens independentes ou parte de uma mensagem SMS composta por várias partes. Se a mensagem tiver várias partes, é necessário reuni-las para exibir o texto completo da mensagem.

Este tutorial mostra como fazer isso.

Neste tutorial

Neste tutorial, você criará um aplicativo Node.js usando o framework Express que recebe SMS de entrada por meio de um webhook e determina se a mensagem é um SMS de parte única ou de várias partes.

Se a mensagem SMS recebida for composta por várias partes, o aplicativo aguarda até receber todas as partes da mensagem e, em seguida, as combina na ordem correta para exibi-las ao usuário.

Para isso, siga as etapas a seguir:

  1. Criar o projeto - criar um aplicativo Node.js/Express
  2. Torne seu aplicativo acessível pela Internet - uso ngrok para permitir que a Vonage acesse seu aplicativo por meio de um webhook
  3. Criar o aplicativo básico - criar um aplicativo com um webhook para receber SMS
  4. Registre seu webhook na Vonage - informe os servidores da Vonage sobre o seu webhook
  5. Enviar uma mensagem SMS de teste - certifique-se de que seu webhook possa receber SMS
  6. Lidar com SMS em várias partes - reunir uma mensagem SMS composta por várias partes em uma única mensagem
  7. Teste de recebimento de um SMS concatenado - veja como funciona!

Pré-requisitos

Para concluir o tutorial, você precisa de:

  • A Account da Vonage - para sua chave e seu segredo da API.
  • ngrok - (opcional) para tornar seu servidor web de desenvolvimento acessível aos servidores da Vonage pela Internet.
  • Todos os clientes sediados nos EUA devem registrar uma marca e uma campanha para cumprir as exigências de 10 diretrizes para DLCs.

Criar o projeto

Crie uma pasta para o seu aplicativo, cd na pasta e, em seguida, use o gerenciador de pacotes do Node.js npm para criar um package.json arquivo com as dependências do seu aplicativo:

mkdir myapp cd myapp npm init

Pressione [Enter] para aceitar cada uma das configurações padrão, exceto entry point para o qual você deve inserir server.js.

Em seguida, instale o expresso estrutura de aplicativos web e a analisador de corpo pacotes:

npm install express body-parser --save

Torne seu aplicativo acessível pela Internet

Quando a SMS API recebe uma mensagem de texto destinada a um dos seus números virtuais, ela avisa seu aplicativo por meio de um webhook. O webhook oferece um mecanismo para que os servidores da Vonage se comuniquem com os seus.

Para que seu aplicativo seja acessível aos servidores da Vonage, ele deve estar disponível publicamente na Internet. Uma maneira de fazer isso durante o desenvolvimento e os testes é usar ngrok, um serviço que expõe servidores locais à Internet pública por meio de túneis seguros. Veja esta postagem no blog para mais detalhes.

Baixe e instale ngrok, em seguida, inicie-o com o seguinte comando:

ngrok http 5000

Isso cria URLs públicas (HTTP e HTTPS) para qualquer site que esteja em execução na porta 5000 no seu computador local.

Use o ngrok interface web em http://localhost:4040 e anote os URLs que ngrok prevê: você precisa deles para concluir este tutorial.

Criar o aplicativo básico

Criar um server.js Arquivo no diretório do seu aplicativo com o seguinte código, que será nosso ponto de partida:

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

Este código faz o seguinte:

  • Inicializa as dependências (as express estrutura e body-parser para analisar solicitações POST).
  • Registra um /webhooks/inbound-sms rota com o Express que aceita solicitações tanto GET quanto POST. Esse é o webhook que as APIs da Vonage usarão para se comunicar com nosso aplicativo quando um de nossos números virtuais receber um SMS.
  • Cria uma função de manipulador para a rota chamada handleInboundSms() que exibe uma mensagem informando que recebemos um SMS e retorna um HTTP success resposta às APIs da Vonage. Essa última etapa é importante; caso contrário, a Vonage continuará tentando enviar o SMS até que ocorra o tempo limite.
  • Executa o servidor de aplicativos na porta 5000.

Registre seu webhook na Vonage

Agora que você criou seu webhook, é preciso informar à Vonage onde ele está. Faça login na sua Painel de controle do account da Vonage e visite o configurações página.

Na sua aplicação, o webhook está localizado em /webhooks/inbound-sms. Se você estiver usando o Ngrok, o endpoint completo do webhook que você precisa configurar é semelhante a https://demo.ngrok.io/webhooks/inbound-sms, onde demo é o subdomínio fornecido pelo Ngrok (normalmente algo como 0547f2ad).

Insira o endpoint do seu webhook no campo intitulado URL do webhook para mensagens recebidas e clique no botão [Salvar alterações].

Agora, se algum dos seus números virtuais receber um SMS, a Vonage ligará para esse endpoint do webhook com os detalhes da mensagem.

Enviar uma mensagem SMS de teste

  1. Abra uma nova janela do terminal e execute o server.js arquivo para que ele fique à espera de SMS recebidas:

    node server.js
  2. Envie uma mensagem SMS de teste para o seu número da Vonage a partir do seu celular, com um texto curto. Por exemplo: “Esta é uma mensagem curta”.

Se tudo estiver configurado corretamente, você deverá receber um Inbound SMS received mensagem na janela do terminal em execução server.js.

Agora, vamos escrever um código para analisar o SMS recebido e ver o que a mensagem contém.

  1. Pressione [CTRL+C] para encerrar o processo em execução server.js aplicativo.

  2. Crie uma nova função em server.js chamado displaySms():

    const displaySms = (msisdn, text) => {
        console.log('FROM: ' + msisdn);
        console.log('MESSAGE: ' + text);
        console.log('---');
    }
    
  3. Também em server.js e antes que seu código envie o 204 resposta, adicione uma chamada para displaySms() utilizando os seguintes parâmetros:

    displaySms(params.msisdn, params.text);
    
  4. Reiniciar server.js e, em seguida, envie outra mensagem curta do seu celular. Desta vez, você deverá ver o seguinte na janela do terminal em execução server.js:

    Inbound SMS received FROM: <YOUR_MOBILE_NUMBER> MESSAGE: This is a short text message.
  5. Manter server.js funcionando, mas desta vez use seu celular para enviar uma mensagem consideravelmente mais longa do que um único SMS permite. Por exemplo, a primeira frase de “Um Conto de Duas Cidades”, 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. Verifique a saída na janela do terminal em que o programa está sendo executado server.js. Você deverá ver algo semelhante ao seguinte:

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

O que aconteceu? A mensagem ultrapassou o limite de um byte por SMS e, por isso, foi enviada em várias mensagens SMS.

Para podermos apresentar essas mensagens aos nossos usuários no formato pretendido, precisamos detectar se uma mensagem recebida foi dividida dessa forma e, em seguida, remontá-la a partir das partes.

Observe na saída acima que as peças não chegaram na ordem correta. Isso não é incomum, por isso precisamos programar nosso webhook para lidar com essa eventualidade.

Lidar com SMS em várias partes

A Vonage passa quatro parâmetros especiais para o seu webhook quando uma mensagem SMS recebida é concatenada. (Eles não aparecem na solicitação quando a mensagem SMS é de uma única parte.) Você pode usá-los para remontar as partes individuais em um todo coerente:

  • concat:true - quando a mensagem é concatenada
  • concat-ref - uma referência única que permite determinar a qual SMS uma determinada parte da mensagem pertence
  • concat-total - o número total de partes que compõem todo o SMS
  • concat-part - a posição dessa parte da mensagem no contexto da mensagem como um todo, para que você possa reorganizar as partes na ordem correta

Verificar se uma mensagem foi concatenada

Primeiro, é preciso verificar se uma mensagem está concatenada. Modifique o handleInboundSms() função para que ela exiba uma mensagem SMS de parte única ao usuário da maneira habitual, mas execute um processamento adicional para mensagens SMS de várias partes, o qual você implementará em uma etapa posterior:

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

Armazenar SMS com várias partes para processamento posterior

Precisamos armazenar todas as mensagens SMS recebidas que façam parte de uma mensagem maior, para que possamos processá-las assim que tivermos todas as partes.

Declare uma matriz fora do handleInboundSms() função chamada concat_sms. Se uma mensagem SMS recebida fizer parte de uma mensagem mais longa, armazene-a na matriz:

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

Reúna todas as partes da mensagem

Antes mesmo de tentarmos remontar a mensagem a partir de suas partes, precisamos garantir que tenhamos todas as partes correspondentes a uma determinada referência de mensagem. Lembre-se de que não há garantia de que todas as partes cheguem na ordem correta; portanto, não se trata apenas de verificar se concart-part é igual a concat-total.

Podemos fazer isso filtrando o concat_sms matriz para incluir apenas os objetos SMS que compartilham o mesmo concat-ref como a mensagem SMS que recebemos. Se o comprimento desse array filtrado for igual a concat-total, então temos todas as partes dessa mensagem e podemos, então, remontá-las:

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

Remonte as partes da mensagem

Agora que temos todas as partes da mensagem, mas não necessariamente na ordem correta, podemos usar o Array.sort() função para reorganizá-los na ordem de concat-part. Crie o processConcatSms() função para fazer isso:

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

Teste de recebimento de um SMS concatenado

Correr server.js e use seu celular para reenviar a mensagem de texto longa que você enviou na etapa 5 do Enviar uma mensagem SMS de teste seção acima.

Se você tiver programado tudo corretamente, então no server.js Na janela, você deverá ver as partes individuais da mensagem chegando. Quando todas as partes tiverem sido recebidas, a mensagem completa será exibida:

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

Conclusão

Neste tutorial, você criou um aplicativo que mostra como remontar uma mensagem SMS concatenada a partir de suas partes constituintes. Você aprendeu sobre o concat, concat-ref, concat-total, e concat-part parâmetros de solicitação do seu webhook de SMS recebidas e como você pode usá-los para determinar:

  • Se um SMS recebido for concatenado
  • A que mensagem pertence uma determinada parte da mensagem
  • Quantas partes compõem a mensagem completa?
  • A ordem de uma parte específica da mensagem dentro da mensagem completa

E agora, para onde vamos?

Os recursos a seguir vão ajudá-lo a usar o Number Insight em suas Applications: