Como Criar um Bot para o Telegram em PHP (Parte 2)

No primeiro post sobre como desenvolver um bot para o Telegram, eu mostrei como criar e registrar o bot com o BotFather.

Neste post, eu irei demonstrar como implementar o bot em PHP, mas é possível também implementar em outras linguagens como Python, por exemplo. Sabendo disso, o primeiro passo para começarmos a implementar o bot é estudarmos a API do Telegram para a criação de bots, a qual pode ser vista neste link: https://core.telegram.org/bots/api

Obviamente, para esse tutorial não será necessário conhecer toda a API. Sendo assim, separei na tabela abaixo os métodos que iremos utilizar com descrição, entrada e saída.

MétodoDescriçãoEntradaSaída
getUpdatesObtém as atualizações recebidas pelo botoffset, limit, timeout (todos opcinais)Array de Updates
sendMessageEnvia mensagens de textochat_id, text, parse_mode (opcional), disable_web_page_preview (opcional), disable_notification (opcional), reply_to_message_id (opcional), reply_markup (opcional)A mensagem enviada (Message)

Agora que já conhecemos os métodos que usaremos na troca de mensagens entre o bot e os usuários, o próximo passo é pensar de onde vamos retirar os resultados das loterias para serem exibidos. Com esse objetivo, eu procurei diversas API que disponibilizassem esses dados, porém algumas são pagas e outras apresentaram quedas de conexão em alguns momentos. Por isso, eu resolvi não utilizar nenhuma delas.

Em vez de utilizar API de terceiros, decidi fazer o parser da página do portal G1 que apresenta os resultados dos sorteios da loteria. A página oficial da Caixa Econômica que exibe os resultados é um pouco mais complexa para retirar os dados, por isso optei pela página do G1 que possui uma formatação mais simples, o que facilita o desenvolvimento do parser.

Como auxílio para fazer o parser da página em PHP, eu resolvi fazer uso da “biblioteca” Simple HTML DOM PARSER. Esse script em PHP será usado para extrair os dados da página do G1 para que o bot utilize-os como resposta.

Com tudo definido, a próxima etapa é escrever o código do bot. Para uma melhor explicação eu dividi a implementação em dois arquivos: loteriasbot.php e parser.php. No loteriasbot.php, como é possível ver abaixo, fica a implementação do bot propriamente dita. Nele, nós inserimos o TOKEN gerado anteriormente (veja a parte 1 desse post) junto a URL de registro de bots do Telegram (https://api.telegram.org/bot).

No arquivo loteriasbot.php existe o método processMessage, o qual é responsável por manipular as mensagens recebidas pelo bot. Essas mensagens são obtidas por meio do método getUpdates da API do Telegram. Sendo assim, quando o método processMessage é chamado, ele verifica, a partir da mensagem recebida, qual loteria o usuário deseja saber o resultado e envia uma resposta. Caso a mensagem recebida pelo processMessage tenha sido “/start”, o bot envia uma mensagem de boas-vindas.

As respostas às solicitações recebidas pelo bot são enviadas através do método sendMessage. Esse método recebe como parâmetro o nome do método da API do Telegram que realiza o envio da resposta (cujo nome também é sendMessage xD) e seus respectivos parâmetros. A tabela abaixo descreve cada um dos parâmetros que foram passados no método sendMessage da API do Telegram.

ParâmetroDescrição
chat_idID do chat para o qual será enviada a mensagem
textConteúdo da mensagem
keyboardGera um teclado de opções para o usuário. As opções são enviadas no formato de array, sendo cada linha do teclado composta por um array
one_time_keyboardDefine que o teclado será minimizado após ser usado

Com as principais partes do loteriasbot.php já conhecidas, podemos partir para analisar o arquivo parser.php, o qual pode ser visto abaixo.

O parser.php, como mencionei anteriormente, é responsável por obter o HTML da página e extrair os resultados da loteria. Toda essa ação é realizada dentro do método parser. Nesse método, a página é obtida e os dados são retirados de acordo com o componente HTML e a classe CSS associada a ele. A saída do método parser é uma string gerada a partir dos dados extraídos.

O método getResult, presente no parser.php, serve para obter o parser e montar a resposta ao usuário de acordo com a loteria escolhida.

Pronto, agora nosso bot está implementado. Neste ponto em que estamos, já é possível testar o bot. Porém, as respostas dele ainda não estão automáticas. Sendo assim, caso você queria testá-lo, para cada comando que for enviado ao bot, você deve dar um reload na página loteriasbot.php para que ele possa enviar a mensagem de resposta.

O envio de repostas automaticamente pelo bot faz uso de uma funcionalidade chamada Webhook, a qual será explicada na terceira parte do tutorial. Até lá!

Qualquer dúvida, deixa um comentário!

 

22 Comment

  1. Krislen says: Responder

    Ola, gostei muito da tutorial. Gostaria de criar um Bot Sorteio de frases. O usuário chuta um numero e o bot envia uma frase. Alguma ajuda?

    1. Luiz Marcus Luiz Marcus says: Responder

      Oi, Krislen!

      Que bom que você gostou.

      Para fazer esse bot, você pode usar o código que está na parte 3 do tutorial e tentar fazer algo parecido com o código abaixo:

      $numero_recebido = $message[‘text’];
      sendMessage(“sendMessage”, array(‘chat_id’ => $chat_id, “text” => gerar_texto($numero_recebido)));

      No método gerar_texto, você põe a lógica para a geração das frases.

      Espero ter ajudado.

  2. Ótimo tópico, curti.

    Eu tava querendo fazer um bot que a pessoa digita um pedido de livro e ele me envia a mensagem desse pedido, tem como isso? Não consegui achar nenhum código para coisas assim.

    1. Luiz Marcus Luiz Marcus says: Responder

      Oi, Ana. Obrigado pelo elogio.
      Acho difícil encontrar código pronto para o tipo de bot que você quer fazer. Não entendi se o pedido é para a pessoa comprar o livro. Mas não é tão complicado de implementar esse bot não.
      Você pode desenvolver um bot que pergunte qual livro o usuário deseja, receba o nome e te envie um email com o nome do usuário e o pedido, por exemplo. Poderia salvar esse pedido em um banco de dados também e listá-los em algum lugar.
      Com o código que tem aqui no blog, dá pra fazer isso com algumas adaptações.
      Feliz Natal!

  3. Joabe says: Responder

    Ola boa noite amigo;
    Otimo tutorial, porem eu nao entendi, depois de criado o bot no botfather, onde eu subo os arquivo loteriasbot.php e parser.php, para onde mando esse arquivos, algum servidor web, para o proprio botfather?

    Obrigado

    1. Luiz Marcus Luiz Marcus says: Responder

      Vlw pelo elogio, Joabe!
      O BotFather serve apenas para você registrar seu bot no Telegram. Os arquivos devem ser hospedados em um servidor web com suporte a SSL.
      Feliz Ano Novo!

      1. Ana Eliza says: Responder

        Git Hub tem este suporte SSl?

        1. Luiz Marcus Luiz Marcus says: Responder

          Oi, Ana!
          Suporta sim. Mas se eu não me engano, o GitHub não suporta PHP.

          Espero ter ajudado.

  4. Emerson says: Responder

    Cara ótimo tutorial, tenho uma dúvida, estou criando um bot só que gostaria de armazenar o valor digitado pelo usuário em uma variável e não estou conseguindo, como posso proceder ? ex: o bot faz uma pergunta para o usuário ” qual sua idade ?” , como faço para armazenar essa informação em uma variável e utilizar depois.

    1. Luiz Marcus Luiz Marcus says: Responder

      Vlw pelo elogio, Emerson!

      Uma forma de armazenar a resposta do usuário é fazer uso de um banco de dados. Assim, você pode usar o chat_id como chave primária, por exemplo, e salvar as respostas do usuário correspondente. A vantagem de utilizar um banco de dados é que sempre que o usuário iniciar uma conversa, o bot já saberá quais respostas foram dadas as perguntas anteriormente através de uma busca pelo chat_id.

      Espero ter ajudado.

  5. Leonardo says: Responder

    Como faço pra pôr tudo isso no bot? ‘-‘

    1. Luiz Marcus Luiz Marcus says: Responder

      Oi, Leonardo.

      É só seguir o tutorial que você consegue fazer um bot igualzinho. =]

  6. Muito bom o tutorial! Uma dúvida.
    Coloquei pra rodar aqui o bot utilizando este código e, sempre que clico em F5 para a pagina atualizar, ele envia uma nova mensagem para o cliente que falou com o bot. Ou seja, o cliente falou uma vez, e o bot envia para este cliente a mesma mensagem sempre que a pagina é atualizada.
    Também acontece com voce?

    1. Luiz Marcus Luiz Marcus says: Responder

      Olá, José!

      O comportamento do seu bot está correto.
      Isso acontece porque quando você pressiona F5, o bot sempre pega a ultima mensagem recebida. Vamos supor que você programou seu bot para, simplesmente, repetir a mensagem enviada pelo usuário. Quando o usuário envia “Oi”, ao você pressionar F5, o bot responde “Oi”. Mesmo que você pressione F5 várias vezes, o bot continuará respondendo “Oi”. Quando o usuário enviar “Tchau” e você pressionar F5, ai sim, seu bot mudará a resposta para “Tchau”.

      Quando seu bot estiver em produção com o Webhook, ele vai responder apenas uma vez.

      Enfim, está tudo correto. =]

  7. Luís boa tarde! Primeiramente gostaria de parabenizar pelo tutorial, muito didático. Fiz todos os passos , funcionou perfeitamente, mas quando ativei o o webhook , o meu bot deixou de responder…. o endereço qual eu apontei esta no endereço https://bekamce.com.br/ a minha pergunta é… Para o WebHook funcionar o certificado deve ser emitido por alguma entidade certificadora? No meu caso eu mesmo criei o certificado.

    1. Luiz Marcus Luiz Marcus says: Responder

      Obrigado pelo elogio, Umarley!

      Seu bot pode ter parado de responder por vários motivos. Primeiro, a URL que você seta como Webhook deve ser a que o bot usa para montar a resposta, https://bekamce.com.br/seubot.php, por exemplo. Se isso não resolver, veja se no código você está pegando as mensagens através do método file_get_contents("php://input");(eu explico na parte 3 do post).

      Não entendo muito sobre certificados SSL, mas como sua URL está acessível por HTTPS, acho que não está com problema.

      Espero ter ajudado.

  8. Alguém sabe como ocultar LINKS no Telegram? Sigo alguns canais onde as postagens contém links escondidos em emojis e isso é muito interessante.

    1. Luiz Marcus Luiz Marcus says: Responder

      E ae Fabio, blz?

      Acho que os links que você citou são dos posts do canal. Todos os posts de um canal do Telegram tem um link associado. Você pode inclusive compartilha esse link e quando outra pessoa clicar nele, ela vai direto para o post do canal.
      Não sei nada a respeito de links escondidos em emojis.
      Se alguém souber algo sobre isso e quiser responder, pode comentar aqui. =]

  9. Olá Luiz, tudo bem?

    Muito bom esse tutorial! Mas confesso que estou meio perdido. Como eu faço essa conexão do bot com esse arquivo php que criamos. O GitHub aceita, mas qual o comando dentro do php que faz esse link?

    1. Luiz Marcus Luiz Marcus says: Responder

      Tudo blz, Tandder!

      Para que o bot use a sua URL para gerar as respostas do bot, você deve setá-la como Webhook.
      Na parte 3 do post eu explico como setar o Webhook de um bot para o Telegram: https://luizmarcus.com/php/como-criar-um-bot-para-o-telegram-em-php-parte-3/
      Dá uma lida lá e, se ainda tiver dúvida, deixa outro comentário. =]

  10. Muito bom, você saberia dizer se tem como enviar no grupo se alguma pessoa tirar print da tela e impedir o compartilhamento de mensagens no grupo?

    1. Luiz Marcus Luiz Marcus says: Responder

      E ae Rafael, blz?
      O bot pode gerenciar as mensagens enviadas para um grupo. Para isso, você precisa desabilitar o privacy mode e adicionar o bot no grupo. Feito isso, o bot poderá ler todas a mensagens enviadas ao grupo e usar métodos como o delete message para apagar as mensagens.
      Até onde eu sei, não é possível o bot verificar se uma pessoa tirou print da tela, uma vez que o bot não tem acesso aos eventos gerados no sistema operacional do dispositivo.
      Espero ter ajudado. =]

Deixe uma resposta