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

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.


about 2 years ago

Ariel Parra