Nota: Esta guía asume que estás operando un bot autorizado en un foro de Discourse, posiblemente utilizando la API de Usuario o una Clave de API de Administrador. Si los administradores bloquean tu bot, discute el propósito de tu bot con ellos y no intentes eludir ese bloqueo.
¿Sería mejor si tu bot se ejecutara en el servidor? Considera crear un plugin en su lugar: Developing Discourse Plugins - Part 1 - Create a basic plugin
Introducción
Esta guía presentará un algoritmo para que un usuario bot inspeccione y procese cada publicación realizada en un foro de Discourse al que el usuario del bot tenga acceso (excepto los mensajes privados).
Necesitarás almacenamiento duradero para un solo número entero: el ID de la publicación más alta procesada con éxito. Por ejemplo, podrías escribirlo en Redis o en un archivo de texto plano. Usar Redis te permitirá persistir las suscripciones al bus de mensajes a través de reinicios de procesos de tu parte.
Se recomienda encarecidamente crear una cuenta de usuario completamente nueva para el bot, para que pueda agregarse a grupos y mensajes privados según sea necesario. Evita usar la cuenta @system.
El siguiente conjunto de algoritmos está escrito imitando el estilo de la especificación WHATWG y construye gradualmente el algoritmo para monitorear continuamente nuevas publicaciones.
Especificaciones de los Algoritmos
Sea la URL base del foro la URL del sitio sin barra final, por ejemplo, https://meta.discourse.org o https://www.contoso.com/forum para instalaciones en subcarpetas.
Obtener las siguientes publicaciones recientes
Para obtener las siguientes publicaciones recientes dado un número entero ID de la publicación más alta vista y una bandera activada por el bus de mensajes, ejecuta estos pasos:
- Sea ID máximo de respuesta el resultado de sumar cincuenta (50) al ID de la publicación más alta vista.
- Sea URI de solicitud la concatenación de la URL base del foro,
/posts.json,?before=, y el ID máximo de respuesta. - Sea respuesta el resultado de
obtener JSON respetando los límites de velocidad con la URI de solicitud y las credenciales. - Si respuesta es un error HTTP, aborta estos pasos con un error.
- Sea publicaciones el array JSON en la ruta
latest_postsdentro de respuesta. - Sea la bandera nuevas publicaciones vistas desactivada.
- Para cada objeto JSON publicación en publicaciones en orden inverso, ejecuta estos pasos:
- Sea ID de publicación el número JSON en la ruta
iddentro de publicación. - Establece ID de la publicación más alta vista en ID de publicación.
- Activa la bandera nuevas publicaciones vistas.
Emite publicación. (
En otras palabras: envía la publicación a cualquier procesamiento personalizado que desees realizar.)- Si emitir devuelve una señal de contrapresión, rompe este bucle.
- Sea ID de publicación el número JSON en la ruta
-
El bucle anterior se ejecuta en orden inverso para que tu código vea primero las publicaciones más antiguas y las más nuevas al final. - Si la bandera nuevas publicaciones vistas está activada:
- Ejecuta los pasos para
persistir el estado en el almacenamiento con ID de la publicación más alta vista.
- Ejecuta los pasos para
- Finaliza estos pasos devolviendo el ID de la publicación más alta vista.
Probar un ID de publicación existente alto
Para probar un ID de publicación existente alto, ejecuta estos pasos:
- Sea URI de solicitud de prueba más reciente la concatenación de la URL base del foro y
/posts.json. - Sea respuesta de prueba más reciente el resultado de
obtener JSON respetando los límites de velocidad con la URI de solicitud de prueba más reciente y las credenciales. - Si respuesta de prueba más reciente es un error HTTP, aborta estos pasos con un error.
- Sea publicaciones de prueba el array JSON en la ruta
latest postsdentro de respuesta de prueba más reciente. - Para cada objeto JSON publicación en publicaciones de prueba:
- Sea ID de publicación el número JSON en la ruta
iddentro de publicación. - Finaliza estos pasos devolviendo ID de publicación.
- Sea ID de publicación el número JSON en la ruta
- Aborta estos pasos con un error.
Rellenar desde lo más reciente
Para rellenar desde lo más reciente dado un número entero opcional ID de la publicación más alta vista, ejecuta estos pasos:
- Sea ID mínimo de publicación el ID de la publicación más alta vista si está presente, y cero (0) en caso contrario.
- Sea ID de publicación existente alto el resultado de probar un ID de publicación existente alto.
- Si ID máximo de publicación es un error, aborta estos pasos con un error.
- Ejecuta los pasos para rellenar dado el ID mínimo de publicación y el ID de publicación existente alto.
Rellenar
Para rellenar dados dos números enteros ID mínimo de publicación y ID de publicación existente alto:
- Sea ID mínimo de publicación actual ID mínimo de publicación.
- Repite estos pasos:
- Ejecuta los pasos para obtener las siguientes publicaciones recientes dado el ID mínimo de publicación actual y una bandera activada por el bus de mensajes desactivada.
- Si los pasos para obtener las siguientes publicaciones recientes no se completaron correctamente:
- Actualiza el algoritmo de retroceso exponencial con una señal de fallo y espera la cantidad de tiempo especificada.
- Continúa a la siguiente iteración del bucle (sin actualizar el ID mínimo de publicación actual).
- Sea ID máximo de respuesta candidato el resultado de sumar cincuenta (50) al ID mínimo de publicación actual.
- Si el ID máximo de respuesta candidato es mayor o igual que el ID de publicación existente alto,
finaliza estos pasos. - Establece el ID mínimo de publicación actual en el ID máximo de respuesta candidato.
Monitorear continuamente nuevas publicaciones
Para monitorear continuamente nuevas publicaciones, ejecuta estos pasos:
- Sea ID de la publicación más alta vista un número entero opcional desactivado.
- Establece ID de la publicación más alta vista en el resultado de
restaurar el estado desde el almacenamiento. - Si ID de la publicación más alta vista está desactivado:
- Establece ID de publicación inicial en el resultado de probar un ID de publicación existente alto.
- Ejecuta los pasos para
persistir el estado en el almacenamiento con ID de publicación inicial. - Establece ID de la publicación más alta vista en ID de publicación inicial.
- Establece notificaciones en el resultado de ejecutar los pasos para
suscribirse al bus de mensajes, con un canal de /latest. - Ejecuta repetidamente los siguientes pasos:
- Establece nuevo ID de la publicación más alta vista en el resultado de obtener las siguientes publicaciones recientes, con la bandera activada por el bus de mensajes activada si ocurrió una actualización del bus de mensajes, y el ID de la publicación más alta vista.
- Si los pasos para obtener las siguientes publicaciones recientes no se completaron correctamente:
- Actualiza el algoritmo de retroceso exponencial con una señal de fallo y espera la cantidad de tiempo especificada.
- Continúa a la siguiente iteración del bucle.
- Si el nuevo ID de la publicación más alta vista es diferente del ID de la publicación más alta vista:
- Actualiza el algoritmo de retroceso exponencial con una señal de éxito.
- Establece el ID de la publicación más alta vista en el nuevo ID de la publicación más alta vista.
- Espera un mensaje en notificaciones o que ocurra un tiempo de espera definido por la implementación. Este tiempo de espera no debe ser menor de 10 minutos y puede variar razonablemente hasta 24 horas o ligeramente más.
Algoritmos que debes proporcionar:
obtener JSON respetando los límites de velocidad, tomando una URI de solicitud y credenciales opcionales.
- Esto debe retroceder y reintentar automáticamente usando el algoritmo de retroceso exponencial y/o la información
Retry-Afterproporcionada por el servidor cuando se presente un error 429.
- Esto debe retroceder y reintentar automáticamente usando el algoritmo de retroceso exponencial y/o la información
restaurar el estado desde el almacenamiento
persistir el estado en el almacenamiento, tomando un número entero
suscribirse al bus de mensajes