2017-01-29 - Publicar en Telegram las entradas de este sitio usando Python

Interactuando con el bot Siguiendo la línea de publicaciones anteriores, y tratando de alcanzar mayor difusión de las entradas de este sitio (y otro) decidimos probar el API de publicación de Telegram. Como siempre, es sencillo si encontramos las bibliotecas adecuadas y tenemos un poco de paciencia.

Pero primero tenemos que crear el bot. Siguiendo las instrucciones del BotFather. En este caso le pedimos el nuevo bot con:

/newbot

El botfather nos pide un nombre para nuestro bot, y un nombre de usuario (que deberá terminar en ‘bot’). Como respuesta nos envía el ‘token’ que nos servirá para identificarnos y poder interactuar con él. A partir de allí nuestra misión es mandarle cosas al bot.

Yo he elegido hacer un programita en Python, utilizando telepot. Las instrucciones están en telepot documentation El código que se muestra allí es muy sencillo.

import telepot
bot = telepot.Bot('***** AQUÍ VA EL TOKEN *****')

Y mandar un mensaje sería algo así como:

bot.sendMessage(999999999, 'Hola mundo')

En este caso ‘999999999’ es el identificador del bot, se puede utilizar el nombre asignado anteriormente.

En nuestro caso, como queremos que el bot avise automáticamente a sus seguidores cuando haya novedades utilizamos la fuente RSS del blog y algunos módulos de Python como feedparser.

Nos vamos a saltar esta parte porque ya la hemos contado en otro sitio y también la parte de obtener el título, el contenido y el enlace a la última entrada.

En este caso hay ciertos límites, no se pueden superar los 4096 caracteres en UTF8. Además, para que el texto tenga algo de gracia nos permiten algunas etiquetas de formato (que pueden ser HTML o Markdown). Como estamos leyendo la fuente RSS habremos leido HTML y la única prevención que hay que tener es utilizar sólo las etiquetas permitidas (negrita, cursiva, enlaces, código y texto pre-formateado). Para esto hice una chapucilla, consistente en eliminar todas las etiquetas que no le gustan al sistema:

Extraemos todas las etiquetas de nuestro texto:

tags = [tag.name for tag in soup.find_all()]

Y luego las recorremos:

for tag in tags:

Eliminando las que no son válidas:

   if tag not in validTags:

con unwrap. Previamente hemos tenido una consideración especial con las citas añadiéndoles delante y detrás unas comillas para que se refleje adecuadamente en el resultado final.

def cleanTags(soup):
    tags = [tag.name for tag in soup.find_all()]
    validTags = ['b', 'strong', 'i', 'em', 'a', 'code', 'pre']

    if soup.blockquote:
        soup.blockquote.insert_before('«')
        soup.blockquote.insert_after( '»')

    for tag in tags:
        if tag not in validTags:
            for theTag in soup.find_all(tag):
                theTag.unwrap()

Para enviar el mensaje necesitamos crear un canal FAQ channels y dar de alta como administrador al bot, para que pueda escribir en el canal:

bot.sendMessage('@'+channel, str(soup)[:4096], parse_mode='HTML')

El código está integrado en mi proyecto rssToSocial que no es un código para sentirse especialmente orgulloso. Pero permite hacer estas publicaciones sin tener que hacerlo a mano.

La explicación del código para publicar en otras redes sociales está en:

A partir de ahora (o dentro de un poco, que tengo que configurarlo) ya pueden recibir notificaciones siguiendo a mbpfernand0 en Telegram.

Escrito el 2017-01-29
Categorías: programación
Tags: programación desarrollo telegram rss redes sociales difusión python api