Interagire con Discourse da Python?

Ciao a tutti! Amiamo Discourse, è la spina dorsale della nostra comunità.

Siamo un progetto open source con una forte presenza su GitHub. Abbiamo un robot scritto in Python che gestisce i nostri repository GitHub e svolge compiti come l’unione automatica delle pull request se sono state approvate. Dato che abbiamo molti repository e non tutti seguono ogni singolo repository, sarebbe fantastico se il robot potesse pubblicare nei forum quando viene creato un nuovo progetto o quando è necessario revisionare una pull request.

Qualcuno può indicarmi la strada migliore per chiamare l’API di Discourse da Python?

3 Mi Piace

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 Mi Piace

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

I will report back with my successes.

2 Mi Piace

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 Mi Piace

È andato tutto bene per te? Sto provando anche io. Continuo a ricevere “DiscourseClientError: Payload Too Large”.

1 Mi Piace

Anche io ho visto improvvisamente questo errore nel weekend, quando ho provato a recuperare un argomento. Il codice per il recupero degli argomenti non è cambiato da oltre un anno, quindi qualcosa nell’API deve essere cambiato. Sto indagando.

2 Mi Piace

Payload Too Large è dovuto a questo cambiamento.

Non conosco il progetto menzionato sopra, ma ecco lo stato del progetto di bennylope. Forse la stessa correzione è necessaria anche per altri wrapper.

La issue #38 di GitHub - pydiscourse/pydiscourse: A Python library for the Discourse API · GitHub risolve il problema, ma la versione corretta non è ancora stata pubblicata su PyPI: pydiscourse.exceptions.DiscourseClientError: Payload Too Large · Issue #38 · pydiscourse/pydiscourse · GitHub. In attesa che @bennylope su GitHub lo faccia. Quindi puoi aspettare che PyPI venga aggiornato oppure eseguire un git pull della master.

5 Mi Piace

Grazie! Ha funzionato. Ho disinstallato pydiscourse e ho utilizzato una copia locale basata su quanto suggerito. Ora funziona!
Sto cercando di utilizzare l’analizzatore di sentiment di Python per ottenere un’analisi del sentiment degli ultimi post. Vi terrò aggiornati sull’andamento.

1 Mi Piace

Qualcun altro lo sta usando? Riesci a ottenere più di 20 post per argomento?

1 Mi Piace

Probabilmente devi utilizzare la paginazione. Non l’ho provato specificamente per i post, ma qualcosa del genere:

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

Sì, so che questo è un vecchio post, ma dato che è essenzialmente ciò che cerco, non ha senso crearne uno nuovo quando questo funziona, ma ha solo bisogno di essere aggiornato.

Sebbene sappia programmare in molti linguaggi di programmazione, mi dispiace dire che Ruby non è uno di questi. Mi chiedevo se ci fossero risposte più recenti o migliori a questa domanda.

Interagire con Discourse da Python?


Come domanda secondaria, è possibile creare plugin e/o temi di Discourse utilizzando Python?

1 Mi Piace

Temi, assolutamente no, sono solo Javascript, CSS e HTML.

Plugin: Più o meno.

Puoi importare moduli Python in un plugin Discourse basato su Ruby (on Rails) e chiamare funzioni Python usando Pycall: GitHub - red-data-tools/pycall.rb: Calling Python functions from the Ruby language

Lo uso in produzione per uno scopo molto specifico poiché non esiste un modulo equivalente mantenuto nell’ecosistema RoR, quindi mi evita di dover tradurre e poi mantenere tutto quel codice specialistico in Ruby.

Funziona sorprendentemente bene.

Detto questo, la base di quel plugin è ancora scritta in Ruby.

Ti consiglio semplicemente di imparare anche Ruby on Rails, è davvero un linguaggio molto piacevole e secondo me il codice è più bello da leggere di Python :slight_smile:

Dovrei anche prendermi il tempo per imparare più Python se/quando necessario.

Nota a margine interessante: parte del codice in Discourse Chatbot 🤖 che crea il comportamento dell’agente si basava su un agente Python chiamato “Funkagent” che ho prima tradotto in Ruby on Rails (e poi modificato, migliorato.). Quindi la traduzione può essere un’opzione ovviamente se ha senso farlo. In quel caso aveva senso.

3 Mi Piace

Grazie.

Questa è una risposta ragionevole e un’opzione possibile che terrò in considerazione.

1 Mi Piace

Ho scritto diversi script di importazione prima di aver veramente “imparato” ruby. A seconda di ciò che vuoi fare, potresti essere in grado di fare di più con le tue attuali competenze di quanto pensi. È probabile che sia più facile usare ruby che capire come usare qualcos’altro.

Se stai interagendo con l’API, allora puoi usare qualsiasi linguaggio tu voglia.

5 Mi Piace

Ruby è progettato in modo splendido e facile da imparare, secondo me.

Ruby on Rails richiede un po’ più di apprendimento e, come framework basato sulle convenzioni, a volte può essere complicato ma molto potente una volta che ci si prende la mano.

2 Mi Piace

3 post sono stati divisi in un nuovo argomento: Quanto sarebbe difficile per i non programmatori poter utilizzare il bot AI di Discourse AI per aiutarli a creare plugin e/o temi

Puoi dare un’occhiata a GitHub - discourse/all-the-plugins per vedere cosa è possibile fare.

Scegli qualcosa che vuoi fare che sembri semplice. Se vuoi qualcosa come cakeday che cambia la definizione di un anniversario, allora cakeday potrebbe essere un buon punto di partenza. Selezioneresti una piccola cosa che vuoi cambiare e faresti le cose un piccolo passo alla volta.

2 Mi Piace

hah Sto imparando Ruby da solo in questi giorni, che divertimento davvero. :exploding_head:

3 Mi Piace

Ciao a tutti, sono anch’io interessato a ottenere dati da Discourse (principalmente statistiche su visualizzazioni e numero di utenti) da Python. Molti dei pacchetti elencati qui non sembrano più attivi. Esiste un nuovo modo standard per farlo nel 2026?

Grazie!

1 Mi Piace

Non è sempre necessario utilizzare l’interfaccia di qualcun altro.

Non è troppo difficile farlo tramite la libreria requests integrata, e se si utilizza qualcosa (ad esempio Postman, che ho già configurato) è possibile importare la nostra specifica API e poi fargli generare il codice:

e poi adattarlo alle proprie esigenze:

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

ora ho le informazioni sulle categorie:

            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]

Se si desidera accedere a informazioni protette, è consigliabile utilizzare una chiave API.

6 Mi Piace