Back-End

18 ago, 2017

Criando um bot no Telegram para postar feeds de Twitter em seu chat em php

Publicidade

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

Criando um bot no telegram para postar feeds de twitter em seu chat em php

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.

Criando um bot no telegram para postar feeds de twitter em seu chat em php

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 “Abraham\TwitterOauth”, que está no github.

No seu console, crie a pasta do projeto. Por exemplo telegram, entre na pasta e utilizando o composer, digite:

composer require abraham/twitteroauth

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”:

<?php
require_once 'vendor/autoload.php'; // autoload do Composer
use Abraham\TwitterOAuth\TwitterOAuth; // 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

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.

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)

Utilizando o crontab, basta dar “crontab -e” no seu console.

E depois, por exemplo, adicionar a linha abaixo:

*/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

E o resultado é algo similar com isso:

Criando um bot no telegram para postar feeds de twitter em seu chat em php

Desejo que seja útil para vocês.

Até mais!