Solicitar e manipular o número de telefone e a localização com a API Telegram Bot

Pavel Gerasimov Blocked Unblock Seguir Seguindo 12 de março de 2017

Ainda estamos trabalhando no robô de amostra para receber pedidos na loja on-line. Última vez que terminamos com um projeto implantado no heroku, conectado ao mongodb e capaz de armazenar mensagens no banco de dados

Se quisermos atender aos pedidos de nossos clientes, precisamos conhecer o telefone de contato deles para confirmar o pedido e, opcionalmente, a localização deles para entregar o pedido. O Telegram fornece essas duas coisas com teclados personalizados

A ideia principal aqui é usar um teclado com os botões "Compartilhar meu número de telefone" e "Compartilhar minha localização". Quando o usuário pressiona esse botão, nosso manipulador do lado do servidor recebe uma mensagem contendo informações de localização ou contato.

sendMessage suporta diferentes tipos de marcações de resposta. Nós somos interessantes em InlineKeyboardMarkup e ReplyKeyboardMarkup – ambos suportam botões customizados. Teclados embutidos aparecem ao lado das mensagens a que pertencem e os teclados de resposta aparecem na parte inferior da tela. Ambos os teclados têm uma matriz de arrays de botões (um teclado pode ter várias linhas de botões). Para a nossa tarefa, os teclados inline são inúteis – somente responda solicitações de suporte por keyboars para contato ou localização

Vamos criar um manipulador para a mensagem /place_order . Ainda estamos usando https://github.com/yagop/node-telegram-bot-api com base no EventEmitter, que será útil em nosso trabalho. Vamos fingir que nosso cliente escolheu bens ou serviços e o último passo é nos informar seus detalhes de contato e entrega

 bot.onText (/ ^  / place_order /, function (msg, match) { 
var option = {
"parse_mode" : "Markdown" ,
"reply_markup" : {
"one_time_keyboard" : true
"teclado" : [[{
texto: "meu número de telefone" ,
request_contact: true
}], [ "Cancelar" ]]
}
};
bot.sendMessage (msg.chat.id, "Como podemos entrar em contato com você?" , opção) .then (() => {
// manipula o telefone do usuário
})

});

Teclado personalizado em resposta

Como podemos lidar com o número de telefone obtido do usuário? Vamos dar uma olhada no fluxo de trabalho do Telegram.

Quando o usuário envia alguma coisa para o nosso bot, a mensagem chega ao servidor Telegram e está sendo armazenada lá por 24h até que o bot o receba. O bot usa webhooks ou sondagens longas para obter atualizações do servidor. Cada atualização contém no máximo um dos parâmetros opcionais – estamos interessados em Mensagem .

A própria mensagem tem muitos parâmetros opcionais, portanto, quando nosso cliente API do Bot recebe atualizações, elas são processadas como texto, foto, jogo, adesivo, contato, localização, etc. node-telegram-bot-api emite um evento para cada tipo de conteúdo então só precisamos adicionar um ouvinte

 bot.on ( "contato" , (msg) => { 
bot.sendMessage (msg.chat.id,
util.format ( 'Obrigado% s com o telefone% s!' , msg.contact.first_name, msg.contact.phone_number),
opção)
})

Ele irá disparar toda vez que o usuário nos enviar suas informações de contato. Para evitar manipular a mensagem de diferentes locais, vamos alterar .on() com .once() e agora nosso manipulador processará apenas a primeira mensagem. Exemplo mais complexo é usar addListener e removeListener para evitar que ele fique ativo depois que o usuário pressionar o botão “Cancelar”

Para sua biblioteca de APIs Bot, você deve encontrar a implementação de getUpdates() e ver como diferentes tipos de conteúdo dentro de uma mensagem são emitidos para o lado do cliente.

A próxima coisa importante é solicitar detalhes de entrega. Vamos supor que nosso cliente use o bot em casa ou no escritório – para que possamos oferecer a localização atual dele como padrão para entrega. Vamos solicitar a localização atual do nosso cliente depois de receber suas informações de contato:

 bot.onText (/ ^  / place_order /, function (msg, match) { 
var option = {
"parse_mode" : "Markdown" ,
"reply_markup" : {
"one_time_keyboard" : true
"teclado" : [[{
texto: "meu número de telefone" ,
request_contact: true
}], [ "Cancelar" ]]
}
};
bot.sendMessage (msg.chat.id, "Como podemos entrar em contato com você?" , opção) .then (() => {
bot.once ( "contato" , (msg) => {
var option = {
"parse_mode" : "Markdown" ,
"reply_markup" : {
"one_time_keyboard" : true
"teclado" : [[{
texto: "minha localização" ,
request_location: true
}], [ "Cancelar" ]]
}
};
bot.sendMessage (msg.chat.id,
util.format ( 'Obrigado% s com o telefone% s! E onde você está?' , msg.contact.first_name, msg.contact.phone_number),
opção)
.then (() => {
bot.once ( "localização" , (msg) => {
bot.sendMessage (msg.chat.id, "Entregaremos seu pedido para" + [msg.location.longitude, msg.location.latitude] .join ( ";" ));
})
})
})
})

});

Desculpe por dados pessoais ocultos, mas sim – funciona!

Isso funciona bem agora. Existem muitos clientes para a API Bot, mas o fluxo de trabalho comum é enviar o Reply Keyboard com request_contact=true ou com request_location=true e manipular corretamente o resultado getUpdates()

Na próxima vez, vamos dar uma olhada nos estados e fluxo de trabalho do nosso bot e vamos implementar uma pequena amostra para uma loja online real.

Texto original em inglês.