كيف يمكنني الحصول على أصوات من استطلاع رأي؟

مرحباً بالفريق،

أواجه مشكلة مع GET إلى /polls/voters.json (أحتاج إلى جميع أسماء المستخدمين أو المعرفات التي صوتت لكل خيار)
دائماً ما يعيد لي Discourse هذا الخطأ:

{
“errors”: [
“لقد قدمت معلمات غير صالحة للطلب: poll_name”
],
“error_type”: “invalid_parameters”
}

post_id و poll_name جيدان لأن نقاط النهاية vote و unvote تعملان بشكل جيد. إنها فقط هذه :frowning:

سؤال غبي، لكن ألا ترى زر “تصدير” في الاستطلاع نفسه؟

يجب أن يؤدي تشغيل التصدير إلى منحك استدعاء API (عبر أدوات المطور في متصفحك)…

6 إعجابات

مرحباً @ganncamp، أنا لا أرى زر التصدير هذا. ربما يجب عليّ تكوينه من الخادم؟ لم أجد أي إعداد بخصوص هذا.

لقد وجدت نقطة نهاية (endpoint) كان من المفترض أن تُرجع هذه المعلومات ولكنها لا تعمل - https://github.com/discourse/discourse/blob/main/plugins/poll/app/controllers/polls_controller.rb#L46

ما الذي تحصل عليه من “عرض التفصيل”؟

إعجاب واحد (1)

يظهر زر التصدير إذا كان لديك المكون الإضافي Discourse Data Explorer مثبتًا ويعمل. هناك خطط لإلغاء تجميع هذا في النهاية، ولكن في الوقت الحالي هناك تبعية.

8 إعجابات

شكراً للجميع على المساعدة! لا أريد تثبيت هذا المكون الإضافي. ربما أجد حلاً بديلاً بالتصويت وإلغاء التصويت أو شيء من هذا القبيل :frowning:

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

اسم المستخدم ومفتاح الواجهة البرمجية هذا يعملان لجميع الاستعلامات الأخرى. هذا هو الاستعلام الوحيد المستند إلى مستكشف البيانات (والذي يبدو أنه سيكون أداة قوية جدًا، بالمناسبة).

إليك حل يعمل للحصول على ما تحصل عليه “Export poll”.

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

def get_discourse_poll_results(post_id, poll_name):
    """
    Retrieves poll results from Discourse using Data Explorer's query 16,
    which returns the poll results in CSV format.
    """

    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 retrieving poll results: {e}")
        print(f"Response text: {response.text}")
        return None
إعجابَين (2)