Ideas en bits

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?

no hay

Pasos a Seguir

Pensando de antemano lo que tenemos que hacer, en resumidas cuentas seria

  1. Obtener el tweet del dia actual, que contenga el resumen
  2. Enviar ese tweet a un chat de telegram

claro

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

  1. El usuario es angelmartin_nc
  2. Su tweet siempre contiene esta frase "Informativo matinal para ahorrar tiempo 26/04/22"
  3. Un extra check es que tenga un video.
  4. 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í:

  1. from:angelmartin_nc
  2. (Informativo matinal para ahorrar tiempo 26/04/22)
  3. has:media
  4. -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

  1. Telegram bot token
  2. 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

alt

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.