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?
blake
(Blake Erickson)
5월 15, 2018, 4:44오후
2
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)를 목표로 하고 있습니다:
A Python wrapper of the Discourse API
당신에게는 성공하셨나요? 저도 같은 방법으로 시도하고 있습니다. 계속 “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)
EricGT
(EricGT)
8월 31, 2023, 7:22오전
11
네, 이 게시물이 오래되었음을 알고 있습니다. 하지만 제가 원하는 내용과 본질적으로 동일하므로, 이 게시물을 최신 상태로 업데이트하는 것 외에는 새로운 게시물을 만들 이유가 없다고 생각했습니다.
여러 프로그래밍 언어로 코딩하는 법은 알고 있지만, 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보다 코드가 읽기 더 좋습니다.
필요하다면 Python도 더 깊이 배워야 할 것 같습니다.
흥미로운 부연 설명: 에이전트 동작을 생성하는 Discourse Chatbot 🤖 의 일부 코드는 제가 처음에 Ruby on Rails로 번역(그리고 수정, 강화)했던 Python 에이전트인 "Funkagent"에 기반하고 있었습니다. 따라서 그럴 만한 가치가 있다면 번역도 하나의 옵션이 될 수 있습니다. 그 경우에는 번역하는 것이 의미가 있었습니다.
EricGT
(EricGT)
8월 31, 2023, 8:40오전
13
감사합니다.
합리적인 답변이며, 검토해 볼 수 있는 가능성 있는 옵션입니다.
pfaffman
(Jay Pfaffman)
8월 31, 2023, 8:47오전
14
Ruby를 제대로 "배웠다"고 할 수 있을 때까지 여러 개의 import 스크립트를 작성해 봤습니다. 무엇을 하려는지에 따라, 현재 기술 수준에서 생각보다 더 많은 일을 할 수 있을지도 모릅니다. 다른 도구를 사용하는 법을 익히는 것보다 Ruby를 사용하는 것이 더 쉽기 때문입니다.
다만, API와 상호작용을 하는 경우라면 어떤 언어를 사용해도 됩니다.
Ruby는 아름답게 설계되어 있고, 내 생각에 배우기 매우 쉽습니다.
Ruby on Rails 는 조금 더 학습이 필요하며, 관습에 의존하는 프레임워크 특성상 때로는 까다로울 수 있지만, 그 원리를 파악하면 매우 강력한 도구가 됩니다.
pfaffman
(Jay Pfaffman)
8월 31, 2023, 1:00오후
17
EricGT:
더 간단한 것을 제안해 줄 수 있나요?
무엇이 가능한지 둘러볼 수 있는 방법으로 GitHub - discourse/all-the-plugins · GitHub 를 살펴볼 수 있습니다.
간단해 보이는, 하고 싶은 것을 하나 선택하세요. 기념일의 정의를 변경하는 cakeday 같은 기능이 필요하다고 한다면, cakeday가 좋은 출발점이 될 수 있습니다. 변경하고 싶은 작은 것 하나를 선택하고, 아주 작은 단계로 하나씩 진행해 보세요.
Lilly
(Lillian )
8월 31, 2023, 1:04오후
18
하하, 요즘 Ruby를 독학 중인데 정말 재미있네요.
remidm
(Rémi Delaporte-Mathurin)
3월 4, 2026, 6:43오후
19
여러분 안녕하세요, 저도 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 키를 사용 해야 합니다.