¿Cómo puedo conseguir votantes de una encuesta?

Hola equipo:

Tengo un problema con la solicitud GET a /polls/voters.json (necesito todos los nombres de usuario o IDs que votaron cada opción).
Discourse siempre me devuelve este error:

{
“errors”: [
“Proporcionaste parámetros inválidos en la solicitud: poll_name”
],
“error_type”: “invalid_parameters”
}

post_id y poll_name están bien porque los endpoints de vote y unvote funcionan correctamente. Es solo este :frowning:

Pregunta tonta, pero ¿no ves un botón de ‘Exportar’ en la propia encuesta?

Ejecutar la exportación debería darte la llamada a la API (a través de las herramientas de desarrollador de tu navegador)…

6 Me gusta

Hola @ganncamp, no veo ese botón de exportación. ¿Quizás debería configurarlo desde el servidor? No encontré ninguna configuración al respecto.

Encontré un endpoint que debería devolver esta información pero no funciona: https://github.com/discourse/discourse/blob/main/plugins/poll/app/controllers/polls_controller.rb#L46

¿Qué obtienes de “Mostrar desglose”?

1 me gusta

El botón Exportar se muestra si tiene el plugin Discourse Data Explorer instalado y funcionando. Hay planes para desvincularlo eventualmente, pero por el momento existe una dependencia.

8 Me gusta

¡Gracias a todos por la ayuda! No quiero instalar ese plugin. Quizás encuentre una solución alternativa con votar y des-votar o algo así :frowning:

Intentando hacer ingeniería inversa del botón Exportar para obtener los resultados de la encuesta, pero siempre obtengo una respuesta 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

La consulta 16 es el informe de encuesta incorporado. He permitido a los administradores acceder a esta consulta. @discobot es un administrador.
image

Este nombre de usuario y clave API funcionan para todas las demás consultas. Esta es mi única consulta basada en Data Explorer (que parece que sería una herramienta realmente poderosa, por cierto).

Aquí tienes una solución funcional para obtener lo que Export poll obtiene.

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

def get_discourse_poll_results(post_id, poll_name):
    """
    Recupera los resultados de una encuesta de Discourse utilizando la consulta 16 del Explorador de Datos,
    que devuelve los resultados de la encuesta en 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"Error al recuperar los resultados de la encuesta: {e}")
        print(f"Texto de la respuesta: {response.text}")
        return None
2 Me gusta