설문조사에서 투표자를 어떻게 가져올 수 있을까요?

팀 여러분께,

GET /polls/voters.json 요청에서 문제가 발생하고 있습니다. (각 옵션에 투표한 모든 userName 또는 ID가 필요합니다.)
Discourse는 항상 다음 오류를 반환합니다:

{
“errors”: [
“You supplied invalid parameters to the request: poll_name”
],
“error_type”: “invalid_parameters”
}

vote 및 unvote 엔드포인트가 정상적으로 작동하므로 post_id와 poll_name은 문제없는 것으로 보입니다. 이 엔드포인트에서만 문제가 발생합니다. :frowning:

바보 같은 질문일지도 모르지만, 투표 자체에 ‘내보내기’ 버튼이 보이지 않나요?

내보내기를 실행하면 브라우저의 개발자 도구를 통해 API 호출을 확인할 수 있을 텐데요…

@ganncamp님, 안녕하세요. 내보내기 버튼을 찾을 수 없습니다. 서버에서 설정해야 하는 건가요? 관련 설정을 찾지 못했습니다.

이 정보를 반환해야 할 엔드포인트를 찾았지만 작동하지 않습니다 - https://github.com/discourse/discourse/blob/main/plugins/poll/app/controllers/polls_controller.rb#L46

"세부 내역 보기"를 클릭하면 어떤 결과가 나와요?

내보내기 버튼은 Discourse Data Explorer 플러그인이 설치되어 정상적으로 작동할 때 표시됩니다. 궁극적으로 이 플러그인을 분리할 계획이 있지만, 현재로서는 의존성이 존재합니다.

도와주셔서 감사합니다! 그 플러그인을 설치하고 싶지 않습니다. 투표와 투표 취소 같은 방식으로 우회할 방법을 찾아볼 수도 있겠네요 :frowning:

Export 버튼을 역공학하여 투표 결과를 가져오려 하고 있지만, 항상 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 poll에서 가져오는 내용을 얻기 위한 작동하는 해결책입니다.

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"Error retrieving poll results: {e}")
        print(f"Response text: {response.text}")
        return None