Come posso ottenere i voti da un sondaggio?

Ciao team,

Sto riscontrando un problema con GET su /polls/voters.json (ho bisogno di tutti i nomi utente o ID che hanno votato per ogni opzione)
Discourse mi restituisce sempre questo errore:

{
“errors”: [
“Hai fornito parametri non validi alla richiesta: poll_name”
],
“error_type”: “invalid_parameters”
}

post_id e poll_name sono OK perché gli endpoint vote e unvote funzionano correttamente. È solo questo :frowning:

Domanda stupida, ma non vedi un pulsante ‘Esporta’ sul sondaggio stesso?

L’esecuzione dell’esportazione dovrebbe fornirti la chiamata API (tramite gli strumenti per sviluppatori del tuo browser)…

6 Mi Piace

Ciao @ganncamp, non vedo quel pulsante di esportazione. Forse dovrei configurarlo dal server? Non ho trovato alcuna configurazione al riguardo.

Ho trovato un endpoint che dovrebbe restituire queste informazioni ma non funziona - https://github.com/discourse/discourse/blob/main/plugins/poll/app/controllers/polls_controller.rb#L46

Cosa si ottiene da “Mostra ripartizione”?

1 Mi Piace

Il pulsante Esporta viene visualizzato se si dispone del plugin Discourse Data Explorer installato e funzionante. Sono previsti piani per scorporarlo in futuro, ma al momento esiste una dipendenza.

8 Mi Piace

Grazie a tutti per l’aiuto! Non voglio installare quel plugin. Forse troverò una soluzione alternativa con il voto e l’annullamento del voto o qualcosa di simile :frowning:

Sto cercando di fare il reverse engineering del pulsante Esporta per ottenere i risultati del sondaggio, ma ottengo sempre una risposta 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 query 16 è il report integrato per i sondaggi. Ho permesso agli amministratori di accedere a questa query. @discobot è un amministratore.
image

Questo nome utente e questa chiave API funzionano per tutte le altre query. Questa è la mia unica query basata su Data Explorer (che sembra uno strumento davvero potente, tra l’altro).

Ecco una soluzione funzionante per ottenere ciò che Export poll ottiene.

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

def get_discourse_poll_results(post_id, poll_name):
    """
    Recupera i risultati del sondaggio da Discourse utilizzando la query 16 di Data Explorer,
    che restituisce i risultati del sondaggio in 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"Errore nel recupero dei risultati del sondaggio: {e}")
        print(f"Testo della risposta: {response.text}")
        return None
2 Mi Piace