Esta es una guía que explica cómo obtener todas las publicaciones de un tema usando la API de Discourse.
Los resultados devueltos por la API de Discourse para muchas rutas están paginados.
Por ejemplo, el punto final de la API para “Obtener un solo tema” - por ejemplo,
https://examplesite/t/{id}.jsonsolo devolverá 20 publicaciones de forma predeterminada, incluso si el tema contiene más de 20 publicaciones.Debido a este comportamiento, hay dos formas en que puede usar la API de Discourse para obtener todas las publicaciones de un tema utilizando el punto final
.../t/{id}.json.Añadir un parámetro de consulta
La forma más fácil de obtener todas las publicaciones de un tema es agregar un parámetro de consulta
print=truea la URL a la que está realizando la solicitud.Por ejemplo:
https://examplesite/t/{id}.json?print=trueCuando se agrega el parámetro de consulta
print=true, Discourse establece elchunk_sizepara el número de publicaciones que se devuelven en 1000. Eso significa que este es un buen enfoque para usar siempre que esté seguro de que sus temas no tienen más de 1000 publicaciones.Múltiples solicitudes a la API
El otro método para obtener todas las publicaciones es realizar múltiples solicitudes a la API para obtener todas las publicaciones del tema:
Primero, realizaría una solicitud
GETinicial al punto final.../t/{id}.json. Esto contendrá un hashposts_streamque contiene una matrizpostsy una matrizstream. La matrizpostsle dará las primeras 20 publicaciones.Ahora necesita recorrer la matriz
stream, que le da todos los ID de publicación en el tema. Elimine los primeros 20 ID de publicación del flujo (de lo contrario, los está volviendo a descargar sin motivo).Luego puede realizar solicitudes adicionales al punto final “Obtener publicaciones específicas de un tema”
.../t/{id}/posts.json, agregarpost_ids[]y pasar todos los ID de la matrizstreamen fragmentos de 20. Por ejemplo:.../t/{id}/posts.json?post_ids[]=46&post_ids[]=47&post_ids[]=48&post_ids[]=49&post_ids[]=50&post_ids[]=51&post_ids[]=52&post_ids[]=53&post_ids[]=54&post_ids[]=55&post_ids[]=56&post_ids[]=57&post_ids[]=58&post_ids[]=59&post_ids[]=60&post_ids[]=61&post_ids[]=62&post_ids[]=63&post_ids[]=64&post_ids[]=65Límites de Tasa
Si encuentra un mensaje de
Error: ha realizado esta acción muchas veces, inténtelo de nuevo más tardeal realizar múltiples llamadas a la API, esto indica que está alcanzando los límites de tasa de la clave de API.Discourse tiene un límite en el número de solicitudes
print=trueque se pueden realizar por hora, lo que se controla mediante la configuración del sitiomax prints per hour per user. Esta configuración tiene como valor predeterminado permitir solo a los usuarios imprimir 5 temas por hora. Puede establecer esa configuración en0para deshabilitar el límite de tasa.Tenga en cuenta que el límite de tasa no se aplicará si utiliza una clave de API de todos los usuarios para las solicitudes y proporciona el nombre de usuario de un administrador del sitio para el parámetro
Api-Usernamede la solicitud. Eso significa que, en lugar de deshabilitar la configuración del sitiomax prints per hour per user, podría simplemente usar un nombre de usuario de administrador (por ejemplo,system) para las solicitudes.Si está experimentando errores de límite de tasa con solicitudes de API que no contienen
print=true, le recomendamos agregar un tiempo de espera a su script de API para que no exceda los límites de tasa. Alternativamente, puede escuchar los códigos de error429(demasiadas solicitudes) y retroceder en las solicitudes cuando reciba esa respuesta.Como referencia, los límites de tasa predeterminados que se enumeran a continuación se aplican a nuestros planes alojados estándar y de negocios:
discourse/config/discourse_defaults.conf at main · discourse/discourse · GitHub
Solo Autoalojado - Ver: Available settings for global rate limits and throttling para obtener detalles sobre cómo ajustar los límites de tasa de la API de Discourse.
¿Se admite el parámetro de consulta ?page? Funciona, pero de una manera sorprendente: ?page=1 solo devuelve la primera publicación del tema, por lo que para paginar con el parámetro, debe comenzar con https://example.com/t/slug/topicId.json, luego saltar a https://example.com/t/slug/topicId.json?page=2, luego continuar hasta que finalmente obtenga una respuesta 404.
Hola Simon,
Usar el parámetro ?page=1 con el endpoint Get a single topic devolverá las primeras 20 publicaciones de un tema, y cada número de página subsiguiente devolverá hasta 20 publicaciones.
Cuando no haya más publicaciones disponibles (por ejemplo, si la página es demasiado alta y no es válida), obtendrás una respuesta 404.
Si no especificas un número de página, el código establecerá el número de página en 1, por lo que ?page=1 es lo mismo que no añadir una página explícita a la solicitud del tema.
Si quisieras usar este método para obtener todas las publicaciones de un tema, deberías poder hacerlo, aunque no se mencione en la Documentación de la API de Discourse.
¡Gracias! Trabajando en un bot de Matrix para obtener publicaciones.
Creo que esto es incorrecto. Establecer en 0 deshabilitará la impresión por completo. La última descripción de esta configuración es Número máximo de impresiones de página /print (establecer en 0 para deshabilitar la impresión).
