Mit Diskurs aus Python interagieren?

Hallo zusammen! Wir lieben Discourse, es ist das Rückgrat unserer Community.

Wir sind ein Open-Source-Projekt mit einer starken Präsenz auf GitHub. Wir haben einen in Python geschriebenen Roboter, der unsere GitHub-Repositories verwaltet und Aufgaben wie das automatische Zusammenführen von Pull Requests übernimmt, sobald diese genehmigt wurden. Da wir viele Repositories haben und nicht jeder jedem Repository folgt, wäre es großartig, wenn der Roboter in den Foren posten könnte, wenn ein neues Projekt erstellt wird oder wenn ein Pull Request überprüft werden muss.

Kann mir jemand zeigen, wie ich die Discourse-API am besten aus Python aufrufen kann?

3 „Gefällt mir“

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 „Gefällt mir“

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

I will report back with my successes.

2 „Gefällt mir“

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 „Gefällt mir“

Hat es bei dir funktioniert? Ich versuche es auch. Ich bekomme ständig „DiscourseClientError: Payload Too Large“.

1 „Gefällt mir“

Ich sehe dieses Fehler über das Wochenende plötzlich auch, wenn ich versuche, ein Thema abzurufen. Der Code zum Abrufen des Themas hat sich seit über einem Jahr nicht geändert, also muss sich etwas an der API geändert haben. Ich untersuche das.

2 „Gefällt mir“

Payload Too Large liegt an dieser Änderung.

Ich weiß nichts über das oben genannte Projekt, aber hier ist der Status für bennylope’s Projekt. Vielleicht ist die gleiche Korrektur auch bei anderen Wrappern erforderlich.

GitHub - pydiscourse/pydiscourse: A Python library for the Discourse API · GitHub Issue #38 behebt das Problem, aber die korrigierte Version wurde noch nicht auf PyPI hochgeladen – pydiscourse.exceptions.DiscourseClientError: Payload Too Large · Issue #38 · pydiscourse/pydiscourse · GitHub. Wir warten darauf, dass GitHub @bennylope dies erledigt. Du kannst also warten, bis PyPI aktualisiert ist, oder einfach git pull master ausführen.

5 „Gefällt mir“

Danke! Das hat funktioniert. Ich habe pydiscourse deinstalliert und eine lokale Kopie basierend auf deinem Vorschlag verwendet. Und jetzt funktioniert es!
Ich versuche, den Sentiment-Analysator von Python zu verwenden, um eine Sentiment-Analyse der neuesten Beiträge durchzuführen. Ich halte dich auf dem Laufenden, wie es läuft.

1 „Gefällt mir“

Nutzt das sonst noch jemand? Bekommt ihr damit mehr als 20 Beiträge pro Thema?

1 „Gefällt mir“

Du musst wahrscheinlich eine Paginierung verwenden. Ich habe das speziell für Beiträge noch nicht ausprobiert, aber so etwas wie:

pagesize = 20
for page in range(100):
    client.posts(topic_id, limit=pagesize, offset=page*pagesize)
3 „Gefällt mir“

Ja, ich weiß, dass dies ein alter Beitrag ist, aber da er im Wesentlichen dem entspricht, was ich suche, macht es keinen Sinn, einen neuen Beitrag zu erstellen, wenn dieser funktioniert, aber nur auf den neuesten Stand gebracht werden muss.

Obwohl ich in vielen Programmiersprachen programmieren kann, muss ich leider sagen, dass Ruby nicht dazu gehört. Ich habe mich gefragt, ob es neuere oder bessere Antworten auf diese Frage gibt.

Mit Discourse aus Python interagieren?


Als Nebenfrage: Können Discourse-Plugins und/oder -Themes mit Python erstellt werden?

1 „Gefällt mir“

Themes, definitiv nicht, das ist nur Javascript, CSS & HTML.

Plugins: Irgendwie schon.

Sie können Python-Module in ein auf Ruby (on Rails) basierendes Discourse-Plugin importieren und Python-Funktionen mit Pycall aufrufen: GitHub - red-data-tools/pycall.rb: Calling Python functions from the Ruby language

Ich verwende es in der Produktion für einen ganz bestimmten Zweck, da es kein gleichwertiges Modul im RoR-Ökosystem gibt, sodass ich nicht den gesamten spezialisierten Code in Ruby übersetzen und dann pflegen muss.

Es funktioniert überraschend gut.

Das Basis-Plugin ist jedoch immer noch in Ruby geschrieben.

Ich würde Ihnen empfehlen, einfach auch Ruby on Rails zu lernen – es ist wirklich eine sehr angenehme Sprache und meiner Meinung nach ist der Code schöner zu lesen als Python :slight_smile:

Ich sollte mir auch die Zeit nehmen, mehr Python zu lernen, wenn die Notwendigkeit besteht.

Interessante Randnotiz: Ein Teil des Codes in Discourse Chatbot 🤖, der das Agentenverhalten erstellt, basierte auf einem Python-Agenten namens „Funkagent“, den ich zuerst in Ruby on Rails übersetzt (und dann modifiziert, erweitert) habe. Eine Übersetzung kann also natürlich eine Option sein, wenn sie sinnvoll ist. In diesem Fall war sie sinnvoll.

3 „Gefällt mir“

Danke.

Das ist eine vernünftige Antwort und eine mögliche Option, die ich im Auge behalten werde.

1 „Gefällt mir“

Ich habe mehrere Import-Skripte geschrieben, bevor ich Ruby wirklich „gelernt“ habe. Je nachdem, was Sie tun möchten, können Sie mit Ihren aktuellen Fähigkeiten möglicherweise mehr erreichen, als Sie denken. Es ist wahrscheinlich einfacher, Ruby zu verwenden, als herauszufinden, wie man etwas anderes benutzt.

Wenn Sie jedoch mit der API interagieren, können Sie jede beliebige Sprache verwenden.

5 „Gefällt mir“

Ruby ist schön gestaltet und meiner Meinung nach ein Kinderspiel zu lernen.

Ruby on Rails erfordert etwas mehr Lernaufwand und kann als Framework, das auf Konventionen basiert, manchmal fummelig sein, ist aber sehr leistungsfähig, wenn man den Dreh raus hat.

2 „Gefällt mir“

3 Beiträge wurden in ein neues Thema aufgeteilt: Wie schwierig wäre es für Nicht-Programmierer, den Discourse AI - KI-Bot zu nutzen, um ihnen bei der Erstellung von Plugins und/oder Themes zu helfen

Sie können sich GitHub - discourse/all-the-plugins ansehen, um sich umzusehen, was möglich ist.

Wählen Sie etwas, das Sie tun möchten und das einfach erscheint. Wenn Sie etwas wie cakeday möchten, das die Definition eines Jubiläums ändert, dann könnte cakeday ein guter Ausgangspunkt sein. Sie würden eine kleine Sache auswählen, die Sie ändern möchten, und die Dinge Schritt für Schritt tun.

2 „Gefällt mir“

hah, ich bringe mir heutzutage Ruby selbst bei, wie lustig. :exploding_head:

3 „Gefällt mir“

Hallo zusammen, ich bin auch daran interessiert, Daten von Discourse (hauptsächlich Statistiken zu Aufrufen und Benutzeranzahl) über Python abzurufen. Viele der hier aufgeführten Pakete scheinen nicht mehr aktiv zu sein. Gibt es 2026 eine neue Standardmethode, dies zu tun?

Danke!

1 „Gefällt mir“

Sie müssen nicht immer die Schnittstelle eines anderen verwenden.

Es ist nicht zu umständlich, dies über die eingebaute requests-Bibliothek zu tun, und wenn Sie etwas verwenden (z. B. Postman, das ich bereits eingerichtet habe), können Sie unsere API-Spezifikation importieren und es dann Code generieren lassen:

und dies dann an Ihre Bedürfnisse anpassen:

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

jetzt habe ich Kategorieinformationen:

            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’&rdq...      NaN
86      calendar  12A89D     FFFFFF  ...                     None  [{'fancy_title': 'Category Calendar demo topic...      NaN
2           tech     444     FFFFFF  ...                     None  [{'fancy_title': 'Poll: What’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’s your all-time f...      NaN
9         sports  0000FF     FFFFFF  ...                     None  [{'fancy_title': 'Modernizing the antiquated b...      NaN

[9 rows x 45 columns]

Wenn Sie auf geschützte Informationen zugreifen möchten, sollten Sie einen API-Schlüssel verwenden.

6 „Gefällt mir“