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:

https://github.com/tindie/pydiscourse

And a forked version that has been updated somewhat recently:

https://github.com/bennylope/pydiscourse

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.

https://github.com/bennylope/pydiscourse issue #38 fixes the problem, but the fixed version has not yet been pushed to pypi- https://github.com/bennylope/pydiscourse/issues/38. 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 »