Comment pourrais-je obtenir les résultats d'un sondage ?

Salut l’équipe,

J’ai un problème avec le GET vers /polls/voters.json (j’ai besoin de tous les noms d’utilisateur ou ID qui ont voté pour chaque option).
Discourse me retourne toujours cette erreur :

{
“errors”: [
“Vous avez fourni des paramètres invalides à la requête : poll_name”
],
“error_type”: “invalid_parameters”
}

post_id et poll_name sont OK car les points de terminaison vote et unvote fonctionnent bien. C’est juste celui-ci :frowning:

Question bête, mais ne voyez-vous pas un bouton « Exporter » sur le sondage lui-même ?

Lancer l’exportation devrait vous donner l’appel API (via les outils de développement de votre navigateur)…

6 « J'aime »

Salut @ganncamp, je ne vois pas ce bouton d’exportation. Dois-je peut-être le configurer depuis le serveur ? Je n’ai trouvé aucune configuration à ce sujet.

J’ai trouvé un point de terminaison qui devrait retourner ces informations, mais cela ne fonctionne pas - https://github.com/discourse/discourse/blob/main/plugins/poll/app/controllers/polls_controller.rb#L46

Qu’obtient-on en cliquant sur « Afficher la répartition » ?

1 « J'aime »

Le bouton Exporter s’affiche si vous avez le plugin Discourse Data Explorer installé et fonctionnel. Il est prévu de le désolidariser éventuellement, mais pour le moment, il existe une dépendance.

8 « J'aime »

Merci à tous pour votre aide ! Je ne veux pas installer ce plugin. Peut-être que je trouverai une solution de contournement avec le vote et le dé-vote ou quelque chose comme ça :frowning:

J’essaie d’effectuer une rétro-ingénierie du bouton d’exportation pour obtenir les résultats des sondages, mais j’obtiens toujours une réponse 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 requête 16 est le rapport de sondage intégré. J’ai autorisé les administrateurs à accéder à cette requête. @discobot est un administrateur.
image

Ce nom d’utilisateur et cette clé d’API fonctionnent pour toutes les autres requêtes. C’est ma seule requête basée sur Data Explorer (ce qui semble être un outil vraiment puissant, d’ailleurs).

Voici une solution fonctionnelle pour obtenir ce que le sondage d’exportation obtient.

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

def get_discourse_poll_results(post_id, poll_name):
    """
    Récupère les résultats d'un sondage de Discourse en utilisant la requête 16 de Data Explorer,
    qui renvoie les résultats du sondage au format 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"Erreur lors de la récupération des résultats du sondage : {e}")
        print(f"Texte de la réponse : {response.text}")
        return None
2 « J'aime »