Obtener todos los publicaciones de un tema usando la API

:notebook_with_decorative_cover: 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}.json solo 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=true a la URL a la que está realizando la solicitud.

Por ejemplo: https://examplesite/t/{id}.json?print=true

Cuando se agrega el parámetro de consulta print=true, Discourse establece el chunk_size para 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:

  1. Primero, realizaría una solicitud GET inicial al punto final .../t/{id}.json. Esto contendrá un hash posts_stream que contiene una matriz posts y una matriz stream. La matriz posts le dará las primeras 20 publicaciones.

  2. 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).

  3. Luego puede realizar solicitudes adicionales al punto final “Obtener publicaciones específicas de un tema” .../t/{id}/posts.json, agregar post_ids[] y pasar todos los ID de la matriz stream en 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[]=65

Límites de Tasa

Si encuentra un mensaje de Error: ha realizado esta acción muchas veces, inténtelo de nuevo más tarde al 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=true que se pueden realizar por hora, lo que se controla mediante la configuración del sitio max 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 en 0 para 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-Username de la solicitud. Eso significa que, en lugar de deshabilitar la configuración del sitio max 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 error 429 (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

:grey_exclamation: 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.

11 Me gusta

¿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.

3 Me gusta

¡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).