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

No segundo post sobre como desenvolver um bot para o Telegram, eu implementei em PHP tanto o bot quanto o parser usado para retirar os resultados das loterias do site do G1. Porém, ao finalizar toda a implementação, nosso bot ainda não era capaz de responder automaticamente às solicitações.

Neste post, eu irei demonstrar como fazer com que o bot responda aos comandos enviados pelo usuário de forma automática. Para isso, será necessário conhecermos uma funcionalidade da API do Telegram chamada Webhook.

O Webhook serve para integrar o bot com a página que define o seu comportamento. Dessa forma, quando um comando é enviado ao bot, a API do Telegram dispara um evento, o qual despacha a mensagem via HTTP para URL da página configurada junto ao Webhook.

Agora que já conhecemos o Webhook, podemos partir para setar o Webhook do nosso bot. Para isso, a API do Telegram possui o método setWebhook. Ele recebe como parâmetro a URL da página que “responde” pelo bot. Para que essa URL seja considerada válida pelo método setWebhook, é preciso que ela suporte o protocolo HTTPS. Sabendo disso, para chamar o método setWebhook é só abrir o browser e digitar o seguinte:

https://api.telegram.org/bot(SEU_TOKEN)/setwebhook?url=https://(SUA_URL)/seubot.php

Após acessar a URL na formatação acima, a resposta da API do Telegram será a seguinte:

{“ok”:true,”result”:true,”description”:”Webhook was set”}

Feito isso, devemos fazer alguns ajustes no arquivo loterias.php. A parte alterada está comentada no código a seguir.

Pronto, agora você já pode conversar com o seu bot e ver como ele responde automaticamente aos comandos enviados. Para verificar como o bot da loteria ficou ao final de todo este tutorial, você pode observar a sequência de imagens abaixo.

Digite “/start” para começar.

Bot de loterias

Quando o teclado de opções abrir, escolha a loteria que deseja ver o resultado.

Bot de loterias

Após escolher a loteria, o resultado é exibido pelo bot.

Bot de loterias

Que tal adicionar o bot que acabamos de criar no seu Telegram? Para isso, procure por “loteriascaixabot” no app ou acesse o seguinte link: https://telegram.me/loteriascaixabot.

Um detalhe importante que esqueci de comentar anteriormente foi que caso seja necessário remover o Webhook, basta usar a seguinte URL: https://api.telegram.org/bot(SEU_TOKEN)/setwebhook?url=

Para visualizar o código-fonte do bot que foi desenvolvido neste tutorial, acesse: Telegram Bot.

O bot desenvolvido neste tutorial foi hospedado na Umbler.

Agora que você já sabe como criar um bot para o Telegram, use a sua criatividade. Os bots podem resolver muitos problemas pelo mundo a fora. =]

E ai gostou do tutorial? Ficou com alguma dúvida? Então, deixe um comentário!

Errata

Caso você o bot não funcione quando você hospedar os arquivos no seu servidor, tenta desativar o mod_security na sua hospedagem. Essa foi uma dica do leitor Juliano Bazzi. =]

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

  1. Luiz,
    Muito bom, parabéns, excelente material.
    Me diga uma coisa, como faço para controlar sub-opções ou sub-menus, como queira chamar.
    Por exemplo, supondo que você tivesse um menu inicial no teu bot, com as opções, resultado jogo do bicho e resultados loterias, isso é só um exemplo.
    Clicando em loterias, o usuario poderia selecionar, sena, mega, etc… e Clicando em Jogo do Bicho, teriam outras opções, enfim.
    Como eu faço para quando o usuário for clicar em uma das sub-opções (ex.: sena), eu identifique que ele está na opção de loterias e não do jogo do bicho?
    Não gostaria de criar tabelas em banco de dados para cada clique em algum botão, eu tivesse que armazenar a opção em que o usuário se encontra entende.
    E também não gostaria de criar botões no bot como por exemplo [1]Loterias, [2]Jogo Bicho, e ter que ficar tratando as strings para ver em qual menu o usuário se encontra.
    No teu exemplo, é tranquilo para controlar, pois o usuário clica diretamente na opção deseja e boa, agora estou com essa dificuldade em controlar sub-opções.

    Se puder ajudar, agradeço imensamente.

    Abraços e novamente parabéns pelo material publicado.

    André

    Responder
    • E ae André, blz?

      Obrigado pelo elogio.

      Acho que encontrei a resposta para o seu problema. Dá uma olhada no Inline Keyboard da API do Telegram neste link: https://core.telegram.org/bots/2-0-intro#new-inline-keyboards
      Como esse componente dá pra você fazer o que você precisa. Quando a pessoa clicar no “Monitoramento de Rota”, você exibe um inline keyboard junto com a mensagem “Selecione o usuário a ser monitorado”. Assim, quando o usuário pressionar um das opções do inline keyboard, você pode enviar ao servidor os dados(identificador) da opção que ele escolheu.
      Para implementar isso, no método sendMessage, você seta o reply_markup como InlineKeyboardMarkup e cria os botões com InlineKeyboardButton.

      Espero ter ajudado.

      Responder
  2. Ola Luiz, gostaria de saber se e possivel criar um bot que pegas as informacoes coletadas e enviar para uma pagina de um site ?
    se sim pode dar um palinha de como ? agradeço desde já .

    Responder
    • E ae Lucas! Dá sim!

      Você pode, por exemplo, fazer com que o bot armazene as repostas que ele recebe em um banco de dados e exibi-las na página do site. Basta você pegar o código do tutorial, acrescentar a conexão com um banco de sua preferência e customizar as ações do bot de acordo com o que você precisar.

      Espero ter ajudado. Qualquer dúvida é só falar.

      Responder
    • E ae, Paulo! Blz?

      Você pode usar o método setPrivacy do BotFather. Quando ele está enabled, serve para o bot “escutar” apenas as mensagens enviadas ao grupo que começam com “/”. Se o setPrivacy estiver disabled, o bot “escuta” todas as mensagens que forem enviadas ao grupo. Quando o setPrivacy for desativado, como os comandos não vão mais precisar da “/”, seu bot terá que ler as palavras contidas nas mensagens para identificá-los.

      Responder
      • Eu fiz isso mas se o usuário enviar qualquer mensagem no grupo o bot resulta em “Desculpe, mas não entendi essa mensagem.” ou “Desculpe, mas só compreendo mensagens em texto” já removi essas duas partes e funcionou normal, mas não tem outra forma de habilitar essas mensagens somente para o modo privado?

        Responder
        • Paulo,
          É preciso usar o modo privado para retirar a necessidade do uso de “/” nos comandos. Na API não encontrei outra forma de fazer isso.
          Com relação as leituras das mensagens pelo bot, no primeiro momento não deve ter funcionado porque o código do bot estava comparando as strings inteiras, quando o correto seria usar o método strpos para verificar se algum comando está contido dentro da mensagem.

          Responder
  3. Ótimo tutorial. Simplesmente perfeito.

    Só uma ressalva, o resultado da lotofacil e lotomania estão invertidos.

    Estou usando já pra consultar os resultados.

    Responder
    • Boa noite, Margarida!
      Não tem nada de ignorante em sua pergunta. =]
      Você cria uma pasta chamada “bot” dentro da pasta do seu servidor e coloca os arquivos PHP lá dentro. Por exemplo, se você está usando o Apache no Linux, o endereço da pasta pode ser assim: /var/www/bot. Se estiver utilizando algum site de hospedagem, pode ficar assim: public_html/bot
      Qualquer dúvida, pode perguntar.

      Responder
    • Olá, Margarida!
      Tenta fazer o seguinte: acesse o dashboard do hostinger, em seguida, você a acessa o gerenciador de arquivos. Quando o gerenciador for aberto, uma das pastas contidas nele será a public_html. É nessa pasta que você deve por os arquivos do bot.
      Sendo assim, o link ficaria: http//seusite.com/loteriasbot.php
      Mas não esqueça que para setar a url como o webhook no Telegram é necessário que a hospedagem suporte SSL, ou seja, o link também precisa ser acessado via https. Verifique na hostinger se o SSL está ativo.
      Qualquer dúvida, é só falar.

      Responder
  4. Boa tarde Luiz Marcus, acho que estou quase lá kkkkkk, mas ainda não consegui.
    Quando seto o webhook https://api.telegram.org/bot261625282:AAHeVioqisXi4u7c-Q0aFOTu3iJj-4wrB9A/setwebhook?url=radioslandell.esy.es/telegram/loteriasbot2.php, retorna a mensagem beleza que deu certo {“ok”:true,”result”:true,”description”:”Webhook was set”}. Quando peço uma consulta no navegador https://api.telegram.org/bot261625282:AAHeVioqisXi4u7c-Q0aFOTu3iJj-4wrB9A/getupdates, também retorna a tela dos pedidos feito ao BOT {“ok”:true,”result”:[{“update_id”:510306359,
    “message”:{“message_id”:36,”from”:{“id”:239733994,”first_name”:”Margarida”},”chat”:{“id”:239733994,”first_name”:”Margarida”,”type”:”private”},”date”:1472489371,”text”:”\/start”,”entities”:[{“type”:”bot_command”,”offset”:0,”length”:6}]}}]}.
    Quando troco por https://api.telegram.org/bot261625282:AAHeVioqisXi4u7c-Q0aFOTu3iJj-4wrB9A/getme, ele retorna no navegador {“ok”:true,”result”:{“id”:261625282,”first_name”:”loteriasdandenovo”,”username”:”loteriasdandenovobot”}}.
    Só que no telegram não funciona, não acontece nada, não aparece as opções, não responde ao /start.

    Socorro, help

    Responder
    • Oi, Margarida! Desculpa pela demora para responder.

      Que bom que você está progredindo. kkk

      Depois que você seta o Webhook, as mensagens do getUpdate são recebidas pelo método “file_get_contents(“php://input”);” no código PHP. Verifique se essa linha está no seu código. Essa linha sempre lê a última mensagem recebida pelo bot.

      Para testar o recebimento das mensagens, você pode também fazer o método processMessage da seguinte forma:

      function processMessage($message) {
      // processa a mensagem recebida
      $message_id = $message[‘message_id’];
      $chat_id = $message[‘chat’][‘id’];
      if (isset($message[‘text’])) {

      $text = $message[‘text’];//texto recebido na mensagem
      sendMessage(“sendMessage”, array(‘chat_id’ => $chat_id, “text” => $text));
      }
      }

      Assim seu bot vai responder a qualquer mensagem recebida.

      Qualquer problema, é só falar.

      Responder
      • Olá Luiz, gostei muito do seu post, li as 3 partes e fiz tudo igualzinho ao que falou.. Sendo que estou com o mesmo problema que nossa colega Margarida, e inclusive testei isso que você passou aqui na resposta, mas não tive sucesso… Eu consegui ativar o Webhook normalmente, e o getMe também da retorno ok. Mas não sei porque o bot não responde “sozinho”.. Antes, quando fazia o refresh manual, ele enviava a resposta, mas depois, com o webhook não fica automático. O que pode ser?

        Responder
        • Olá, Guilherme!
          Primeiramente, obrigado pelo elogio!
          Com relação ao seu problema, já que você conseguiu receber as mensagens quando deu refresh manual, eu acho que o comando file_get_contents(“php://input”) deve ser o problema. Provavelmente, esse comando não esteja funcionando na sua hospedagem. Para verificar se o file_get_contents(“php://input”) está funcionando, você pode acrescentar a linha “echo $update_response;” logo após o comando e fazer um POST passando algum valor pra ver se ele é impresso. Caso o valor não seja exibido, veja com o suporte da sua hospedagem a causa do não funcionamento do comando file_get_contents(“php://input”).

          Em resumo, todas as mensagens enviadas ao bot, são recebidas pelo comando file_get_contents(“php://input”). Se esse comando não estiver funcionando, o bot não consegue ler as mensagens e, portanto, não as responde.

          Qualquer dúvida, é só falar. =]

          Responder
          • Estou com um problema parecido com o do Guilherme, depois q habilitei o webhook o bot não retorna nada, testei o file_get_contents como você pediu fazendo um teste com um post e os dados do post é exibido normalmente…. já cacei um monte de coisa na net mas sem solução, continua sem funcionar

          • Oi, Renato.
            Você está testando o bot em produção né? Se seu bot está recebendo a mensagem, acho que você deve estar pegando algum valor errado do json ou a resposta que seu bot deve enviar deve estar mal formatada. Dá uma olhada com mais calma.
            Qualquer coisa, manda o código para [email protected] que eu dou uma olhada. =]

    • Oi Margarita Boa noite, tomara vc este bem. Acho que sei qual pode ser o seu problema, quando vc executa a instrução setwebhook vc tem que asegurarse que o seu url deve ser um endereço q seja “https” tal qual como Luiz Marcus menciono no começo da terça parte do tutorial, senão é “https” nao vai dar certo mesmo.

      Saudaçoes

      Responder
  5. Boa tarde, Luiz!
    Agradeço muito pelo material postado e, principalmente, pela didática utilizada!
    A boa vontade de caras como você é que faz a web mais bacana!
    Voltarei mais vezes pra conferir o site e aprender coisas novas!
    Grande abraço

    Responder
    • E ae Renê!

      Obrigado pelo elogio! =]
      São comentários como o seu que fazem agente querer continuar compartilhando conhecimento.
      Mais uma vez obrigado e volte sempre.

      Responder
  6. Oi Boa noite Luiz, muito agradecido pelo seu tutorial, tenho que dizer que foi de grande ajuda, procure muitos sites pra obter informação de como fazer o primer bot, mas com certeza o seu tutorial pode ser considerado uns dos melhores, simples e complento. Tambem gostaria fazer uma pergunta, executei seu codigo no meu bot é todo funciono perfeito apenas tive, ou tenho, um problema, o bot nao deixa de actualizar e nao deixa de repetir a menssagem, nao deixa de responder ate que nao estou escrevendo, tomara vc possa me dar uma luz.

    Agradecido novamente,

    Edilio

    Responder
    • Oi, Edilio.

      Obrigado pelo elogio. Ainda bem que o tutorial te ajudou. =]

      Pelo que eu entendi, o seu problema é o fato de o bot estar repetindo sempre a mesma mensagem e respondendo mesmo sem você falar. A causa desse problema pode ser a fila de mensagens enviadas ao bot. É necessário que no código, o bot leia apenas a última mensagem recebida. Se você já hospedou seu bot em um servidor remoto, basta você copiar o código que está no link abaixo e testar:
      https://github.com/luizmarcus/PHP/blob/master/telegrambot/loteriasbot.php
      O código presente no link acima usa o file_get_contents(“php://input”) para obter sempre a última mensagem recebida.
      Caso você esteja testando localmente(localhost), é normal que o bot fale sozinho pois a fila de mensagens pode não estar vazia, assim ele acaba lendo a última mensagem do array (veja o código da parte 2 do tutorial) e respondendo.
      Teste em um servidor remoto. Muito provavelmente, deve funcionar.

      Qualquer problema, pode perguntar.

      Responder
    • E ae Rafael, blz?

      Para desenvolver um bot que possa armazenar lembretes e alerta a pessoa, é necessário fazer uso de um banco de dados para guardar os lembretes(data e mensagem) e a pessoa(chat_id) a qual eles pertencem. Para saber se tem algum lembrete para um determinado dia, a pessoa pode perguntar ao bot, enviando a palavra “checar”, por exemplo. Dessa forma, o bot responderia com os lembretes daquele dia.
      É um exemplo simples, mas que dá pra fazer com o código do tutorial.
      Espero ter ajudado.

      Responder
  7. Opa, Tudo bom Luiz Marcus?
    bom consegui quase todos os métodos des de envio de arquivos, há mensagens e dados simples..
    Mas… o que não consegui é implementar o inline_keyboard.. li toda documentção faço como diz la..
    ‘reply_markup’ => array(‘inline_keyboard’ => array(array(‘text’ => ‘meu botão’, ‘url’ => ‘http://exemplo.com’)))

    mas os botões não geram, e apenas me retorna a função seguinte!!! estou fazendo algo de errado?

    Responder
    • Tudo certo, Rafael!
      A resposta para o seu problema é bastante simples. O inline_keyboard pode ter botões na mesma linha ou em linhas diferentes. Cada linha de botões do inline_keyboard deve ser montada em um array diferente. Dentro do array da linha, você acrescenta o array referente a cada botão que compõe a linha. No código abaixo, eu fiz um inline_keyboard com dois botões na mesma linha:

      'reply_markup' => array('inline_keyboard' => array(array(array('text'=>'meu botão','url'=>'http://google.com'),array('text'=>'meu outro botão','url'=>'http://google.com'))))

      Testa e vê se funciona.
      Qualquer dúvida é só falar.

      Responder
  8. Não achei nas respostas, mas tem como “limpar” a mensagem depois de respondido? A cada F5 na pagina interna que fiz, ele manda a ultima resposta de novo.

    Responder
    • Tudo blz, Evandro?
      Se você estiver usando o bot localmente, sempre que você der F5 pra pegar os updates, o bot sempre vai obter a fila de mensagens inteira. Nessa fila de mensagens, a ultima mensagem é sempre a mesma, se o usuário não mandou nada novo. Então, todas as vezes que você apertar F5, a resposta do bot será a mesma. Até onde eu sei não tem como limpar a fila. Porém, se seu bot estiver em produção, ou seja, usando um Webhook, esse problema desaparece.

      Uma forma(para não dizer armengue xD) de resolver esse problema é armazenar o ultimo message_id e só deixar o bot responder quando um novo message_id for inserido na fila.
      Vê se funciona.

      Qualquer coisa, só falar.

      Responder
  9. Oi Luiz blz? Eu de novo aqui!!
    Bom é o seguinte, queria usar os botões para para da um update nas mensagens, vi um exemplo na DOC do Telegram API com um sistema de paginação no bot de muisca..
    Como eu poderia implementar algo semelhante, tentei quebrei a cabeça..
    é tipo assim: digito um comando, aparece a msg com os botões inline, e quando aperto esse botão a msg acima é atualizada. to precisando muito, gerencio u grupo de 2k então é muito flood de msgs, e muitas requisições desnecessárias no servidor!

    Agredeço muito se vc tiver uma solução para mim.. Tanks

    Responder
    • Blz, Rafael!
      Dei uma pesquisada e acho que encontrei a resposta para o seu problema. Não implementei para testar, mas vamos lá!
      Primeiro você cria um inline_keyboard com um callback. Esse callback serve pra você pegar o evento de clique no botão:

      "inline_keyboard" => array(array(array("text" => "Meu Botão", "callback_data" => "meuCallback")))

      Quando o usuário clicar no botão, o bot vai receber o callback. Para você receber o callback você faz o seguinte:

      $update_response = file_get_contents("php://input");
      $update = json_decode($update_response, true);
      $callback_query = $update["callback_query"]

      Na variável $callback_query você tem todos os dados que precisa para atualizar a mensagem. Agora, em vez de usar o método sendMessage para enviar a resposta, você usa o método editTextMessage. Eu nunca usei ele, então não sei como funciona, mas na documentação tem tudo explicado:

      https://core.telegram.org/bots/api#editmessagetext

      Se você seguir a documentação, acho que você consegue. =]

      Abrs.

      Responder
      • Luiz, Muito Obrigado pela paciência !
        Estava tentando usar o editMessageText sem pegar os dados da msg, estava fazendo de modo direto com o id do chat e da msg.. mas agr vi que o id muda não sei o pq,, mas enfim deu certo!!!
        Enfim com sua ajuda consegui, o resultado para meu problema é

        $callback_query = $update["callback_query"]; // Sua dica para instanciar a variável graças a ela obrigado!

        if (isset($update['callback_query'])){
        // extract what is required
        $chat_id = $callback_query['message']['chat']['id'];
        $user_id = $callback_query['from']['id'];
        $callbackdata = $callback_query['data'];
        $message_id = $callback_query['message']['message_id'];
        $text = $callback_query['message']['text'];
        // then send the message you want
        resposta('editMessageText', ['chat_id' => $chat_id, 'message_id'=> $message_id, 'text'=>'Minha msg atualizada ']);
        }

        Responder
  10. Olá Luiz, em paz? Espero que sim.
    Muito bom suas dicas man.
    Explica bem e deixa tudo muito claro.
    Segui todos os seus passos e ajudou muito com um projeto que havia parado aqui.
    Parabéns.
    Deixa te perguntar:
    Um dos clientes que tenho, precisou de um projeto e acabei desenvolvendo com o @Manybot.
    Não sei se já mexeu com ele ou com o Chatfuel para desenvolver algum Bot para o Telegram.
    Enfim, depois de feito o Bot (usando o Manybot), eu gostaria de ter acesso ao código fonte dele, será que isso é possível?
    Pois toda vez que alguém inicia o Bot criado, aparece uma mensage de início dizendo: Money_BotRobot:
    “Want to create your own bot? Go to @Manybot”
    Obrigado parceiro.
    Forte abraço e continue com suas dicas.
    Vc é fera.

    Responder
    • Tudo em paz e obrigado pelo elogio, Santiago!
      Pra ser sincero, eu nunca tinha ouvido falar do ManyBot nem do Chatfuel. Pelo que eu entendi, são ferramentas para criação de bots sem precisar codificar. Essas ferramentas devem armazenar apenas as funcionalidades e mensagens do seu bot em algum banco de dados. Eles não geram código nenhum. O seu bot é acessado através do servidor e do código fonte deles. Ou seja, eles não vão deixar você ver o código fonte. =[
      Como o ManyBot é free, a mensagem “Want to create your own bot? Go to @Manybot” é para marketing da ferramenta. Caso exista uma versão “Pro”, talvez você consiga retirar a mensagem pagando alguma taxa.

      Boa sorte com seu bot. =]

      Responder
  11. Olá Luiz Marcus tudo bem ?
    Primeiramente Parabéns pelo Material!
    Eu fiz tudo exatamente como vc mencionou em neste tutorial, porém nada acontece quando eu envio a mensagem /start ou quando eu recarrego a página em php, nada acontece.
    Meu servidor não tem suporte a ssl, será que é este o problema ?
    Obrigado

    Responder
    • Tudo bem, Ivan!
      Obrigado pelos parabéns.
      Um dos pré-requisitos para o bot funcionar é o suporte ao SSL. =[
      Muito provavelmente, esse é o problema. Tenta testar seu bot em uma hospedagem com SSL.

      Responder
  12. Parabéns pelo artigo Luiz, funcionou perfeitamente, porém, gostaria de saber como enviar foto e documento pelos metodos sendPhoto e sendDocument, não consegui implementar nesse código que passou. Poderia me ajudar?

    Responder
    • E ae Diego, blz?
      Para o bot enviar uma imagem ou documento para o usuário, você pode fazer da seguinte forma:

      sendMessage("sendPhoto", array('chat_id' => $chat_id, "photo" => 'url_da_imagem_ou_do_documento'));

      Essa forma só funciona se o arquivo estiver hospedado em algum servidor HTTP. Acho mais simples assim. Na documentação do Telegram, ele apresenta outras formas de envio.

      Responder
  13. Boa tarde Luiz.
    muito obrigado por passar o conhecimento.
    amigo estou com seguinte problema toda vez que rodo o php a ultima resposta e enviada novamente, como posso resolver isso?

    Responder
    • Ismael,
      Como você deve estar testando o bot localmente, o comportamento do código está correto.
      Isso acontece porque quando você pressiona F5, o bot sempre pega a última mensagem recebida.
      Quando você colocar seu bot em produção com o Webhook, ele vai responder apenas uma vez. =]

      Responder
  14. Ola Luiz,
    Fiz tudo, esta tudo setado e confirmado, inclusive esta tudo hospedado no mesmo site que voce “Umbler” e nada funciona depois que coloco /start
    onde estou errado?

    Responder
      • Ola amigo Luiz,
        Fiz isso peguei o código que disponibilizou e coloquei apenas o meu Token hospedei na Umbler.
        o Lets Encrypt na Umbler para ser ativado e obrigatório ter domínio registrado?

        Responder
        • E ae Bruno!
          Você precisa associar um domínio a sua hospedagem da Umbler para poder ativar o Lets Encrypt.
          Como vc já colocou o TOKEN, quando o HTTPS estiver ativado, seu bot deve funcionar.

          Qualquer dúvida, pode comentar. =]

          Responder
  15. Ola Luiz tudo bem?

    Consegui fazer funcionar graças a sua ajuda, estou querendo alterar uma url para colocar a minha que transmite uma informação, mais minha url é php, e noto que no no endereço da mega-sena esta em .HTML, so funciona com .HTML ou tem como alterar?

    desde já agradeço.

    <?php

    include('simple_html_dom.php');

    define('BASE_URL',"http://g1.globo.com/loterias/&quot;);
    define('URL_MEGA', BASE_URL.'megasena.html'); <<<<<<<<<<< aqui o meu seria em PHP tem como alterar esta regra?
    define('URL_QUINA', BASE_URL.'quina.html');
    define('URL_LOTOMANIA', BASE_URL.'lotomania.html');
    define('URL_LOTOCACIL', BASE_URL.'lotofacil.html');

    Responder
    • André,

      Ainda não existe nenhum material em vídeo desse post.
      Irei avaliar a possibilidade de fazer tutorias em vídeo, sim. =)
      Obrigado pela sugestão.

      Responder
  16. Amigo, tem como o Boot enviar uma msg para um usuário específico? Pois as mensagem são enviadas para todos que estão com o boot ativo, mas se eu precisar enviar para uma pessoa, tem como fazer?

    Responder
    • E ae Edmar, blz?

      Até onde eu sei, um bot para o Telegram não consegue iniciar uma conversa com o usuário. Sendo assim, o usuário inicia a conversa e o bot responde.
      O máximo que você consegue fazer é armazenar o chat_id da conversa iniciada para que o bot possa enviar futuras mensagens.

      Espero ter ajudado.

      Responder
    • Olá, Neto.

      Tem sim, basta você salvar uma lista de mensagens em um banco de dados, por exemplo. E quando o usuário falar com o bot, as frases são retornadas aleatoriamente como resposta do bot.

      Espero ter ajudado.

      Responder
  17. Oi Luiz parabéns pelo artigo.

    Consegui fazer o bot funcionar porém ele somente responde “Resultado – Mega-Sena Não encontrado”.
    Verifiquei no log que está dando erro no servidor:
    PHP Warning: file_get_contents(): stream does not support seeking in /var/home/server4325/public_html/lab/bot/simple_html_dom.php on line 76
    PHP Warning: file_get_contents(): Failed to seek to position -1 in the stream in /var/home/server4325/public_html/lab/bot/simple_html_dom.php on line 76

    Conseguiria me ajudar?

    Responder
    • Olá, Thalys. Blz?

      Na linha 76 do arquivo simple_html_dom.php está assim:
      $contents = file_get_contents($url, $use_include_path, $context, $offset);
      Tira a variavel $offset e deixa assim:
      $contents = file_get_contents($url, $use_include_path, $context);

      Veja se funciona.

      Responder
  18. Olá Luiz,

    Parabens pelo blog esta me ajudando muito mesmo.

    Estou com um problema, eu quero listar os dados da minha tabela do mysql em forma de botoes. Hoje ja consigo fazer isso mas em forma de texto, eu preciso que seja em forma de botoes para que o usuário possa clicar e o bot realizar outra consulta no mysql.

    Veja como estou fazendo de acordo com seu exemplo;

    $grupo_array = array(
    //linha 1
    array(
    array(‘text’=>’Coca-Cola 2L’, buscaritem(1) ), //botão 1
    array(‘text’=>’Coca-Cola 350ml’, buscaritem(2) )//botão 2

    ),
    //linha 2
    array(
    array(‘text’=>’Coca-Cola 600ml’, buscaritem(3) ), //botão 3
    array(‘text’=>’Coca-Cola 1L’, buscaritem(4) ) //botão 4
    )
    );

    Onde buscaritem() é a função que dispara quando o usuário clica no botão.

    Depois eu uso assim;

    sendMessage(“sendMessage”, array(‘chat_id’ => $chat_id, “text” => ‘Ok, ‘. $message[‘from’][‘first_name’].
    ‘! Escolha um dos itens abaixo para mais detalhes.’,
    ‘reply_markup’ => array(‘inline_keyboard’ => $grupo_array )));

    Seguindo nessa logica da certo sim, mas esse array eu mesmo digitei no PHP, mas eu preciso que esse array seja formado de uma tabela de estoque do banco do cliente.

    Uso PDO na minha conexão com o banco.

    Obrigado se puder ajudar!

    Responder
  19. Luiz,

    Baixei seus arquivos e subi pra minha hospedagem, fiz as configurações, porém não retorna nada no chat do usuário.

    Consegue me ajudar?

    Responder
    • Olá, João.

      Para o bot funcionar, você precisa seguir o passo a passo dos posts 1, 2 e 3. Lembrando que a sua hospedagem precisar ter suporte a HTTPS.

      Espero ter ajudado.

      Responder
  20. Luiz,

    Para enviar um arquivo (PDF) posso usar assim:

    sendMessage(“sendMessage”, array(‘chat_id’ => $chat_id, “document” => URL_DO_ARQUIVO);

    Isso funciona?

    Responder
  21. Bom dia Luiz!

    Ajudou sim, muito obrigado!

    Outra coisa que me deparei, é como “guardar” uma informação do bot. Por exemplo: no meu menu tem a opção de escolha para buscar informações no servidor, mas precisa “guardar” qual a opção e tipo o CPF. Quero pelo menos ter 2 critérios para buscar a informação (CPF e Data de Nascimento).

    É possível guardar o CPF e depois coletar a Data de Nascimento para buscar as informações?

    Obrigado.

    Responder
    • João,

      A API do Telegram não armazena esse tipo de informação. Você vai precisar armazenar esses dados de outra maneira, usando um banco de dados, por exemplo.

      Boa sorte com seu projeto!

      Responder
  22. Adorei o post. Parabéns pelo trabalho!
    Será que pode me ajudar? Como faço pro meu bot, que esta em um canal, excluir usuários desse canal?
    Desde ja, obrigada!

    Responder
  23. Olá, subi o codigo em uma host gratis ( infinityfree.net ) , Uso certificado CloudFlare ( https ), Troquei o token no php, fiz o setwebhook?url=https://neto.cf/bot/loteriasbot.php

    quando dou /start ou mando algo, não manda nada, o bot acessa meu site mas não acontece nada no bot
    https://neto.cf/bot/loteriasbot.php

    Será que o host que uso não tem suporte ou o certificado CloudFlare não funciona ?
    Tem algum php pra testar? favor mandar php completo

    Responder
  24. Fiz um comentário antes, em um host não estava funcionando o código, tentei em outro e funcionou, obrigado!

    Queria saber mais , vi que tem outro post para imagem , queria saber um para videos e outros arquivos

    Muito bom não precisar de composer ou algo mais alem de PHP para configurar um Bot do telegram , TOP!

    Responder
  25. Bom dia, tudo bem Marcus?

    Ótimo tutorial, apesar de ter sido elaborado a tantos anos, continua ajudando quem está iniciando. Fiz como indicado, e deu tudo certo com a interação do bot no grupo. No entanto, tentei fazer funcionar em um canal, e mesmo o bot estando com setprivacy disabled (pra escutar tudo), mesmo o bot sendo administrador, e mesmo com o canal como público ou privado, ele simplesmente não interage. Há alguma limitação entre grupo e canal para que isso esteja ocorrendo?

    Agora vai a explicação da necessidade de funcionar em um canal: tentei no grupo para que ele pegasse as mensagens enviadas por outro bot, só que descobri que dois bots não irão interagir, não poderão ver as mensagens um do outro. Pesquisando vi uma resposta dizendo que em um canal é possível que um bot veja todas as mensagens do canal, inclusive de outro bot, e por isso estou tentando no canal. Procede essa informação? É possível que um bot veja as mensagens de outro bot em um canal? Obrigado.

    Responder
  26. Tem como saber quais grupos o bot está ?

    O que tenho feito e tem me ajudado muito é isso:
    sendMessage(“sendMessage”, array(‘chat_id’ => ID_INFO_GP, ‘reply’ => true, ‘parse_mode’ => HTML, “text” =>
    ‘🤖 De: ‘.$chat_id.’ / '.$chat_id.'‘ ));

    Tem como pegar o ID/nome dos administradores de grupo/canal ?
    Tem como pegar o link do grupo ou link que o bot cria ?
    Tem como pegar a informação do usuario, quais direitos ele tem no grupo e quais direitos o bot tem naquele grupo?

    Responder
    • Olá, Neto.

      Acho que não tem como saber todos os grupos que o bot está.
      Para verificar se o ultimo membro adicionado a um grupo foi um bot, uma possibilidade é checar o parâmetro new_chat_members. Esse parâmetro exibe dados do ultimo membro adicionado grupo. O parâmetro new_chat_members pode ser obtido na primeira mensagem recebida pelo bot ao entrar em um grupo.

      Dados como ID/Nome dos administradores e informações relacionadas a eles podem ser obtidas através do método getChatAdministrators

      Espero ter ajudado.

      Responder
  27. Olá boa noite,

    Estou precisando enviar mensagens de meu sistema para 2 ou mais endereços de telegram.
    Exemplo:
    Vou fazer um relatório que apura o total faturado até o momento e enviar uma mensagem para determinados endereços de Telegram, mostrando esse resultado.

    Isto é possível ?

    Responder
  28. Bom dia Luis,

    Obrigado pela dica.

    Consegui fazer o que precisava
    usando a API do telegram.

    Abaixo deixo a classe que fiz e qualquer sugestão de melhoria, será bem vinda.

    namespace App\Communication ;

    use TelegramBot\Api\BotApi ;

    class Telegram {

    /**
    * Método responsável por enviar a mensagem de alerta
    * @param string $token
    * @return string
    */

    public static function getChatId( string $token )
    {
    $endpoint = “https://api.telegram.org/bot{$token}/getUpdates” ;

    $content = file_get_contents( $endpoint ) ;

    if ( empty( $content ) ) {
    return ” ;
    }

    $arr = json_decode( $content, true ) ;

    if ( !isset( $arr[‘result’][‘0’][‘message’][‘chat’][‘id’] ) ) {
    return ” ;
    }

    return $arr[‘result’][‘0’][‘message’][‘chat’][‘id’] ;
    }
    public static function sendMessage( $message )
    {
    $aTokens = array() ;
    $aTokens[] = ‘token 1’ ;
    $aTokens[] = ‘token 2’ ;
    $aTokens[] = ‘token 3’ ;

    $aReturn = array() ;

    foreach ( $aTokens as $Token ) {

    $obBotApi = new BotApi( $Token ) ;

    $IdChat = self::getChatId( $Token ) ;

    // Envia a Mensagem para o Telegram
    $aReturn[] = $obBotApi->sendMessage( $IdChat, $message ) ;
    }
    return $aReturn ;
    }
    }

    ?>

    Responder

Deixe um comentário