Criando um bot no Telegram para postar feeds de Twitter em seu chat em php – Tudo sobre PHP
19 de agosto de 2017 [email protected]
O Twitter ainda é um dos maiores meios utilizados por desenvolvedores para ficarem a par dos acontecimentos do mundo e da programação. Mas, nos últimos tempos, o Twitter está bem bagunçado, tanto as postagens não aparecem mais em formato de timeline (agora aparece um monte de mensagens postadas em horários aleatórios no que seria a sua timeline). Além disso, geralmente seguimos um monte de pessoas e empresas que nem sabemos o porquê estão ali e somos extremamente preguiçosos de ficar apagando tudo que já não nos interessa mais no Twitter.
Por outro lado, o aumento de número de usuários no Telegram, bem como a possibilidade de integrações e a criação de "bots", faz com que essa seja uma ferramenta de comunicação muito interessante e indispensável para o desenvolvedor atual.
E porque não unir o útil ao agradável? O Twitter tá uma bagunça e seu smartphone já está com o Telegram instalado e recebendo mensagens daqueles mil grupos que você nunca lê nem responde. Talvez seja a hora de usá-lo para algo útil.
Neste artigo vamos ver como em poucas linhas de código php, composer, mais um crontab ou agendador de tarefas, e um servidor qualquer, você pode criar um serviço que atualiza um chat do Telegram sobre os posts de qualquer usuário do twitter. O objetivo desse artigo é mostrar que muitas vezes conseguimos fazer integrações com poucas linhas de código.
Para começar, devemos criar um aplicação em nossa conta do twitter. Para isso, estando logado, vá em https://apps.twitter.com/, depois em "Create new App". Coloque um nome qualquer em Name e uma descrição qualquer em description. Em website coloque uma url válida, pode ser de qualquer domínio seu ou o endereço no twitter https://twitter.com/seunick. E aceitar os termos.
Depois de criar a aplicação, você deverá ir em Keys and Access Tokens. Anotar a "Consumer Key" e a "Consumer Secret"; criar um novo token em "Your Access Token"-> Create new Token e anotar o "Access Token" e o "Access Token Secret".
Bem, agora vamos ter que criar um bot no Telegram.
O ideal é que os próximos passos sejam feitos no cliente para celular do Telegram, já que algumas funcionalidades simplesmente "bugam" no cliente web.
Para começar basta abrir uma conversa com o BotFather. Para isso pesquise BotFather e abra um chat com ele.
Digite: /newbot
Depois digite o nome do seu bot
Em seguida o username do seu bot terminando em bot. Exemplo: newbot
Assim que você enviar o nome do seu bot, o BotFather irá retornar um token de acesso. Anote também esse token.
Agora temos que pegar o id da nossa conta do Telegram para que o bot possa abrir o chat conosco através da API. Para isso, basta abrir um chat com "userinfobot" e anotar o ID que ele fornece.
Com todos os tokens e ids anotados, agora vamos por a mão na massa!
Antes de começar a codar, precisamos utilizar uma biblioteca PHP para realizar a conexão com o Twitter. Nesse caso usaremos o "AbrahamTwitterOauth", que está no github.
No seu console, crie a pasta do projeto. Por exemplo telegram, entre na pasta e utilizando o composer, digite:
O composer irá instalar todas as dependências e a biblioteca TwitterOauth.
Primeiro criamos um arquivo chamado "id" e em seu conteúdo deixamos 1
Criamos então o arquivo "telegram.php":
require_once 'vendor/autoload.php'; // autoload do Composer
use AbrahamTwitterOAuthTwitterOAuth; // Para utilizar a classe TwitterOAuth
$consumerKey = 'ConsumerKey'; //a consumer key do seu app twitter
$consumerSecret = 'ConsumerSecret'; //a consumer secret do seu app twitter
$accessToken = 'AccessToken'; //o access token do seu app twitter
$accessTokenSecret = 'AccessTokenSecret'; //o access token secret do seu app twitter
$botToken = 'BotToken'; //o seu bot Token do Telegram
$apiUrl = 'https://api.telegram.org/bot'.$botToken.'/'; //aqui é só para a url da chamada do telegram ficar mais apresentável
$chatId = 'id'; //o id da sua conta no telegram
$connection = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret); //cria a conexão com a conta do twitter
$statuses = $connection->get("statuses/user_timeline", ["screen_name" => "imasters"]); //retorna os 20 últimos tweets de um usuário, no caso como exemplo do usuário imasters
/* Abaixo uma pequena lógica para pegar apenas os tweets que ainda não foram enviados
* ao chat. No caso, definimos o primeiro id como 1, e utilizaremos o arquivo id para
* armazenar os próximos ids. E, vamos verificar qual é o id do último tweet que a conta fez
* enquanto o número armazenado no arquivo for menor que o último tweet. Então o
* sistema enviará uma requisição para a API do telegram disparar o tweet. Caso o id do
* último tweet seja igual ao último id armazenado no arquivo, não fará nada
$ultimoId = file_get_contents('id'); //retorna o último id armazenado no arquivo
$i = 19; //inicia o contador decremental de tweets
$ultimoIdNovo = $statuses[0]->id; //recebe o id do último tweet
$id = $statuses[$i]->id; //recebe o id do primeiro tweet do retorno
while ( $i>=0 ) { //enquanto o contador não for menor que 0
if ($id > $ultimoId) { //caso o id do tweet seja maior que o id armazenado no arquivo
$url = $apiUrl.'sendMessage?chat_id='.$chatId.'&text='.urlencode($statuses[$i]->text); //url referente a API do Telegram para enviar uma mensagem para o chat do seu usuário do telegram com o texto sendo o tweet.
$x = file_get_contents($url); //faz uma requisição a API do telegram
$i--; //decrementa o contador
$id = $statuses[$i]->id; //recebe o id do próximo tweet
file_put_contents('id', $ultimoIdNovo); //armazena o id do último tweet enviado</pre>
<p>Como podemos perceber no código, existem melhoras que podemos fazer. Como por exemplo utilizar a biblioteca GuzzleHttp para fazer a requisição à API do Telegram, mas para efeito didático utilizamos algo mais simples, como um file_get_contents.</p>
<p>Agora a última parte é fazer um crontab (linux) ou um agendador de tarefas (windows) para iniciar o serviço de "x" em "x" minutos. (Vale lembrar que esse tempo deverá ser menor que o tempo em que a conta do twitter faça mais de 20 tweets, já que a chamada a biblioteca nos retorna os 20 últimos tweets)</p>
<p>Utilizando o crontab, basta dar "crontab -e" no seu console.</p>
<p>E depois, por exemplo, adicionar a linha abaixo:</p>
<pre>*/30 * * * * php /var/www/console/telegram/telegram.php
Onde, a cada 30 minutos será iniciado o serviço. Que no caso está em /var/www/console/telegram/telegram.php