アンケートから票を集めるには?

こんにちは、チームの皆さん

/polls/voters.json への GET リクエストで問題が発生しています(各オプションに投票したすべてのユーザー名または ID が必要です)。
Discourse は常に次のエラーを返します。

{
“errors”: [
“リクエストに無効なパラメータが指定されました: poll_name”
],
“error_type”: “invalid_parameters”
}

vote および unvote エンドポイントは正常に動作するため、post_id と poll_name は問題ありません。このエンドポイントだけがうまくいきません :frowning:

どうでもいい質問かもしれませんが、投票自体に「エクスポート」ボタンが表示されていませんか?

エクスポートを実行すると、API呼び出し(ブラウザの開発者ツール経由)が表示されるはずです…

「いいね!」 6

@ganncampさん、エクスポートボタンが見当たりません。サーバーから設定する必要があるのでしょうか?それに関する設定は見つかりませんでした。

この情報を返すはずのエンドポイントを見つけましたが、機能していません - https://github.com/discourse/discourse/blob/main/plugins/poll/app/controllers/polls_controller.rb#L46

「内訳を表示」で何が表示されますか?

「いいね!」 1

エクスポートボタンは、Discourse Data Explorer プラグインがインストールされて機能している場合に表示されます。将来的にはこのプラグインを切り離す予定ですが、現時点では依存関係があります。

「いいね!」 8

皆さん、ご協力ありがとうございました!そのプラグインはインストールしたくありません。おそらく、投票と投票解除などで回避策を見つけられると思います :frowning:

エクスポートボタンをリバースエンジニアリングして投票結果を取得しようとしていますが、常に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

クエリ16は組み込みの投票レポートです。管理者がこのクエリにアクセスできるようにしました。@discobotは管理者です
image

このユーザー名とAPIキーは、他のすべてのクエリで機能します。これは私の唯一のData Explorerベースのクエリです(これは非常に強力なツールになるようです)。

エクスポートされた投票が取得するものと同じものを取得する、動作するソリューションを次に示します。

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

def get_discourse_poll_results(post_id, poll_name):
    """
    Data Explorer のクエリ 16 を使用して Discourse から投票結果を取得します。
    このクエリは、投票結果を 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"投票結果の取得中にエラーが発生しました: {e}")
        print(f"レスポンステキスト: {response.text}")
        return None
「いいね!」 2