Interact with discourse from Python?

Hi everyone! Love discourse, it’s the backbone of our community.

We are an open source project with a strong presence on Github. We have a robot written in Python which manages our Github repositories and does things like merge pull requests automatically if they have been approved. Since we have a lot of repositories and not everyone follows every repository it would be awesome if the robot could post in the forums when a new project is created or when a pull request needs to be reviewed.

Can anyone point me in the direction of how I could best call the Discourse API from Python?

3 « J'aime »

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 « J'aime »

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

I will report back with my successes.

2 « J'aime »

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 « J'aime »

Did it work out for you? I am trying this as well. I keep getting “DiscourseClientError: Payload Too Large”.

1 « J'aime »

I’m suddenly seeing this error too over the weekend when attempting to fetch a topic. This topic fetch code hasn’t changed in over a year, so something about the API must have changed. I’m investigating.

2 « J'aime »

Payload Too Large is because of this change.

I don’t know about the project mentioned above, but here is the status for bennylope’s project. Maybe the same fix is needed on other wrappers as well.

GitHub - pydiscourse/pydiscourse: A Python library for the Discourse API issue #38 fixes the problem, but the fixed version has not yet been pushed to pypi- pydiscourse.exceptions.DiscourseClientError: Payload Too Large · Issue #38 · pydiscourse/pydiscourse · GitHub. Waiting for github @bennylope to do it. So you can wait for pypi to be updated, or git pull master.

5 « J'aime »

Thanks! This worked. I uninstalled pydiscourse, and used a local copy based on what you suggested. And now, it works!
I am trying to use Python’s Sentiment analyzer to get a sentiment analysis of the latest posts. I will keep you updated on how it goes.

1 « J'aime »

Is anybody else using this? Are you able to get more than 20 posts per topic using this?

1 « J'aime »

You probably need to use pagination. I haven’t tried this for posts specifically, but something like:

pagesize = 20
for page in range(100):
    client.posts(topic_id, limit=pagesize, offset=page*pagesize)
3 « J'aime »

Oui, je sais que c’est un vieux post, mais comme il correspond essentiellement à ce que je cherche, il n’y a aucun intérêt à créer un nouveau post quand celui-ci fonctionne, il suffit juste de le mettre à jour.

Bien que je sache programmer dans de nombreux langages de programmation, désolé de dire que Ruby n’en fait pas partie. Je me demandais s’il existait des réponses plus récentes ou meilleures à cette question.

Interagir avec Discourse depuis Python ?


En tant que question secondaire, les plugins et/ou thèmes Discourse peuvent-ils être créés en utilisant Python ?

1 « J'aime »

Les thèmes, absolument pas, ce n’est que du Javascript, CSS et HTML.

Les plugins : Un peu.

Vous pouvez importer des modules Python dans un plugin Discourse basé sur Ruby (on Rails) et appeler des fonctions Python en utilisant Pycall : GitHub - red-data-tools/pycall.rb: Calling Python functions from the Ruby language

Je l’utilise en production pour un objectif très spécifique car il n’existe pas de module équivalent maintenu dans l’écosystème RoR, ce qui m’évite d’avoir à traduire puis maintenir tout ce code spécialisé en Ruby.

Cela fonctionne étonnamment bien.

Cela dit, la base de ce plugin est toujours écrite en Ruby.

Je vous recommanderais simplement d’apprendre également Ruby on Rails - c’est vraiment un langage très agréable et, à mon avis, le code est plus agréable à lire que Python :slight_smile:

Je devrais également prendre le temps d’apprendre davantage Python si/quand le besoin s’en fera sentir.

Note annexe intéressante : une partie du code dans Discourse Chatbot 🤖 qui crée le comportement de l’agent était basée sur un agent Python appelé “Funkagent” que j’ai d’abord traduit en Ruby on Rails (puis modifié, amélioré.). La traduction peut donc être une option, bien sûr, si cela a du sens. Dans ce cas, cela avait du sens.

3 « J'aime »

Merci.

C’est une réponse raisonnable et une option possible que je garderai à l’esprit.

1 « J'aime »

J’ai écrit plusieurs scripts d’importation avant de vraiment « apprendre » Ruby. Selon ce que vous voulez faire, vous pourriez être en mesure de faire plus avec vos compétences actuelles que vous ne le pensez. Il est probablement plus facile d’utiliser Ruby que de comprendre comment utiliser autre chose.

Cependant, si vous interagissez avec l’API, vous pouvez utiliser le langage de votre choix.

5 « J'aime »

Ruby est magnifiquement conçu et un jeu d’enfant à apprendre, à mon humble avis.

Ruby on Rails demande un peu plus d’apprentissage et, en tant que framework reposant sur des conventions, peut être délicat par moments mais très puissant une fois que vous l’avez maîtrisé.

2 « J'aime »

3 messages ont été déplacées vers un nouveau sujet : Quelle serait la difficulté pour les non-programmeurs d’utiliser le bot IA de Discourse AI pour les aider à créer des plugins et/ou des thèmes

Vous pouvez consulter GitHub - discourse/all-the-plugins pour voir ce qui est possible.

Choisissez quelque chose que vous voulez faire qui semble simple. Si vous voulez quelque chose comme cakeday qui change la définition d’un anniversaire, alors cakeday pourrait être un bon point de départ. Vous sélectionneriez une petite chose que vous voulez changer et feriez les choses une petite étape à la fois.

2 « J'aime »

hah j’apprends Ruby ces jours-ci, quel plaisir en effet. :exploding_head:

3 « J'aime »

Bonjour à tous, je suis également intéressé par l’obtention de données de Discourse (principalement des statistiques sur les vues et le nombre d’utilisateurs) depuis Python. Beaucoup des paquets listés ici ne semblent plus être actifs. Existe-t-il une nouvelle manière standard de faire cela en 2026 ?

Merci !

1 « J'aime »

Vous n’avez pas toujours besoin d’utiliser l’interface de quelqu’un d’autre.

Ce n’est pas trop difficile de le faire via la bibliothèque requests intégrée, et si vous utilisez quelque chose (par exemple Postman, que j’ai déjà configuré), vous pouvez importer notre spécification d’API dedans et ensuite lui demander de générer du code :

et ensuite l’adapter à vos besoins :

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')

maintenant j’ai les informations de catégorie :

            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 vous souhaitez accéder à des informations protégées, vous voudrez utiliser une clé API.

6 « J'aime »