¿Interactuar con Discourse desde Python?

¡Hola a todos! Nos encanta Discourse, es la columna vertebral de nuestra comunidad.

Somos un proyecto de código abierto con una fuerte presencia en Github. Tenemos un robot escrito en Python que gestiona nuestros repositorios de Github y realiza tareas como fusionar automáticamente las solicitudes de extracción (pull requests) si han sido aprobadas. Dado que tenemos muchos repositorios y no todos siguen cada uno, sería increíble que el robot publicara en los foros cuando se crea un nuevo proyecto o cuando una solicitud de extracción necesita revisión.

¿Alguien puede indicarme cómo puedo llamar mejor a la API de Discourse desde Python?

3 Me gusta

There is a python discourse api library that is a few years old:

And a forked version that has been updated somewhat recently:

Hopefully the latter one will work for you.

Also this plugin may be of interest to you:

https://meta.discourse.org/t/the-github-linkback-plugin/66081

7 Me gusta

Thanks @blake! That is exactly the kind of thing I needed to get started.

I will report back with my successes.

2 Me gusta

I recently started a project for this, and am actively updating it. Currently working towards the next dot release:

https://github.com/samamorgan/discourse

10 Me gusta

¿Funcionó para ti? Yo también lo estoy intentando. Sigo obteniendo “DiscourseClientError: Payload Too Large”.

1 me gusta

¡También estoy viendo repentinamente este error durante el fin de semana al intentar obtener un tema. El código para obtener el tema no ha cambiado en más de un año, por lo que algo debe haber cambiado en la API. Estoy investigando.

2 Me gusta

Payload Too Large se debe a este cambio.

No tengo información sobre el proyecto mencionado anteriormente, pero aquí está el estado del proyecto de bennylope. Es posible que se necesite la misma corrección en otros wrappers también.

La issue #38 en GitHub - pydiscourse/pydiscourse: A Python library for the Discourse API · GitHub soluciona el problema, pero la versión corregida aún no ha sido subida a PyPI: pydiscourse.exceptions.DiscourseClientError: Payload Too Large · Issue #38 · pydiscourse/pydiscourse · GitHub. Estamos a la espera de que @bennylope lo haga en GitHub. Por lo tanto, puedes esperar a que se actualice PyPI o hacer un git pull de la rama master.

5 Me gusta

¡Gracias! Esto funcionó. Desinstalé pydiscourse y usé una copia local basada en lo que sugeriste. ¡Y ahora funciona!
Estoy intentando usar el analizador de sentimientos de Python para obtener un análisis de sentimiento de las últimas publicaciones. Te mantendré al tanto de cómo avanza.

1 me gusta

¿Alguien más está usando esto? ¿Puedes obtener más de 20 publicaciones por tema con esto?

1 me gusta

Probablemente necesites usar paginación. No lo he probado específicamente para publicaciones, pero algo como:

pagesize = 20
for page in range(100):
    client.posts(topic_id, limit=pagesize, offset=page*pagesize)
3 Me gusta

Sí, sé que esta es una publicación antigua, pero dado que es esencialmente lo que busco, no tiene sentido crear una nueva publicación cuando esta funciona, pero solo necesita actualizarse.

Si bien sé programar en muchos lenguajes de programación, lamento decir que Ruby no es uno de ellos. Me preguntaba si hay respuestas más nuevas o mejores a esta pregunta.

¿Interactuar con Discourse desde Python?


Como pregunta secundaria, ¿se pueden crear complementos y/o temas de Discourse usando Python?

1 me gusta

Temas, definitivamente no, eso es solo Javascript, CSS y HTML.

Complementos: Más o menos.

Puedes importar módulos de Python a un complemento de Discourse basado en Ruby (on Rails) y llamar a funciones de Python usando Pycall: GitHub - red-data-tools/pycall.rb: Calling Python functions from the Ruby language

Lo uso en producción para un propósito muy específico, ya que no existe un módulo equivalente mantenido en el ecosistema RoR, por lo que me evita tener que traducir y luego mantener todo ese código especializado en Ruby.

Funciona sorprendentemente bien.

Dicho esto, la base de ese complemento todavía está escrita en Ruby.

Te recomendaría que simplemente aprendieras Ruby on Rails también; realmente es un lenguaje muy agradable y, en mi opinión, el código es más agradable de leer que Python :slight_smile:

También debería tomarme el tiempo para aprender más Python si/cuando sea necesario.

Nota secundaria interesante: parte del código en Discourse Chatbot 🤖 que crea el comportamiento del agente se basó en un agente de Python llamado “Funkagent”, que primero traduje a Ruby on Rails (y luego modifiqué, mejoré). Por lo tanto, la traducción puede ser una opción, por supuesto, si tiene sentido hacerlo. En ese caso, tuvo sentido.

3 Me gusta

Gracias.

Esa es una respuesta razonable y una opción posible que mantendré sobre la mesa.

1 me gusta

Escribí varios scripts de importación antes de “aprender” realmente ruby. Dependiendo de lo que quieras hacer, podrías hacer más con tus habilidades actuales de lo que crees. Probablemente sea más fácil usar ruby que averiguar cómo usar otra cosa.

Sin embargo, si estás interactuando con la API, puedes usar el lenguaje que quieras.

5 Me gusta

Ruby está bellamente diseñada y es pan comido de aprender, en mi humilde opinión.

Ruby on Rails requiere un poco más de aprendizaje y, como framework que se basa en convenciones, puede ser complicado a veces, pero muy potente una vez que le coges el truco.

2 Me gusta

3 publicaciones se dividieron en un nuevo tema: ¿Qué tan difícil sería para los no programadores poder usar el bot de IA de Discourse AI para ayudarles a crear plugins y/o temas

Puedes echar un vistazo a GitHub - discourse/all-the-plugins para ver lo que es posible.

Elige algo que quieras hacer que parezca simple. Si quieres algo como cakeday que cambia la definición de un aniversario, entonces cakeday podría ser un buen lugar para empezar. Seleccionarías una cosa pequeña que quieras cambiar y harías las cosas un paso a la vez.

2 Me gusta

jaja, me estoy enseñando Ruby estos días, qué divertido. :exploding_head:

3 Me gusta

Hola a todos, también estoy interesado en obtener datos de Discourse (principalmente estadísticas sobre vistas y número de usuarios) desde Python. Muchos de los paquetes enumerados aquí no parecen estar activos ya. ¿Hay una nueva forma estándar de hacer esto en 2026?

¡Gracias!

1 me gusta

No siempre necesitas usar la interfaz de otra persona.

No es demasiado problemático hacer esto a través de la biblioteca requests incorporada, y si usas algo (por ejemplo, Postman, que ya tengo configurado), puedes importar nuestra especificación de API y luego hacer que genere código:

y luego adaptarlo a tus necesidades:

import json
import pandas
import requests

url = "https://try.discourse.org/categories.json?include_subcategories=false"

payload = {}
headers = {
  'Accept': 'application/json'
}

response = requests.request("GET", url, headers=headers, data=payload)
response_data = json.loads(response.text)
data = pandas.DataFrame(response_data['category_list']['categories']).set_index('id')

ahora tengo información de la categoría:

            name   color text_color  ... uploaded_background_dark                                             topics can_vote
id                                   ...                                                                                     
5        general  25AAE2     FFFFFF  ...                     None  [{'fancy_title': 'Testing dulu ya jangan di hi...      NaN
4         videos  258af1     FFFFFF  ...                     None  [{'fancy_title': 'Ikan ganteng yang\u0026rsquo;\u0026rdq...      NaN
86      calendar  12A89D     FFFFFF  ...                     None  [{'fancy_title': 'Category Calendar demo topic...      NaN
2           tech     444     FFFFFF  ...                     None  [{'fancy_title': 'Poll: What\u0026rsquo;s your pref...      NaN
1      discourse  00B355     FFFFFF  ...                     None  [{'fancy_title': 'Welcome to our demo!', 'id':...      NaN
53  Topic Voting  F7941D     FFFFFF  ...                     None  [{'fancy_title': 'Is this topic worth voting f...     True
6         gaming  800080     FFFFFF  ...                     None  [{'fancy_title': 'Impressions Games City Build...      NaN
8         movies  B22222     FFFFFF  ...                     None  [{'fancy_title': 'What\u0026rsquo;s your all-time f...      NaN
9         sports  0000FF     FFFFFF  ...                     None  [{'fancy_title': 'Modernizing the antiquated b...      NaN

[9 rows x 45 columns]

Si deseas acceder a información protegida, querrás usar una clave de API.

6 Me gusta