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?

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

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

I will report back with my successes.

최근 이 작업을 위한 프로젝트를 시작했고, 적극적으로 업데이트하고 있습니다. 현재 다음 점 릴리스(dot release)를 목표로 하고 있습니다:

당신에게는 성공하셨나요? 저도 같은 방법으로 시도하고 있습니다. 계속 “DiscourseClientError: Payload Too Large” 오류가 발생하고 있습니다.

주말에 토픽을 가져오려다 갑자기 이 오류가 발생하기 시작했습니다. 이 토픽 가져오기 코드는 1년 넘게 변경된 적이 없으므로, API 쪽에서 무언가가 변경되었을 것입니다. 현재 조사 중입니다.

Payload Too Large 오류는 이 변경 사항 때문입니다.

위에서 언급된 프로젝트에 대해서는 잘 모르겠지만, bennylope의 프로젝트 상태는 다음과 같습니다. 다른 래퍼에서도 동일한 수정이 필요할 수 있습니다.

https://github.com/bennylope/pydiscourse의 issue #38이 이 문제를 수정합니다. 다만 수정된 버전은 아직 pypi에 배포되지 않았습니다 - pydiscourse.exceptions.DiscourseClientError: Payload Too Large · Issue #38 · pydiscourse/pydiscourse · GitHub. GitHub의 @bennylope가 배포하기를 기다리고 있습니다. 따라서 pypi가 업데이트될 때까지 기다리거나, git pull master를 실행할 수 있습니다.

감사합니다! 잘 작동했습니다. pydiscourse를 제거하고, 조언해 주신 내용을 기반으로 로컬 카피를 사용했습니다. 이제 잘 작동합니다!
Python의 감성 분석기를 사용하여 최신 게시글의 감성 분석을 시도하고 있습니다. 진행 상황은 계속 업데이트해 드리겠습니다.

다른 분들도 이걸 사용하시나요? 이렇게 하면 토픽당 20개 이상의 게시물을 가져올 수 있나요?

아마도 페이지네이션을 사용해야 할 것 같습니다. 게시물에 대해 구체적으로 시도해 보지는 않았지만, 다음과 같은 코드를 사용할 수 있습니다:

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

네, 이 게시물이 오래되었음을 알고 있습니다. 하지만 제가 원하는 내용과 본질적으로 동일하므로, 이 게시물을 최신 상태로 업데이트하는 것 외에는 새로운 게시물을 만들 이유가 없다고 생각했습니다.

여러 프로그래밍 언어로 코딩하는 법은 알고 있지만, Ruby는 그렇지 않다는 점을 솔직히 말씀드립니다. 이 질문에 대해 더 최신이거나 더 나은 답변이 있는지 궁금합니다.

Python으로 Discourse와 상호작용하는 방법?


부수적인 질문으로, Discourse 플러그인 또는 테마를 Python으로 만들 수 있는지 궁금합니다.

테마는 절대 안 됩니다. 테마는 JavaScript, CSS, HTML만 지원합니다.

플러그인: 어느 정도 가능합니다.

Ruby (on Rails) 기반의 Discourse 플러그인에서 Python 모듈을 가져와서 Pycall(GitHub - red-data-tools/pycall.rb: Calling Python functions from the Ruby language · GitHub)을 사용하여 Python 함수를 호출할 수 있습니다.

저는 RoR 생태계에서 유지 관리되는 동등한 모듈이 없어서, 전문적인 코드를 Ruby로 번역하고 유지 관리해야 하는 수고를 피하기 위해 매우 구체적인 목적으로 프로덕션 환경에서 이 방식을 사용하고 있습니다.

놀랍도록 잘 작동합니다.

다만, 해당 플러그인의 기반은 여전히 Ruby로 작성되어 있습니다.

Ruby on Rails를 배우는 것을 강력히 권장합니다. 정말로 다루기 편한 언어이며, 제 생각에는 Python보다 코드가 읽기 더 좋습니다. :slight_smile:

필요하다면 Python도 더 깊이 배워야 할 것 같습니다.

흥미로운 부연 설명: 에이전트 동작을 생성하는 Discourse Chatbot 🤖 의 일부 코드는 제가 처음에 Ruby on Rails로 번역(그리고 수정, 강화)했던 Python 에이전트인 "Funkagent"에 기반하고 있었습니다. 따라서 그럴 만한 가치가 있다면 번역도 하나의 옵션이 될 수 있습니다. 그 경우에는 번역하는 것이 의미가 있었습니다.

감사합니다.

합리적인 답변이며, 검토해 볼 수 있는 가능성 있는 옵션입니다.

Ruby를 제대로 "배웠다"고 할 수 있을 때까지 여러 개의 import 스크립트를 작성해 봤습니다. 무엇을 하려는지에 따라, 현재 기술 수준에서 생각보다 더 많은 일을 할 수 있을지도 모릅니다. 다른 도구를 사용하는 법을 익히는 것보다 Ruby를 사용하는 것이 더 쉽기 때문입니다.

다만, API와 상호작용을 하는 경우라면 어떤 언어를 사용해도 됩니다.

Ruby는 아름답게 설계되어 있고, 내 생각에 배우기 매우 쉽습니다.

Ruby on Rails는 조금 더 학습이 필요하며, 관습에 의존하는 프레임워크 특성상 때로는 까다로울 수 있지만, 그 원리를 파악하면 매우 강력한 도구가 됩니다.

무엇이 가능한지 둘러볼 수 있는 방법으로 GitHub - discourse/all-the-plugins · GitHub 를 살펴볼 수 있습니다.

간단해 보이는, 하고 싶은 것을 하나 선택하세요. 기념일의 정의를 변경하는 cakeday 같은 기능이 필요하다고 한다면, cakeday가 좋은 출발점이 될 수 있습니다. 변경하고 싶은 작은 것 하나를 선택하고, 아주 작은 단계로 하나씩 진행해 보세요.

하하, 요즘 Ruby를 독학 중인데 정말 재미있네요. :exploding_head:

여러분 안녕하세요, 저도 discourse에서 데이터를 가져오는 것에 관심이 있습니다(주로 조회수 및 사용자 수와 같은 통계). 여기에 나열된 많은 패키지들은 더 이상 활성화되어 있지 않은 것 같습니다. 2026년에 이 작업을 수행하는 새로운 표준 방식이 있을까요?

감사합니다!

항상 다른 사람의 인터페이스를 사용할 필요는 없습니다.

내장된 requests 라이브러리를 통해 이 작업을 수행하는 것은 그리 번거롭지 않으며, 어떤 도구(예: 이미 설정해 둔 Postman)를 사용하면 API 명세를 가져와 코드를 생성할 수 있습니다:

그리고 필요에 맞게 수정합니다:

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

이제 카테고리 정보를 가졌습니다:

            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]

보호된 정보에 접근하려면 API 키를 사용해야 합니다.