Desarrollo de Bots: Channel2RSS

0
(0)

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

  1. Saluda al bot @channel2rrss_bot
  2. Agrega el bot @channel2rrss_bot a tu canal como administrador
  3. 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

  1. Publica al instante el texto de un canal de Telegram en un XML compatible con RSS
  2. Crea un directorio publico en el servidor para usar el archivo XMLy otros recursos
  3. Sube los archivos de audio para su uso como podcast
  4. Comparte un enlace con el post especifico creado en el canal

Cosas pendientes

  1. Notificar al usuario cuando el bot es removido del canal
  2. Eliminar los datos del canal en el servidor cuando el bot es eliminado del canal
  3. Dar la opción de que el usuario decida si eliminar los datos o conservarlos
  4. Compatibilidad con texto enriquecido de Telegram (odio mucho las entidades)
  5. 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.
  6. Liberar el código. Es súper simple. a alguien le podrida interesar esto? incluso es tedioso el despliegue del servidor y dominio necesario.
  7. Titulo en formato tipo de post y contenido
  8. Identificar los tipos de post
  9. Identificar los tipos de post reenviados
  10. Referenciar al origen del post reenviado
  11. Detalles de los archivos de audio
  12. 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:

  1. La actualización del archivo XML es inmediata. No utiliza scrappers
  2. Algunos archivos de post original son almacenados en un servidor publico
  3. 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

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.

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en una estrella para puntuarlo!

Promedio de puntuación 0 / 5. Recuento de votos: 0

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

¡Siento que este contenido no te haya sido útil!

¡Déjame mejorar este contenido!

Dime, ¿cómo puedo mejorar este contenido?

Reacciones en fediverso

Únete a mi red poniendo la URL de tu blog. Aprender más

 
Interlan
Interlan
@interlan.ec@interlan.ec

Este es mi sitio personal y profesional, donde publico mis actividades, experimentos y servicios que he ido desarrollando durante mi crecimiento profesional.

90 publicaciones
0 seguidores

Descubre más desde Interlan

Suscríbete y recibe las últimas entradas en tu correo electrónico.

,

Deja un comentario

Interlan