Как можно получить избирателей из опроса?

Привет, команда,

У меня возникла проблема с запросом GET к /polls/voters.json (мне нужны все имена пользователей или идентификаторы, проголосовавшие за каждый вариант).
Discourse постоянно возвращает эту ошибку:

{
“errors”: [
“Вы передали некорректные параметры запроса: poll_name”
],
“error_type”: “invalid_parameters”
}

post_id и poll_name в порядке, так как конечные точки vote и unvote работают нормально. Проблема только в этой :frowning:

Глупый вопрос, но разве вы не видите кнопку «Экспорт» в самом опросе?

Запуск экспорта должен показать вам вызов API (через инструменты разработчика в вашем браузере)…

Привет @ganncamp, я не вижу кнопку экспорта. Возможно, это нужно настроить на сервере? Я не нашёл никаких конфигураций по этому поводу.

Я нашёл эндпоинт, который должен возвращать эту информацию, но он не работает — https://github.com/discourse/discourse/blob/main/plugins/poll/app/controllers/polls_controller.rb#L46

Что вы получите при выборе «Показать детализацию»?

Кнопка «Экспорт» отображается, если у вас установлен и работает плагин Discourse Data Explorer. В будущем планируется отделить его, но на данный момент существует зависимость.

Спасибо всем за помощь! Я не хочу устанавливать этот плагин. Возможно, я найду обходной путь с голосованием и отменой голосования или что-то в этом роде :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-ключ работают для всех остальных запросов. Это мой единственный запрос на основе Data Explorer (который, кстати, кажется очень мощным инструментом).

Вот рабочее решение для получения результатов опроса Export.

import requests
from io import StringIO
import csv
from urllib.parse import urlencode

def get_discourse_poll_results(post_id, poll_name):
    """
    Получает результаты опроса из Discourse, используя запрос 16 Data Explorer,
    который возвращает результаты опроса в формате 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