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!

 

65 comentários em “Como Criar um Bot para o Telegram em PHP (Parte 2)”

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

      Responder
  1. Ó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.

    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!

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

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

    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.

      Responder
  4. 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?

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

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

    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.

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

      Responder
  6. 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?

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

      Responder
  7. Olá camarada, quero parabenizar vc pelo excelente conteúdo apresentado aqui em seu site. Gostaria de uma ajuda sua, como criar um bot para silenciar mensagem enviadas em um canal no telegrama apartir de um determinado horário determinado pelo usuário cliente. agradeço Camarada, Sucesso!!!

    Responder
    • Obrigado pelo elogio, Kevin!
      Para desabilitar as notificações das mensagens enviadas pelo seu bot para o canal, basta você setar o parâmetro disable_notification do método sendMessage como true. Antes do seu bot enviar a mensagem, ele pode checar a hora atual e atribuir true ou false ao disable_notification.
      Nunca fiz algo nesse sentido, mas deve funcionar.

      Responder
  8. Luiz, parabens pelo trabalho! Estou com um problema, segui exatamente seu passo a passo e no final recebo um warning quando atualizo o loteriasbot.php — Warning: file_get_contents(https://api.telegram.org/bot623992003:AAF_VOPHd7W0XJikrUwbk4_s5qOgxVpDeFk/sendMessage): failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request in /home/u670042329/public_html/loteriasbot.php on line 61

    Sabe o que pode ser? Pq ai nao envia a msg pro meu bot!

    Fico no aguardo de uma luz!

    Abraços

    Responder
    • Tudo blz, Maxwell?

      A pessoa deve iniciar a conversa com o bot, ai, só então, ele responde. Assim que essa conversa é criada, é gerado um chat_id. O bot utiliza esse chat_id para enviar as mensagens para a pessoa.

      Espero ter ajudado.

      Responder
  9. Luiz. Seu trabalho aqui me salvou. Consegui fazer funcionar rapidamente.
    Estou evoluindo para o usuário questionar algo e o bot buscar as informações num banco mysql e entregar no telegram.
    Minha dificuldade está em o comando select aceitar o $text como parâmetro. ex: ($sql_select = “select * from sites where site_2g like ‘”.$text.”‘”;). Se eu der em echo no php e rodar no navegador, ele apresenta a variável $text, mas no comando sql ela não é reconhecida.. 🙁
    Tem ideia de onde estou errando?
    Muito obrigado

    Responder
    • Olá, Leandro.

      Tenta assim:
      "select * from sites where site_2g like '$text'"
      ou
      "select * from sites where site_2g like '{$text}'"

      Espero ter ajudado.

      Responder
    • Olá, Uélinton. Obrigado pelo elogio.

      Dá pra por uma senha, sim. Quando o usuário iniciar uma conversa com o bot, ele pode solicitar uma senha e só responder aos comandos posteriores caso essa senha esteja correta. É tudo uma questão de implementação.

      Espero ter ajudado.

      Responder
  10. Olá!

    Tentei e apareceu o seguinte erro: Notice: Undefined offset: -1 in C:\xampp\htdocs\livia\telbot.php on line 59.

    Linha onde se encontra o erro: $update = $response[“result”][$length-1];

    Os arquivos estão idênticos ao que foi exposto aqui, só mudei o token. Alguém poderia me dar alguma ideia do que pode está ocorrendo?

    Responder
  11. Olá estou desenvolvendo um projeto e acomplado a ele estou tentando implementar o bot do telegram com esse código de vocês, mas está apresentando o seguinte erro:

    Notice: Undefined offset: -1 in C:\xampp\htdocs\livia\telbot.php on line 59

    A única modificação que fiz nos dois arquivos disponibilizados até a parte 2 desse código foi mudar o token. Alguém poderia me dar alguma ideia?

    Responder
  12. Olá. Luiz Marcus. Parabéns pela iniciativa em fazer o tutorial. Tem tutorial sobre como criar bot rss translate para canal no telegram?

    att,
    Alves R. : )

    Responder
    • Olá, Alves. Obrigado! =]

      Aqui no blog não existe tutorial sobre esse tipo de bot específico. Porém, você pode dar uma lida nos posts e tentar adaptar o que está descrito lá ao seu objetivo.

      Responder
  13. Olá, Luiz,
    Ótimo exemplo e muito boa sua didática, bem simples e direta.
    Porém, estou com o mesmo problema relatado pelo Pedro no dia 29/agosto/2018.
    Já retirei a palavra ‘bot’, a qual é necessária por ocasião do getupdates, mas continua dando o mesmo erro, conforme abaixo:

    Warning: file_get_contents(https://api.telegram.org/1620062405:AAFfj42-ABNWR73DENYQ9QcvwpRHw4RegNT/sendMessage): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in C:\www\ranking\controle\ctlenviamsgtelegram.php on line 34

    Poderia informar alguma dica para corrigir esse erro? a intenção é utilizar o bot apenas para envio de menssagem simples

    Obrigado,

    Nelson

    Responder
    • Nelson,

      Na verdade, eu me enganei na resposta ao Pedro, na URL é necessário ter a palavra ‘bot’, sim. Para verificar se eu bot realmente foi criado, você pode usar a seguinte URL no seu browser:
      https://api.telegram.org/bot/getMe
      Se a resposta for "ok":true, seu bot está criado corretamente.

      Após verificar que o bot realmente foi criado, você pode testar a chamada ao método sendMessage. Porém, esse método exige os parâmetros chat_id e o text. Sendo assim, a URL para o sendMesssage deve ficar da seguinte forma:

      https://api.telegram.org/bot/sendMessage?chat_id=SEU_CHAT_ID&text=QUALQUER_TEXTO

      Espero ter ajudado.

      Responder
  14. Ok, Luiz,

    Obrigado pela explicação. Me ajudou muito.
    Excelente trabalho o seu.
    Descobri, também, que estava usando o chat_id do grupo errado e, pesquisando, achei esse artigo que ensina a achar o ID correto, que coloco abaixo para ajudar outros inciantes, como eu.

    (dica retirada do site qastack.com.br)
    Para obter o ID do bate-papo em grupo, faça o seguinte:

    Adicione o Telegram BOT ao grupo.
    Obtenha a lista de atualizações para o seu BOT:
    https://api.telegram.org/bot/getUpdates
    Ex:
    https://api.telegram.org/bot123456789:jbd78sadvbdy63d37gda37bd8/getUpdates
    Procure o objeto “chat”:

    {“update_id”: 8393, “message”: {“message_id”: 3, “from”: {“id”: 7474, “first_name”: “AAA”}, “chat”: {“id”:, “title “:” “},” date “: 25497,” new_chat_participant “: {” id “: 71,” first_name “:” NAME “,” username “:” YOUR_BOT_NAME “}}}

    Responder
  15. Bom dia. Segui todos os passos, copiei todos os arquivos. Setei o webhook, porém meu bot não responde ao /start. Retirei o webhook e verifiquei que as msgs estao chegando com o getupdates. Criei uma pasta “SMS” na pasta public_html. E ja tentei colocando webhook com o endereço https://api.telegram.org/botMEUTOKENsetwebhook?url=https://MEUDOMINIO/bot.php
    E https://api.telegram.org/botMEUTOKENsetwebhook?url=https://MEUDOMINIO/SMS/bot.php da mesma forma. Poderia me dar uma luz? Obrigado

    Responder
  16. Bom dia.
    Primeiro excelente trabalho.

    Segui todos os passos, copiei todos os arquivos. Setei o webhook, porém meu bot não responde ao /start. Retirei o webhook e verifiquei que as msgs estao chegando com o getupdates. Criei uma pasta “SMS” na pasta public_html. E ja tentei colocando webhook com o endereço https://api.telegram.org/botMEUTOKENsetwebhook?url=https://MEUDOMINIO/bot.php
    E https://api.telegram.org/botMEUTOKENsetwebhook?url=https://MEUDOMINIO/SMS/bot.php da mesma forma. Poderia me dar uma luz? Aguardo o retorno.
    Obrigado

    Responder
  17. Olá Luiz, muito boa tarde. Cara… muito boa sua explicação e riqueza de detalhes. Gostaria de uma luz, estou pensando em fazer um bot para notificar uma galera que curte ondas de surf. A ideia seria assim. A galera acessa meu site, e preenche um pequeno formulário, com nome, telefone e e-mail. Depois, eu vou usar um link, levando para o meu bot de notificação. Quando ele acessar, e dar o star em seu telegram, começo a notificar ele via telegram diariamente. Com informações sobre o vento, ondas etc.
    Como faço para recuperar de maneira dinâmica os chat_id de cada um e associar com os usuários que informaram o tipo de informação que desejam receber no momento em que preencheram o formulário?

    Responder
    • Olá, Marcio. Obrigado pelo elogio! =)

      Para obter o chat_id é necessário que o usuário interaja com o bot. Sendo assim, quando o bot receber o comando /start, já será possível obter o chat_id. Para o bot diferenciar os usuários, você pode associar o chat_id ao email obtido no formulário e armazenar num banco de dados. Basta, que o bot solicite que o email seja digitado logo após receber o /start. Feito isso, é só trazer as informações de acordo com o email do usuário.

      Espero ter ajudado. =)

      Responder
      • Ajudou muito Luiz, obrigado… já fiz alguns testes aqui e a informação esta retornando corretamente.

        Você acha que o Whatsapp também pode ser trabalhado desta maneira, com a criação de bot e tratar as informações?

        Responder

Deixe um comentário