Python > الحصول على محتوى المنشور عند ذكره

أنا أعبث بلغة بايثون. على وجه التحديد:

أنا أبحث في وثائق واجهة برمجة التطبيقات هذه:

Discourse API Docs / Discourse API Docs

أنا جديد (أتعلم) في لغة بايثون، وأحاول ببساطة تلقي المنشورات إذا تم ذكر @UserA في مكان ما. كنت أعتقد أنني بحاجة إلى الحصول على رقم المنشور من الإشعارات، ثم الاستعلام عن هذا المنشور، لاسترداد وتخزين محتوى المنشور.

من هناك أريد تخزين محتوى هذا المنشور، كمتغير بيانات ومن هناك أتجرب مع بعض الأشياء.

جزء من الكود الخاص بي هو هذا:

# البحث عن الإشارات
mention = client.notifications.json.get()

# طباعة المنشورات
for post_number in mention:
    print(post_number)

المخرج الحالي لهذا الكود:

notifications
total_rows_notifications
seen_notification_id
load_more_notifications

آسف إذا كان هذا سؤالًا غبيًا، فأنا جديد نسبيًا في واجهات برمجة التطبيقات وأحدث في لغة بايثون. لقد كنت أعمل على هذا طوال اليوم دون نجاح، إذا كان بإمكان أي شخص توجيهي في الاتجاه الصحيح، فسيكون ذلك موضع تقدير كبير.

3 إعجابات

شكراً لنشر الرابط إلى fluent-discourse!

أنا حاليًا أحاول مواكبة Python، لذلك من الممكن أن تكون هناك طرق أفضل لمعالجة هذا الأمر مما أقوم بتحديده هنا.

mention = client.notifications.json.get()

هذا يعيد قاموس للإشارات لـ username الذي قمت بتعيينه عند إنشاء client. أفترض أنك قمت بتعيين username إلى UserA عند إنشاء client.

للتأكد من أنه يتم إرجاع قاموس، يمكنك تشغيل:

print(type(mention))

يجب أن يعيد \u003cclass 'dict'\u003e

يمكنك رؤية مفاتيح القاموس عن طريق تشغيل:

print(list(mention))

سيعيد هذا ['notifications', 'total_rows_notifications', 'seen_notification_id', 'load_more_notifications']

بالنسبة لحالتك، تريد القيم الموجودة تحت مفتاح notifications:

notifications = mention['notifications']

إذا قمت بتشغيل type(notifications)، سترى أنها قائمة. للحصول على الإشعارات التي تم تشغيلها بواسطة الإشارات إلى UserA، تحتاج إلى التكرار عبر القائمة للعثور على الإدخالات التي تم تعيين notification_type لها إلى 1. أسهل طريقة لرؤية القيم لأنواع إشعارات Discourse هي تشغيل Notification.types من وحدة تحكم rails الخاصة بموقع Discourse الخاص بك:

 pry(main)> Notification.types
=> {:mentioned=>1,
 :replied=>2,
 :quoted=>3,
 :edited=>4,
 :liked=>5,
 ...

لذلك للحصول على إشعارات “الإشارة” للمستخدم الذي قمت بتعيين اسم المستخدم الخاص به لـ client، جرب شيئًا مثل هذا (أنا أختبر هذا في مترجم Python أثناء كتابته):

data = client.notifications.json.get()
notifications = data['notifications']
# إنشاء كائن قائمة فارغ لتخزين إشعارات "الإشارة"
mentions = []
# التكرار عبر قائمة `notifications` للعثور على جميع الإدخالات التي تم تعيين `notification_type` لها إلى `1`
for notification in notifications:
    if notification['notification_type'] == 1:
        mentions.append(notification)

سيؤدي هذا إلى إنشاء قائمة بالإشعارات التي تم تشغيلها بواسطة الإشارات. سيكون كل عنصر في القائمة قاموسًا. يمكنك التحقق من ذلك بشيء مثل:

for mention in mentions:
    print(mention['topic_id'], mention['post_number'])
3 إعجابات

هذا رائع. شكراً على المعلومات. لا يوجد الكثير من المعلومات المتاحة حول Python و Discourse، لذا يسعدني أن أتعلم، وربما يساعد هذا الآخرين. لقد جربت الكود الخاص بك للتو، ويبدو أنه يعمل كما هو متوقع. بالطبع، لم أتوقف عن اللعب، لذا وجدت حلاً بديلاً للوصول إلى الخطوة 5، وطريقة مختلفة للحصول على القيم التي احتجتها حتى لصق المحتوى الخام للمنشور.

ما أريده هو هذا بشكل أساسي.

  1. الحصول على الإشعارات
  2. الحصول على أرقام المنشورات
  3. الحصول على محتوى المنشور
  4. إنشاء رد باستخدام OpenAI
  5. نشر الرد
  6. تمييز هذا الإشعار نفسه على أنه مقروء؟
# إعداد حلقة لتشغيل الروبوت إلى أجل غير مسمى
while True:
    # الحصول على إجراءات المستخدم وجلب معرف المنشور    
    data = {
    'username': 'theuser',
    # للإشارات والردود، أحتاج إلى الحصول على المرشحات 6 + 7، ولكن لسبب ما يتم إعطاء استجابة JSON واحدة فقط.
    'filter': 6 | 7,
    'limit': 10,
    }
    
    unread_mentions = client.user_actions.json.get(data)
    print(unread_mentions)

    user_actions = unread_mentions['user_actions']

    # التكرار فوق كل إشارة غير مقروءة
    for user_action in unread_mentions['user_actions']:
        topic_id = user_action['topic_id']
        post_number = user_action['post_number']
        post_id = user_action['post_id']
        username = user_action['username']

        print(f'معرف الموضوع: {topic_id}, رقم المنشور: {post_number}, معرف المنشور: {post_id}, الرد على: {username}')
    
        # الحصول على محتوى المنشور   
        post = client.posts[post_id].json.get()

        # طباعة محتوى المنشور
        post_content = post['raw']

        # إنشاء رد على المنشور
        response = generate_response(post_content)
    
        # نشر رد على المنتدى
        content = {
            'topic_id': topic_id,
            'raw': response + ' @' + str(username)
        }
        make_post = client.posts.json.post(content)

حالياً أواجه مشكلتين:

  • يتم جلب إشارة واحدة فقط. لا بد أنني نسيت شيئاً، لكنني لم أكتشف السبب بعد.
  • بالطبع نريد الرد على منشور مرة واحدة فقط، وبما أننا نقوم بالتكرار نحتاج إلى شيء هنا لمنع ذلك.
    • يمكننا تخزين معرف المنشور في ملف .txt (لست متأكداً من مقدار البيانات التي يمكن تخزينها، أعتقد أنه يمكنك التعامل مع العديد من الإشارات هنا.
    • كان حلي المثالي هو تمييز الإشعار على أنه مقروء. لكنني أدركت أنه في أي من أكوادنا، لا نقوم بجلب الإشارات غير المقروءة (حسناً، حاولت في البداية، جلب الإشعارات غير المقروءة، لكنني لم أتمكن من استخراج/تخزين متغير post_id الذي كنت بحاجة لاستخدامه /posts/get.json وجلب المحتوى “الخام”).

هدفي النهائي هو تغذية الاستجابة بواجهة برمجة تطبيقات OpenAI. لكنني أحتاج أولاً إلى إيجاد طريقة لحل المشاكل المذكورة أعلاه.

أفترض أن ما تريد القيام به هو إنشاء رد من OpenAI عند ذكر اسم مستخدم معين (على سبيل المثال، UserA) في منشور. إذا كان هذا صحيحًا، فبدلاً من إجراء طلبات API إلى Discourse للحصول على الإشعارات، يمكنك توجيه webhook لحدث إشعار Discourse إلى خادم تطبيق Python الخاص بك. سيحتاج تطبيق Python إلى النظر في حمولة webhook. إذا تم تعيين notification_type للحمولة على 1، وكان user_id الخاص بها يطابق معرف المستخدم الذي تهتم بالحصول على إشعارات له، فستقوم بإجراء طلب API إلى Discourse للحصول على المنشور المحدد في حقل original_post_id للحمولة. ثم قم بإرسال محتوى المنشور الذي تم إرجاعه من هذا الطلب إلى OpenAI.

إليك مثال على شكل الحمولة لإشعار الإشارة:

{
  "notification": {
    "id": 55267,
    "user_id": 2,
    "notification_type": 1,
    "read": false,
    "high_priority": false,
    "created_at": "2022-12-08T23:23:36.379Z",
    "post_number": 5,
    "topic_id": 277,
    "fancy_title": "I should be able to call this topic anything",
    "slug": "i-should-be-able-to-call-this-topic-anything",
    "data": {
      "topic_title": "I should be able to call this topic anything",
      "original_post_id": 10999,
      "original_post_type": 1,
      "original_username": "scossar",
      "revision_number": null,
      "display_username": "scossar"
    }
  }
}

تكمن فائدة هذا النهج في أنه سيتيح لك تلقي الإشعارات في الوقت الفعلي - دون الحاجة إلى إجراء عدد كبير من طلبات API إلى موقع Discourse الخاص بك.

إذا اخترت نهج webhook، فسيكون من الجيد تعيين حقل “Secret” الخاص بـ webhook على Discourse، ثم التحقق من صحة الطلب على تطبيق Python الخاص بك للتأكد من تعيين المفتاح السري بشكل صحيح. لم أجرب إعداد مسار على تطبيق Python للقيام بذلك بعد. التفاصيل حول كيفية التحقق من صحة “Secret” لـ webhook على WordPress موجودة هنا: wp-discourse-custom-webhook-request/wp-discourse-custom-webhook-request.php at master · scossar/wp-discourse-custom-webhook-request · GitHub.

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

شكراً على ردك، أقدر ذلك كثيراً.

لم أبحث في خطافات الويب الخاصة بـ Discourse من قبل. سأبحث في هذا الأمر.

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

تعديل: أعتقد أنني مخطئ. يبدو أنني أبحث عن النوع 1 و 2. النوع 2 سيتم تشغيله إذا كان هناك رد للمستخدم. هذا يجعل هذا المنشور غير ذي صلة تقريبًا. أثناء اللعب بهذا، خطر ببالي السؤال التالي:

mentioned واضح وضوح الشمس، النوع == 1 إذا كان هناك @Mention واضح.

لكن بالنسبة لـ replied أنا مرتبك بعض الشيء.

عندما أرد على الموضوع، من خلال أحد الأزرار العامة، فإنه يأتي كرد. منطقي.

ولكن إذا نقرت على زر الرد على منشور معين من مستخدم، قد يعتقد المرء أنه إشارة، ولكنه لا يزال إشعارًا من النوع 2.

This should be a mention type notification

ألا يجب أن يحصل إشعار “الرد على المستخدم” على النوع 1؟ لأنه في الأساس هو نفس الإشارة تمامًا، فقط بدون @Mention في المنشور.

للإشارة، نظرًا لأنه لا يوجد في أي مكان آخر في الميتا، سأنشر أنواع الإشعارات هنا. ربما يمكن أن تحصل هذه الأنواع من الإشعارات على نوع جديد، أو فقط النوع 1؟

[1] pry(main)> Notification.types
=> {:mentioned=>1,
 :replied=>2,
 :quoted=>3,
 :edited=>4,
 :liked=>5,
 :private_message=>6,
 :invited_to_private_message=>7,
 :invitee_accepted=>8,
 :posted=>9,
 :moved_post=>10,
 :linked=>11,
 :granted_badge=>12,
 :invited_to_topic=>13,
 :custom=>14,
 :group_mentioned=>15,
 :group_message_summary=>16,
 :watching_first_post=>17,
 :topic_reminder=>18,
 :liked_consolidated=>19,
 :post_approved=>20,
 :code_review_commit_approved=>21,
 :membership_request_accepted=>22,
 :membership_request_consolidated=>23,
 :bookmark_reminder=>24,
 :reaction=>25,
 :votes_released=>26,
 :event_reminder=>27,
 :event_invitation=>28,
 :chat_mention=>29,
 :chat_message=>30,
 :chat_invitation=>31,
 :chat_group_mention=>32,
 :chat_quoted=>33,
 :assigned=>34,
 :question_answer_user_commented=>35,
 :watching_category_or_tag=>36}
إعجاب واحد (1)

لا أعتقد ذلك. إشعارات الإشارة ("notification_type": 1) مخصصة للحالة المحددة عندما تتم إضافة @username إلى منشور. استخدام نفس نوع الإشعار للردود المباشرة سيسبب ارتباكًا.

هناك حالة خاصة يجب الانتباه إليها. إذا تمت إضافة اسم مستخدم إلى رد على موضوع مستخدم، فسيكون الإشعار المرسل إلى المستخدم هو "notification_type": 1، وليس "notification_type": 2. على سبيل المثال، من خلال الإشارة إلى اسم المستخدم الخاص بك هنا، يجب أن يؤدي هذا المنشور إلى إشعار يخبرك بأنني أشرت إليك، وليس إشعارًا يقول إنني رددت عليك: @MarcP.

لاحظ أنه إذا كان مستخدم آخر غيرك يتابع هذا الموضوع، فسيحصل على إشعار بنوعه المحدد إلى 9 (تم النشر).

إعجابَين (2)

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.