大家好:
我在使用 GET /polls/voters.json 时遇到问题(我需要每个选项的投票者 userName 或 ID)。
Discourse 总是返回我这个错误:
{
“errors”: [
“您向请求提供了无效参数:poll_name”
],
“error_type”: “invalid_parameters”
}
post_id 和 poll_name 没问题,因为 vote 和 unvote 端点工作正常。只有这个端点有问题 ![]()
大家好:
我在使用 GET /polls/voters.json 时遇到问题(我需要每个选项的投票者 userName 或 ID)。
Discourse 总是返回我这个错误:
{
“errors”: [
“您向请求提供了无效参数:poll_name”
],
“error_type”: “invalid_parameters”
}
post_id 和 poll_name 没问题,因为 vote 和 unvote 端点工作正常。只有这个端点有问题 ![]()
您好 @ganncamp,我没有看到那个导出按钮。也许我应该从服务器配置它?我没有找到任何关于此的配置。
我找到了一个应该返回此信息的端点,但它不起作用 - https://github.com/discourse/discourse/blob/main/plugins/poll/app/controllers/polls_controller.rb#L46
“显示明细”会显示什么?
导出按钮显示您是否安装并运行了 Discourse Data Explorer 插件。未来有计划将其分离,但目前存在依赖关系。
感谢大家的帮助!我不想安装那个插件。也许,我会找到一个变通的方法,比如投票和取消投票之类的 ![]()
我试图逆向工程导出按钮以获取投票结果,但总是收到 422 响应。
url
'https://forum.example.com/admin/plugins/explorer/queries/-16/run.csv'
params
{'post_id': 82022, 'poll_name': 'poll2'}
headers
{'Api-Key': 'redacted', 'Api-Username': 'discobot'}
requests.post(url, params=params, headers=headers)
422
查询 16 是内置的投票报告。我已经允许管理员访问此查询。@discobot 是一名管理员。
![]()
此用户名和 API 密钥适用于所有其他查询。这是我唯一的基于数据浏览器的查询(顺便说一句,这似乎是一个非常强大的工具)。
这是一个可行的解决方案,可获取导出投票内容。
import requests
from io import StringIO
import csv
from urllib.parse import urlencode
def get_discourse_poll_results(post_id, poll_name):
"""
使用 Data Explorer 的查询 16 从 Discourse 检索投票结果,
该查询以 CSV 格式返回投票结果。
"""
url = f"{DISCOURSE_URL}/admin/plugins/explorer/queries/-16/run.csv"
payload = {
"params": f'{{"poll_name":"{poll_name}","post_id":"{post_id}"}}',
"explain": "false",
"limit": "1000000",
"download": "1",
}
headers = {
"Api-Key": DISCOURSE_API_KEY,
"Api-Username": DISCOURSE_API_USERNAME,
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"X-Requested-With": "XMLHttpRequest"
}
try:
response = requests.post(url, data=urlencode(payload), headers=headers)
response.raise_for_status()
csv_data = StringIO(response.text)
reader = csv.reader(csv_data)
results = list(reader)
processed_results = process_poll_results(results)
reformatted_results = reformat_rating_poll(processed_results)
return reformatted_results
except requests.exceptions.RequestException as e:
print(f"检索投票结果时出错: {e}")
print(f"响应文本: {response.text}")
return None