Forwarding Tweets a Telegram
Siguiendo la linea de que paso mucho tiempo en las redes sociales, hay una cuenta que me gusta mucho y es la de Ángel Martín Gómez.
Todos los días, Angel hace un resumen de noticias y acontecimientos en 2'20'' que lo envía alrededor de las 7.30 am, y es muy pero muy bueno, por ejemplo el de hoy
[twitter https://twitter.com/angelmartin_nc/status/1518878143540563969]
El ""Problema""
Va con varias comillas, porque sabemos que me invento situaciones para ñoñear un rato.
Lo que me sucede es que muchas veces se me pasa este tweet y tengo que ir a su timeline a buscarlo, entonces pense:
¿Que tal si hago un script en python que me envie el video a un chat de Telegram todos los días?
¿Por Que?
Pasos a Seguir
Pensando de antemano lo que tenemos que hacer, en resumidas cuentas seria
- Obtener el tweet del dia actual, que contenga el resumen
- Enviar ese tweet a un chat de telegram
Obtener el twet del dia
Usando la API de Twitter tenemos un endpoint que nos devuelve los tweets mas recientes
get-tweets-search-recent y como vemos podemos enviarle un parametro llamado query
que vamos a utilizar para filtrar el ultimo tweet de Angel.
Query
Para encontrar el tan ansiado tweet tenemos estas condiciones
- El usuario es
angelmartin_nc
- Su tweet siempre contiene esta frase "Informativo matinal para ahorrar tiempo 26/04/22"
- Un extra check es que tenga un video.
- Y tambien querríamos el original, asi que podemos obviar los retweets que haga.
Usando las query conditions
de la API de twitter los 4 puntos anteriores se pueden buscar algo así:
from:angelmartin_nc
(Informativo matinal para ahorrar tiempo 26/04/22)
has:media
-is:retweet
Implementación
Para hacerlo mas sencillo instalamos Tweepy en su tutorial explica como obtener un Bearer Token
para usar la API (mas info aquí).
Vamos a utilizar la función search_recent_tweets
(que es un wrapper de esta API call)
Respecto a las queries, casi todo es bastante directo, lo unico que varía es la fecha, pero como es un formato super simple, y vamos a ejecutar esto una vez al día podemos hacerlo fácil con Python:
from datetime import date
today = date.today()
today_str = date.strftime(today, "%d/%m/%y")
# Texto que Angel usaría cada día
print(f"(Informativo matinal para ahorrar tiempo {today_str})")
Y ahora usando la librería de tweepy
esto lo podemos hacer de la siguiente manera:
import tweepy
client = tweepy.Client("<Aqui va el Bearer Token de la API>")
# NOTA: usando la variable `today_str` que calculamos antes
query = f"from:angelmartin_nc -is:retweet has:media (Informativo matinal para ahorrar tiempo {today_str})"
tweets = client.search_recent_tweets(query=query)
# Si hay un tweet con la query que buscamos, vamos a tenerlo en data
twitter_url = None
if tweets.data:
tweet = tweets.data[0]
# Construimos la url usando el tweet ID
twitter_url = f"https://twitter.com/twitter/statuses/{tweet.id}"
Enviar el tweet a un canal de Telegram
Esto lo expliqué en este post pero hacemos un resumen de lo que necesitamos
- Telegram bot token
- Telegram Chat Id
Con esto y usando la libreria requests
podemos enviar el tweet que generamos anteriormente de esta manera (suponiendo que lo guardamos en twitter_url
y existe):
chat_id = "<aqui actualizar el chat id>"
telegram_token = "<aqui actualizar el token>"
telegram_api_url = f"https://api.telegram.org/bot{telegram_token}"
params = {
"chat_id": chat_id,
"text": twitter_url
}
requests.get(f"{telegram_api_url}/sendMessage", params=params)
En mi caso, tengo un bot que se llama "Gobi" y me lo envía de esta manera
Ejecutarlo cada dia
Para hacer esto cree una imagen de docker sencilla que contiene este script y las dependencias, y en un server armo un cron que corra la imagen todos los dias a las 8:00 (hora España). Por lo general uso crontab generator para saber como armarlo.
En nuestro caso, meto el coomando que corre la imagen en un shell script llamado forward_tweet.sh
y lo agrego al crontab indicando la periodicidad
$ sudo crontab -e
* 6 * * * /root/twitter-telegram/forward_tweet.sh >/dev/null 2>&1
Nota: los crontab se configuran en UTC y en España estamos en GMT+2 asi que es por eso que coloco el 6
ahi.
Conclusiones
Una vez más, estas son excusas que voy buscando para probar soluciones a "problemas" cotidianos con Python y que me sirven de base para pensar posibles usos para casos más complejos.
En este caso, todos los días a las 8am voy a recibir un mensaje a un canal de Telegram con el link al tweet de Angel. Esto siempre y cuando Angel lo haya hecho, y por supuesto que siga con el patrón de como titularlo.
Espero que les guste también y que encuentren usos para estos """problemas""" 😉
Notas
Actualize este ejemplo en el repo python-fun
armando una clase para que este un poquito mas ordenado, y tambien con un Dockerfile
que solamente necesita que se actualizen las variables de ambiente (twitter token, telegram chat id, telegram bot token) y saldria con fritas.