Como posso obter os votos de uma enquete?

Olá equipe,

Estou tendo um problema com o GET para /polls/voters.json (preciso de todos os nomes de usuário ou IDs que votaram em cada opção).
O Discourse sempre me retorna este erro:

{
“errors”: [
“Você forneceu parâmetros inválidos para a solicitação: poll_name”
],
“error_type”: “invalid_parameters”
}

post_id e poll_name estão OK porque os endpoints vote e unvote funcionam bem. É apenas este :frowning:

Pergunta boba, mas você não vê um botão ‘Exportar’ na própria enquete?

Executar a exportação deve fornecer a chamada da API (através das ferramentas do desenvolvedor do seu navegador)…

6 curtidas

Olá @ganncamp, não estou vendo esse botão de exportação. Talvez eu deva configurá-lo no servidor? Não encontrei nenhuma configuração sobre isso.

Encontrei um endpoint que deveria estar retornando essas informações, mas não está funcionando - https://github.com/discourse/discourse/blob/main/plugins/poll/app/controllers/polls_controller.rb#L46

O que você obtém em “Mostrar detalhamento”?

1 curtida

O botão Exportar é exibido se você tiver o plugin Discourse Data Explorer instalado e funcionando. Há planos para desvincular isso eventualmente, mas no momento existe uma dependência.

8 curtidas

Obrigado a todos pela ajuda! Não quero instalar esse plugin. Talvez eu encontre uma solução alternativa com voto e des-voto ou algo assim :frowning:

Tentando fazer a engenharia reversa do botão Exportar para obter os resultados da enquete, mas sempre recebo uma resposta 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

A consulta 16 é o relatório de enquete integrado. Permiti que os administradores acessassem esta consulta. @discobot é um administrador.
image

Este nome de usuário e chave de API funcionam para todas as outras consultas. Esta é a minha única consulta baseada no Data Explorer (que parece ser uma ferramenta muito poderosa, aliás).

Aqui está uma solução funcional para obter o que a pesquisa Export obtém.

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

def get_discourse_poll_results(post_id, poll_name):
    """
    Recupera os resultados da pesquisa do Discourse usando a consulta 16 do Data Explorer,
    que retorna os resultados da pesquisa em formato 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"Erro ao recuperar resultados da pesquisa: {e}")
        print(f"Texto da resposta: {response.text}")
        return None
2 curtidas