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.
Quando o teclado de opções abrir, escolha a loteria que deseja ver o resultado.
Após escolher a loteria, o resultado é exibido pelo bot.
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. =]
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é
Luiz,
Na dúvida que enviei anteriormente, é como se eu pudesse ter no botão o text e o value, dai conseguiria controlar as opções.
Abraços,
André
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.
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á .
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.
Como posso fazer para que os comandos funcionem também em grupos e super grupos sem /?
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.
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?
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.Ah e também você poderia adicionar ao tutorial o comando para remover o bot da url?
Já ia esquecendo de responder xD
Para remover o Webhook, basta usar a seguinte URL: https://api.telegram.org/bot(SEU_TOKEN)/setwebhook?url=(Aqui é vazio mesmo)
Vou acrescentar uma observação no fim do tutorial.
Obrigado amigo!
Ótimo tutorial. Simplesmente perfeito.
Só uma ressalva, o resultado da lotofacil e lotomania estão invertidos.
Estou usando já pra consultar os resultados.
Obrigado pelo elogio, Wenderson!
Já corrigi o erro que você apontou. Valeu!
Boa noite, desculpe a ignorância, mas onde coloco os arquivos PHP ?
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.
Boa noite Luiz Marcus,
obrigada pelo apoio, mas não estou conseguindo. Meus arquivos estão no hostinger.
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.
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
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.
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?
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. =]
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
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
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.
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
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.
Olá Luiz. Parabéns pelo post.
Uma pergunta, como desenvolvo um bot que cria lembretes??
Obrigado.
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.
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?
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 doinline_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 uminline_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.
Luiz Marcus, obrigado, funcionou corretamente!! sucesso pra vc!
Também entendi agora, tinha me perdido na contagem das arrays e não acontecia nada. Mas com esse seu exemplo consegui avançar. Obrigado!
De nada, George! A organização dos arrays pode atrapalhar mesmo.
Dei uma olhada no bot do educadata.org. Ficou muito bom. =]
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.
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 novomessage_id
for inserido na fila.Vê se funciona.
Qualquer coisa, só falar.
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
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.
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 ']);
}
Que bom que funcionou, Rafael! =]
Agora quem também tiver a sua dúvida pode usar seu código como referência. Vlw!
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.
Ignora essa pedaço inicial da mensagem: Money_BotRobot:
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. =]
perfeito material!!!
Parabéns!
Obrigado pelo elogio, Alexon! =]
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
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.
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?
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.
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?
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. =]
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?
E ae Bruno!
Você ativou o Lets Encrypt na Umbler? O Webhook do bot deve usar o protocolo HTTPS.
Caso esteja tudo certo com a URL, verifica se você colocou o TOKEN do Telegram no código.
Se preferir, você pode copiar o código que eu disponibilizei no GitHub, colocar seu TOKEN, hospedar e testar.
https://github.com/luizmarcus/PHP/tree/master/telegrambot
Qualquer coisa, é só comentar aqui de novo.
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?
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. =]
Apresenta o seguinte erro:
Webhook call failed. Error: Failed to parse webhook JSON response: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 7 column 1 path $.
Olá, Kerensky.
Esse erro ocorreu no DialogFlow?
O DialogFlow atualizou a versão de sua API para v2. Muito provavelmente esse erro deve ser por causa disso.
Para corrigi-lo, basta você atualizar o código seguindo os novos formatos dos Jsons:
https://dialogflow.com/docs/fulfillment
Espero ter ajudado.
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/");
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');
Que bom que funcionou, Bruno!
Você pode usar a URL em PHP, sim. Lembrando que você terá de adaptar o código para receber os dados da sua URL.
Que tal fazer um vídeo (se ainda não tiver)?
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.
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?
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.
Tem alguma forma de enviar algumas mensagem randômicas cada vez que algum comando for enviado ?
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.
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?
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.
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!
E ae, Fernando. Blz?
Para resolver esse seu problema você precisa, além do texto, usar o parâmetro
callback_data
quando o usuário clica no botão do inline keyboard. Na documentação do Telegram explica como usa: https://core.telegram.org/bots/api#inlinekeyboardbuttonPara ficar mais fácil de você entender, eu fiz um exemplo simples baseado no post que você pode usar como ponto de partida para resolver seu problema:
https://gist.github.com/luizmarcus/c7adbd66543eeb8f21129aade2528d16
Eu comentei as linhas e coloquei as referências também.
Espero ter ajudado.
Luis boa tarde, coloquei para rodar mas mesmo ativando o parser com o webhookv2.php que tem no seu github ainda retorna o erro:
{“fulfillmentText”:”Resultado – lotofacil\nN\u00e3o encontrado”}
Poderia dar uma luz?
Olá, Rodrigo.
Se você está tentando criar um bot para o Telegram baseado no post em que você comentou, o código-fonte correto é o do link abaixo:
https://github.com/luizmarcus/PHP/tree/master/telegrambot
O webhookv2.php faz parte do código-fonte do bot para o Telegram integrado ao Dialogflow. Se você está tentando integrar seu bot ao Dialogflow e está dando esse erro, dá uma olhada se o método
file_get_html
está retornando o código HTML da pagina. Pra fazer isso, você pode por a variável$html
como retorno da função. Para o código funcionar, o HTML precisa ser lido.Espero ter ajudado.
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?
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.
Luiz,
Para enviar um arquivo (PDF) posso usar assim:
sendMessage(“sendMessage”, array(‘chat_id’ => $chat_id, “document” => URL_DO_ARQUIVO);
Isso funciona?