Nuevo proyecto para el portafolio: Channel2RSS
Introducción
Este bot es un proyecto rápido con el fin de probar por primera vez como funcionan los webhooks
de Telegram e intentar demostrar que sirve para hacer un despliegue de bot mas rápido y sencillo que los que se hacen con Update
. por supuesto, esto ultimo resulto un fracaso XD
Channel2RSS
La idea de este bot es sencilla; dotar de RSS a canales de Telegram. Por supuesto, no es el primero ni sera el ultimo, he probado al menos dos alternativas y he notado que, aparte de ser lentas, no piden permiso al autor para que este decida si quiere o no tener RSS en su canal. Simplemente usan un WebCrawler que reúne la información y la sirve como RSS para quien la quiera tener. Aunque esto me parece un poco injusto, tampoco es que se pueda hacer mucho. En Telegram se filtra muchísima información por bots y usuarios malintencionados, así que ofrecer un servicio de forma mas educada y considerada se me hacia algo lindo de intentar.
Características de Channel2RSS
Este bot trata de ser lo mas sencillo posible, basta que lo agregues a tu canal para que empiece a generar una URL con el XML de tu nuevo feed. Se ira llenando conforme vayas escribiendo en tu canal y se publicara en un formato tipo:
- Titulo:
La fecha de publicación (a diferencia de los blogs, los post de Telegram no tienen titulo. Pertenecen a la categoría de Microblogging)Se obtiene el tipo de post del canal y se agrega parte del contenido del post - Descripción: El contenido de tu post. esto puede ser obtenido de:
- Texto: si el post solo es texto, se obtiene del texto del mensaje recibido desde la API
- Caption: Si el post solo es audio, se obtiene del caption del audio.
- Detalles del audio: Si el archivo de audio incluye metadata, se agrega tambienn
Como es un proyecto en desarrollo, por el momento solo guarda audios en formato mp3, como sugerencia de un Podcaster @avionesdepapel que consideraba que era una función importante para la comunidad que no había encontrado hasta el momento. Por esta razón, la prioridad es pulir esta función antes de continuar escalando el proyecto.
También recibí un post de parte de @surrealcloud hablando sobre mi bot en su canal aun antes de que empiece a escribir este post XD
Al usar Webhooks, la actualización de los feeds es inmediata. Es posible que muchos lectores de RSS noten esto al instante, pero otros, como FreshRSS no actualicen sino hasta cierto tiempo después de una actualización previa, imagino que para ahorrar recursos del servidor.
El bot tenia también como fin ser selfhosted. Sin embargo, no estoy muy seguro de como podría resultar esto. Todo bot de telegram esta diseñado para ser multiusuario, por lo que el despliegue de un bot para un solo usuario, puede ser un desperdicio enorme de recursos. En ese caso, tal vez debí optar por usar Update
en lugar de WebHooks
pero debido a que el XML debe estar en publico, esto habría complicado muchísimo el desarrollo.
Por supuesto, estoy abierto a sugerencias, dejare abierto los comentarios por si tienen ideas o sugerencias para el bot.
Sobre el despliegue de Channel2RSS
Realmente en si es un código bastante pequeño, pero puede resultar inesperadamente lioso de desplegar porque necesita algunos requisitos. En especial un hosting o VPS porque es necesario dejarlo en publico para que tenga sentido su existencia, asi que en resumen, se necesitan los siguientes pasos previos antes de poder recién poner el código en el directorio requerido.
- Crear un dominio o subdominio: Los feeds RSS deben estar alojados en un lugar publico para que los clientes puedan consultarlos.
- Por supuesto, debes apuntar el dominio o subdominio a tu nuevo servidor.
- Crear host o virtual host: El servidor que va a atender las llamadas de la API o de los clientes.
- Crear certificado SSL para tu host: puedes comprarlo o firmarlo con Let’s Encrypt usando el certbot.
- Crear tu bot con el botFather: Necesitas el token, claro
- Configurar el bot: Limita los permisos, Ponle un titulo, una descripción, si quieres, ponle la URL de tu hosting como botón de MiniAPP
- Configurar el modo de escucha de tu bot: Puedes hacerlo según lo que explica la Telegram Bot Api Documentation. Puedes hacerlo usando CURL
- Definir el nombre de tu WebHook: Por supuesto que no lo vas a llamar index.php. Necesitas ponerte creativo, ponle un nombre difícil de adivinar, porque no querrás trafico indeseado estorbando en tu bot, no? Te recomiendo que generes un hash SHA para que sea difícil de adivinar y ponle un prefijo. Recuerda que esto es lo que usaras cuando configures la webhook en la explicación de abajo.
- Proteger los archivos sensibles: Temporalmente este bot guarda un log de texto en el mismo directorio de ejecución de tu webhook. también la base de datos en formato SQLite esta en el mismo directorio. No queremos que se divulgue la información allí contenida, por mucho que sea publica, así que debes configurar la seguridad en tu servidor. En mi caso, he compartido lo que agregue a mis configuraciones para NGINX.
- Y bueno, recién ahora puedes poner a funcionar el bot. sencillito 😀
Si, ya se que esto es un tostón, pero el hecho de tener que dejarlo en publico es lo que hace que hayan todos estos requisitos. Se podría haber hecho esto con Node y express, pero también seria un proceso largo que incluso necesitaría de un proxy inverso como nginx. Por eso estoy dudando tanto de dejarlo como un código listo para selfhosting. No puedo garantizar que no se fuguen datos sensibles si la persona que despliega el bot no sigue todos los pasos y requisitos de seguridad.
Configurar el WebHook es bastante fácil, solo debes hacer lo siguiente:
Mira como esta configuradas las webHook
curl https://api.telegram.org/bot<TUTOKEN>/getWebhookInfo
Configura la webhook para que llegue a tu url de destino
curl -X POST "https://api.telegram.org/bot<TUTOKEN>/setWebhook" -d "url=TUURL"
Configurar el bloqueo de archivos sensibles es sencillo usando Nginx
location ~ \.txt$ {
deny all;
log_not_found off; # Optional: Prevents logging «file not found» errors for these requests
access_log off; # Optional: Prevents logging access attempts for these requests
return 404; # Returns a 404 Not Found error instead of a 403 Forbidden
}
location ~ \.db$ {
deny all;
log_not_found off; # Optional: Prevents logging «file not found» errors for these requests
access_log off; # Optional: Prevents logging access attempts for these requests
return 404; # Returns a 404 Not Found error instead of a 403 Forbidden
}
Información técnica
Esta es la tecnología utilizada para este bot:
- Servidor: PHP FPM 8.1 Nginx
- Base de datos: SQLite 3
- Lenguaje de Programación: PHP
¿Que mas? nada mas, como dije, aunque el despliegue es muy complejo, el código es muy sencillo.
Modo de uso
- Saluda al bot @channel2rrss_bot
- Agrega el bot @channel2rrss_bot a tu canal como administrador
- Nada mas, te llegara un enlace donde podrás encontrar el archivo xml que necesitas para los lectores RSS, publícalo donde quieras.
Lo que hace el bot
- Publica al instante el texto de un canal de Telegram en un XML compatible con RSS
- Crea un directorio publico en el servidor para usar el archivo XMLy otros recursos
- Sube los archivos de audio para su uso como podcast
- Comparte un enlace con el post especifico creado en el canal
Cosas pendientes
- Notificar al usuario cuando el bot es removido del canal
- Eliminar los datos del canal en el servidor cuando el bot es eliminado del canal
- Dar la opción de que el usuario decida si eliminar los datos o conservarlos
Compatibilidad con texto enriquecido de Telegram (odio mucho las entidades)Compatibilidad con imágenes y otros archivos (no se si valga la pena invertir espacio de mi servidor para esto)Se permite ahora imagenes jpg.- Liberar el código. Es súper simple. a alguien le podrida interesar esto? incluso es tedioso el despliegue del servidor y dominio necesario.
Titulo en formato tipo de post y contenidoIdentificar los tipos de postIdentificar los tipos de post reenviadosReferenciar al origen del post reenviadoDetalles de los archivos de audio- Un canal de comunicaciones para sugerencias de mejoras?
Notas sobre el desarrollo
Este bot es un desarrollo rápido creado con el fin de utilizarse por podcasters de Telegram. Si bien hay otros servicios que ofrecen cosas similares, no utilizan el enfoque que he usado porque entre otras cosas:
- La actualización del archivo XML es inmediata. No utiliza scrappers
- Algunos archivos de post original son almacenados en un servidor publico
- Publicar por RSS es una decisión enteramente del autor del canal, el cual decide usar el bot
Por el momento conozco 2 servicios que funcionan relativamente bien para ofrecer RSS a canales de Telegram, pero no piden permiso al dueño del canal. por supuesto, que mi bot lo pida no significa que los demás no puedan hacerlo. Si alguien usa mi bot para tener RSS, también puede que hayan otros servicios screappeando el canal para que alguien lea por RSS también
Adjunto los servicios que conozco
- ch2rss.fflow.net que pertenece al mismo creador de watchbot y dead man’s switch bot, dos de mis bots favoritos.
- Telegram RSS or JSON server algo mas lento en sus actualizaciones y con fallos eventuales.
No me he dado el gusto de estudiar como funcionan, pero a diferencia de mi proyecto, no usan bots para obtener los datos y pueden recolectar post bastante antiguos también.
Ultimas notas
Si bien el XML consume memoria en escala de kilobytes, los archivos de audio pueden consumir en escala de megas. Actualmente mi servidor solo cuenta con 25GB de disco duro, siendo solo 5GB mi espacio disponible actual. No se por cuanto tiempo puedo mantener este servicio aunque tampoco espero que lo use muchas personas. Pero si se diera el caso de que haya mucha gente dispuesta a usarla, probablemente necesite algo de apoyo para mantener el servicio.
De nuevo, validar que mi bot no se use para propósitos turbios también es complicado, asi que entre las mejoras programadas debería poner algo que disuada de usarlo irresponsablemente. No tengo idea de que podría ser.
Otra idea que tuve era la de crear un archivo HTML estático que consuma el Feed de tu canal, para que puedas usarlo a modo de blog estático que se actualiza con tus post de tu canal de Telegram, seria una alternativa ligera de blogging pero no se como podría llegar a ser y de nuevo, si mi servidor va a aguantar eso. Según yo, si, pero quien sabe.