Interaja com o Discourse a partir do Python?

Olá a todos! Adoramos o Discourse, ele é a espinha dorsal da nossa comunidade.

Somos um projeto de código aberto com forte presença no GitHub. Temos um robô escrito em Python que gerencia nossos repositórios do GitHub e realiza tarefas como mesclar pull requests automaticamente quando eles foram aprovados. Como temos muitos repositórios e nem todos acompanham cada um deles, seria incrível se o robô pudesse postar nos fóruns quando um novo projeto é criado ou quando um pull request precisa ser revisado.

Alguém pode me indicar como posso melhor chamar a API do Discourse a partir do Python?

3 curtidas

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 curtidas

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

I will report back with my successes.

2 curtidas

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 curtidas

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

1 curtida

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 curtidas

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 curtidas

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 curtida

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

1 curtida

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 curtidas

Sim, sei que esta é uma postagem antiga, mas como essencialmente é o que procuro, não faz sentido criar uma nova postagem quando esta funciona, mas precisa ser atualizada.

Embora eu saiba programar em muitas linguagens de programação, sinto dizer que Ruby não é uma delas. Estava me perguntando se existem respostas mais novas ou melhores para esta pergunta.

Interagir com o Discourse a partir do Python?


Como uma pergunta secundária, os plugins e/ou temas do Discourse podem ser criados usando Python?

1 curtida

Temas, definitivamente não, isso é apenas Javascript, CSS e HTML.

Plugins: Mais ou menos.

Você pode importar módulos Python para um plugin Discourse baseado em Ruby (on Rails) e chamar funções Python usando Pycall: GitHub - red-data-tools/pycall.rb: Calling Python functions from the Ruby language

Eu o uso em Produção para um propósito muito específico, pois não há módulo equivalente mantido no ecossistema RoR, então isso me evita ter que traduzir e depois manter todo esse código especializado em Ruby.

Funciona surpreendentemente bem.

Dito isso, a base desse Plugin ainda é escrita em Ruby.

Eu recomendaria que você simplesmente aprendesse Ruby on Rails também - é realmente uma linguagem muito agradável e, na minha opinião, o código é mais agradável de ler do que Python :slight_smile:

Eu também deveria reservar um tempo para aprender mais Python se/quando for necessário.

Nota secundária interessante: parte do código em Discourse Chatbot 🤖 que cria o comportamento do agente foi baseado em um agente Python chamado “Funkagent”, que eu primeiro traduzi para Ruby on Rails (e depois modifiquei, aprimorei.). Portanto, a tradução pode ser uma opção, é claro, se fizer sentido. Nesse caso, fez sentido.

3 curtidas

Obrigado.

Essa é uma resposta razoável e uma opção possível que manterei em consideração.

1 curtida

Escrevi vários scripts de importação antes de realmente “aprender” Ruby. Dependendo do que você quer fazer, você pode ser capaz de fazer mais com suas habilidades atuais do que pensa. Provavelmente é mais fácil usar Ruby do que descobrir como usar outra coisa.

No entanto, se você estiver interagindo com a API, pode usar qualquer linguagem que quiser.

5 curtidas

Ruby é lindamente projetada e muito fácil de aprender, na minha humilde opinião.

Ruby on Rails exige um pouco mais de aprendizado e, como um framework baseado em convenções, pode ser complicado às vezes, mas muito poderoso quando você pega o jeito.

2 curtidas

3 posts foram divididos em um novo tópico: Quão difícil seria para não programadores poderem usar o Discourse AI - bot de IA para ajudá-los a criar plugins e/ou temas

Você pode dar uma olhada em GitHub - discourse/all-the-plugins como uma forma de explorar o que é possível.

Escolha algo que você queira fazer e que pareça simples. Se você quiser algo como o cakeday, que muda a definição de um aniversário, então o cakeday pode ser um bom lugar para começar. Você selecionaria uma pequena coisa que deseja mudar e faria as coisas um passo minúsculo de cada vez.

2 curtidas

hah, estou me ensinando Ruby hoje em dia, que diversão mesmo. :exploding_head:

3 curtidas

Olá a todos, também estou interessado em obter dados do Discourse (principalmente estatísticas sobre visualizações e número de usuários) usando Python. Muitos dos pacotes listados aqui não parecem mais estar ativos. Existe uma nova maneira padrão de fazer isso em 2026?

Obrigado!

1 curtida

Você nem sempre precisa usar a interface de outra pessoa.

Não é muito complicado fazer isso através da biblioteca requests integrada, e se você usar algo (por exemplo, Postman, que eu já configurei), você pode importar nossa especificação de API para ele e então pedir para gerar código:

e então adaptar isso às suas necessidades:

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

agora eu tenho informações da categoria:

            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]

Se você quiser acessar informações protegidas, você vai querer usar uma chave de API.

6 curtidas