Wie kann ich Stimmen aus einer Umfrage erhalten?

Hallo Team,

Ich habe ein Problem mit GET zu /polls/voters.json (ich benötige alle Benutzernamen oder IDs, die jede Option gewählt haben).
Discourse gibt mir immer diesen Fehler zurück:

{
“errors”: [
“Sie haben ungültige Parameter für die Anfrage angegeben: poll_name”
],
“error_type”: “invalid_parameters”
}

post_id und poll_name sind in Ordnung, da die Endpunkte vote und unvote einwandfrei funktionieren. Es ist nur dieser hier :frowning:

Dumme Frage, aber sehen Sie nicht eine Schaltfläche „Exportieren“ in der Umfrage selbst?

Wenn Sie den Export ausführen, sollten Sie den API-Aufruf erhalten (über die Entwicklertools Ihres Browsers)…

6 „Gefällt mir“

Hallo @ganncamp, ich sehe diesen Export-Button nicht. Muss ich das vielleicht vom Server aus konfigurieren? Ich habe keine Konfiguration dazu gefunden.

Ich habe einen Endpunkt gefunden, der diese Informationen zurückgeben sollte, aber er funktioniert nicht - https://github.com/discourse/discourse/blob/main/plugins/poll/app/controllers/polls_controller.rb#L46

Was erhalten Sie unter „Aufschlüsselung anzeigen“?

1 „Gefällt mir“

Die Schaltfläche „Exportieren“ wird angezeigt, wenn Sie das Plugin Discourse Data Explorer installiert und funktionsfähig haben. Es gibt Pläne, dies irgendwann auszulagern, aber im Moment besteht eine Abhängigkeit.

8 „Gefällt mir“

Danke an alle für die Hilfe! Ich möchte dieses Plugin nicht installieren. Vielleicht finde ich eine Umgehungslösung mit Abstimmen und Entabstimmen oder so etwas :frowning:

Ich versuche, den Export-Button zu reverse-engineeren, um Umfrageergebnisse zu erhalten, bekomme aber immer eine 422-Antwort.

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

Abfrage 16 ist der integrierte Umfragebericht. Ich habe Administratoren den Zugriff auf diese Abfrage erlaubt. @discobot ist ein Administrator.
image

Dieser Benutzername und API-Schlüssel funktionieren für alle anderen Abfragen. Dies ist meine einzige Abfrage, die auf Data Explorer basiert (was übrigens ein wirklich mächtiges Werkzeug zu sein scheint).

Hier ist eine funktionierende Lösung, um zu erhalten, was Export poll erhält.

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

def get_discourse_poll_results(post_id, poll_name):
    """
    Ruft Umfrageergebnisse von Discourse mithilfe der Data Explorer-Abfrage 16 ab,
    die die Umfrageergebnisse im CSV-Format zurückgibt.
    """

    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"Fehler beim Abrufen der Umfrageergebnisse: {e}")
        print(f"Antworttext: {response.text}")
        return None
2 „Gefällt mir“