我怎样才能获取投票的选民?

大家好:

我在使用 GET /polls/voters.json 时遇到问题(我需要每个选项的投票者 userName 或 ID)。
Discourse 总是返回我这个错误:

{
“errors”: [
“您向请求提供了无效参数:poll_name”
],
“error_type”: “invalid_parameters”
}

post_id 和 poll_name 没问题,因为 vote 和 unvote 端点工作正常。只有这个端点有问题 :frowning:

一个愚蠢的问题,但你没有在投票本身看到一个“导出”按钮吗?

运行导出应该可以通过浏览器的开发者工具给你 API 调用……

6 个赞

您好 @ganncamp,我没有看到那个导出按钮。也许我应该从服务器配置它?我没有找到任何关于此的配置。

我找到了一个应该返回此信息的端点,但它不起作用 - https://github.com/discourse/discourse/blob/main/plugins/poll/app/controllers/polls_controller.rb#L46

“显示明细”会显示什么?

1 个赞

导出按钮显示您是否安装并运行了 Discourse Data Explorer 插件。未来有计划将其分离,但目前存在依赖关系。

8 个赞

感谢大家的帮助!我不想安装那个插件。也许,我会找到一个变通的方法,比如投票和取消投票之类的 :frowning:

我试图逆向工程导出按钮以获取投票结果,但总是收到 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 是一名管理员。
image

此用户名和 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
2 个赞