Interagir avec Discourse depuis Python ?

Bonjour à tous ! J’adore Discourse, c’est la colonne vertébrale de notre communauté.

Nous sommes un projet open source avec une forte présence sur Github. Nous avons un robot écrit en Python qui gère nos dépôts Github et effectue des tâches telles que fusionner automatiquement les pull requests si elles ont été approuvées. Comme nous avons de nombreux dépôts et que tout le monde ne suit pas chaque dépôt, il serait formidable que le robot puisse publier sur les forums lorsqu’un nouveau projet est créé ou lorsqu’une pull request nécessite une révision.

Pourriez-vous m’indiquer la meilleure façon d’appeler l’API Discourse depuis 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 »

Est-ce que cela a fonctionné pour toi ? J’essaie aussi. Je continue d’obtenir « DiscourseClientError: Payload Too Large ».

1 « J'aime »

Je vois soudainement cette erreur aussi ce week-end en essayant de récupérer un sujet. Ce code de récupération de sujet n’a pas changé depuis plus d’un an, donc quelque chose dans l’API a dû changer. Je suis en train d’enquêter.

2 « J'aime »

Payload Too Large est dû à ce changement.

Je ne connais pas le projet mentionné ci-dessus, mais voici l’état du projet de bennylope. Peut-être que la même correction est nécessaire pour d’autres wrappers.

L’issue #38 sur GitHub - pydiscourse/pydiscourse: A Python library for the Discourse API · GitHub résout le problème, mais la version corrigée n’a pas encore été publiée sur pypi - pydiscourse.exceptions.DiscourseClientError: Payload Too Large · Issue #38 · pydiscourse/pydiscourse · GitHub. En attente que @bennylope sur GitHub le fasse. Vous pouvez donc attendre que pypi soit mis à jour, ou faire un git pull master.

5 « J'aime »

Merci ! Cela a fonctionné. J’ai désinstallé pydiscourse et utilisé une copie locale basée sur ce que vous avez suggéré. Et maintenant, cela fonctionne !
J’essaie d’utiliser l’analyseur de sentiment de Python pour obtenir une analyse de sentiment des derniers messages. Je vous tiendrai au courant de l’évolution des choses.

1 « J'aime »

Est-ce que quelqu’un d’autre l’utilise ? Pouvez-vous obtenir plus de 20 messages par sujet avec cela ?

1 « J'aime »

Vous devrez probablement utiliser la pagination. Je n’ai pas testé cela spécifiquement pour les messages, mais quelque chose comme :

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 »