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:
- Criar o projeto - criar um aplicativo Node.js/Express
- Torne seu aplicativo acessível pela Internet - uso
ngrokpara permitir que a Vonage acesse seu aplicativo por meio de um webhook - Criar o aplicativo básico - criar um aplicativo com um webhook para receber SMS
- Registre seu webhook na Vonage - informe os servidores da Vonage sobre o seu webhook
- Enviar uma mensagem SMS de teste - certifique-se de que seu webhook possa receber SMS
- Lidar com SMS em várias partes - reunir uma mensagem SMS composta por várias partes em uma única mensagem
- 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:
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:
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:
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
expressestrutura ebody-parserpara analisar solicitações POST). - Registra um
/webhooks/inbound-smsrota 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 HTTPsuccessresposta à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
-
Abra uma nova janela do terminal e execute o
server.jsarquivo para que ele fique à espera de SMS recebidas:node server.js -
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.
-
Pressione [CTRL+C] para encerrar o processo em execução
server.jsaplicativo. -
Crie uma nova função em
server.jschamadodisplaySms():Copiarconst displaySms = (msisdn, text) => { console.log('FROM: ' + msisdn); console.log('MESSAGE: ' + text); console.log('---'); } -
Também em
server.jse antes que seu código envie o204resposta, adicione uma chamada paradisplaySms()utilizando os seguintes parâmetros:CopiardisplaySms(params.msisdn, params.text); -
Reiniciar
server.jse, em seguida, envie outra mensagem curta do seu celular. Desta vez, você deverá ver o seguinte na janela do terminal em execuçãoserver.js:Inbound SMS received FROM: <YOUR_MOBILE_NUMBER> MESSAGE: This is a short text message. -
Manter
server.jsfuncionando, 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:CopiarIt 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.' -
Verifique a saída na janela do terminal em que o programa está sendo executado
server.js. Você deverá ver algo semelhante ao seguinte:Copiar--- 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 é concatenadaconcat-ref- uma referência única que permite determinar a qual SMS uma determinada parte da mensagem pertenceconcat-total- o número total de partes que compõem todo o SMSconcat-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: