qqbot هو روبوت QQ تم تنفيذه في لغة بايثون ويعتمد على بروتوكول SmartQQ الخاص بشركة Tencent ويمكن تشغيله على منصات Linux وWindows وMac OSX.
عنوان جيثب لهذا المشروع: https://github.com/pandolia/qqbot
يمكنك القيام بذلك عن طريق تمديد qqbot:
للاستخدام ضمن Python 2.7/3.4+، قم بالتثبيت باستخدام النقطة:
pip install qqbot
أو قم بتنزيل الكود المصدري، وقم بفك ضغطه، ثم قم بإدخال القرص المضغوط إلى الدليل ثم قم بتشغيل: pip install
.
أدخل: qqbot في سطر الأوامر لبدء QQBot.
أثناء عملية بدء التشغيل، ستظهر صورة رمز الاستجابة السريعة تلقائيًا. ستحتاج إلى استخدام عميل QQ المحمول لمسح الرمز ضوئيًا والسماح بتسجيل الدخول. بعد بدء التشغيل بنجاح، سيتم حفظ معلومات تسجيل الدخول في ملف محلي. عند البدء في المرة القادمة، يمكنك إدخال: qqbot -q qq number . حاول أولاً استعادة معلومات تسجيل الدخول من الملف المحلي (لا حاجة لمسح الرمز يدويًا). فشل الاسترداد فقط. ستحتاج إلى مسح رمز الاستجابة السريعة يدويًا لتسجيل الدخول إذا كان تسجيل الدخول ناجحًا أو انتهت صلاحية معلومات تسجيل الدخول. بشكل عام، ستنتهي صلاحية معلومات تسجيل الدخول المحفوظة بعد يومين.
ملاحظة: في نظام التشغيل Linux، يكون الأمر gvfs-open أو shotwell مطلوبًا في النظام ليظهر تلقائيًا صورة رمز الاستجابة السريعة (بشكل عام، ستحتوي الأنظمة المثبت عليها نظام الملفات الافتراضي GNOME gvfs على أحد هذين الأمرين). في نظام التشغيل Windows 10، يجب تعيين برنامج الفتح الافتراضي لملفات صور png في النظام ليظهر تلقائيًا صورة رمز الاستجابة السريعة.
إذا لم يتمكن النظام من عرض صورة رمز الاستجابة السريعة تلقائيًا، فيمكنك فتح ملف الصورة يدويًا ومسح الرمز ضوئيًا، أو يمكنك ضبط وضع عرض رمز الاستجابة السريعة على وضع صندوق البريد أو وضع الخادم أو وضع النص لمسح الرمز ضوئيًا. انظر القسم 7 من هذه الوثيقة.
بعد بدء تشغيل QQBot، استخدم الأمر qq في نافذة وحدة تحكم أخرى لتشغيل QQBot. يتم توفير الأوامر التالية حاليًا:
1) 帮助、停机和重启命令
qq help|stop|restart|fresh-restart
2) 联系人查询、搜索命令
qq list buddy|group|discuss [$cinfo|$clike]
( $cinfo --> $qq|$name|$key=$val )
( $clike --> :like:$qq|:like:$name|$key:like:$name )
qq list group-member|discuss-member $oinfo|$olike [$cinfo|$clike]
( $oinfo --> $oqq|$oname|$okey=$oval )
( $cinfo --> $qq|$name|$key=$val )
( $olike --> :like:$oqq|:like:$oname|$okey:like:$oname )
( $clike --> :like:$qq|:like:$name|$key:like:$name )
3) 联系人更新命令
qq update buddy|group|discuss
qq update group-member|discuss-member $ginfo
4) 消息发送命令
qq send buddy|group|discuss $rinfo $message
5) 加载/卸载/显示插件
qq plug/unplug myplugin
qq plugins
يوفر أمر القائمة استعلامًا قويًا عن جهات الاتصال ووظائف البحث، وفيما يلي أمثلة الاستخدام:
# 列出所有好友
qq list buddy
# 列出 名称 为 xxx 的群
qq list group xxx
# 列出备注名为 jack 的好友
qq list buddy mark=jack
# 列出 群“456班” 的所有成员
qq list group-member 456班
# 列出 群“456班” 中名片为 “mike” 的成员
qq list group-member 456班 card=mike
# 列出 讨论组“XX小组” 中名为 jack 的好友
qq list discuss-member XX小组 jack
إذا كانت المعلمات الثالثة والرابعة بتنسيق key=val، فيجب أن تكون بتنسيق name=xx|nick=xx|mark=xx|card=xx|qq=xx إذا لم تكن بتنسيق مفتاح = val، اضغط على مبدأ المعالجة كما يلي: إذا كانت سلسلة من الأرقام، فاستعلام عن طريق رقم QQ، وإلا، استعلام عن طريق الاسم.
إذا كان هناك اسم مكرر، فسيتم إدراج كافة جهات الاتصال ذات الاسم المكرر. يحب:
qq list group 机器人测试
سيتم إدراج كافة المجموعات المسماة "اختبار الروبوت".
إذا تمت إضافة ":like:" إلى المعلمتين الثالثة والرابعة لأمر القائمة، فسيعتمد البحث على أنماط المطابقة الجزئية، وفيما يلي أمثلة الاستخدام:
# 列出名称中含有 “李” 的好友
qq list buddy :like:李
# 列出 QQ 中含有 “234” 的群
qq list group :like:234
# 列出备注名中含有 jack 的好友
qq list buddy mark:like:jack
# 列出 群“456班” 的中名称中含有 “李” 的成员
qq list group-member 456班 :like:李
# 列出 群“456班” 中名片中含有 “mike” 的成员
qq list group-member 456班 card:like:mike
# 列出的 讨论组“xx小组” 中名为 jack 的好友
qq list discuss-member :like:小组 jack
بدءًا من الإصدار v2.2.5، يستخدم أمر القائمة جدولًا لإخراج قائمة جهات الاتصال، وفيما يلي مثال على نمط الإخراج الخاص به:
من أجل ضمان تأثير عرض الجدول في الجهاز، يوصى بتعيين خط الإخراج للمحطة على وحدات التحكم والحد الأقصى لعدد الأحرف التي يمكن طباعتها في كل سطر أكبر من 120. لاحظ أيضًا: من أجل ضمان تأثير عرض الجدول، عندما يكون اسم جهة الاتصال وبطاقة العمل والسمات الأخرى طويلة جدًا أو تحتوي على أحرف خاصة، سيتم اقتطاع هذه السمات أو تصفيتها قبل إخراجها إلى الجهاز.
يقوم أمر التحديث بتحديث قائمة جهات الاتصال المحددة، وتكون معاني المعلمات الخاصة بها هي نفس معاني أمر القائمة، مثل:
# 更新好友列表
qq update buddy
# 更新群列表
qq update group
# 更新 群“456班” 的成员列表
qq update group-member 456班
المعلمة الثالثة في أمر الإرسال لها نفس تنسيق المعلمة الثالثة في أمر القائمة. يرجى ملاحظة أنه في حالة وجود اسم مكرر، سيتم إرسال رسالة إلى جميع جهات الاتصال بنفس الاسم. لاحظ أيضًا أن المعلمة الثانية يمكن أن تكون فقط الأصدقاء/المجموعة/المناقشة، وليس عضو المجموعة/عضو المناقشة. مثال:
# 给 好友“jack” 发消息 “你好”
qq send buddy jack 你好
# 给 群“198班” 发消息 “大家好”
qq send group 198班 大家好
# 给 QQ 为 12345 的好友发消息
qq send buddy 12345 xxx
# 给讨论组发消息
qq send discuss MyDiscuss hello
يمكنك تضمين الكلمات الرئيسية للرموز التعبيرية مثل "/ لطيف" في محتوى الرسالة لإرسال الرموز التعبيرية إلى الطرف الآخر، راجعfacemap.py للحصول على التفاصيل. يمكنك أيضًا استخدام حرفي الهروب n وt في محتوى الرسالة (على سبيل المثال: إرسال رفيق جاك السطر الأولn السطر الثاني).
توفر جميع الأوامر المذكورة أعلاه واجهات HTTP API المقابلة لمطوري الواجهة الأمامية للويب للاتصال بها. عنوان URL للواجهة هو http://127.0.0.1:8188/{command}. ما عليك سوى استخدام "/" لكل معلمة الأمر بعد qq، ما عليك سوى فصل الأمر واستبداله في عنوان url، مثل: http://127.0.0.1:8188/send/buddy/jack/hello. ، راجع urltestbot.md للحصول على أمثلة أخرى. ملاحظة: إذا كان الأمر يحتوي على أحرف صينية أو خاصة، فيجب تنفيذ تشفير URL (utf8) أولاً، على سبيل المثال، اتصل بـ http://127.0.0.1:8188/send/buddy/jack/nihao%20%E4%BD%. A0%E5 %A5%BD%20wohao سيرسل الرسالة "nihao hello wohao". (نصيحة: في JavaScript، يمكنك استخدام الدالة encodeURIComponent للتشفير).
بالإضافة إلى ذلك، بعد بدء تشغيل QQBot، إذا كنت تستخدم حساب QQ هذا لإرسال رسالة "--version" إلى مجموعة/مجموعة مناقشة على عملاء آخرين (مثل QQ المحمول)، فسوف يقوم QQBot بالرد تلقائيًا على المجموعة/مجموعة المناقشة: "QQBot -v2.xx".
من السهل جدًا تنفيذ روبوت QQ الخاص بك، ما عليك سوى تحديد وظيفة الاستجابة للرسائل الخاصة بك وتحميلها كمكون إضافي. رمز العينة:
# -*- coding: utf-8 -*-
def onQQMessage ( bot , contact , member , content ):
if content == '-hello' :
bot . SendTo ( contact , '你好,我是QQ机器人' )
elif content == '-stop' :
bot . SendTo ( contact , 'QQ机器人已关闭' )
bot . Stop ()
لاحظ أن اسم وظيفة وظيفة الاستجابة المسجلة أعلاه يجب أن يكون "onQQMessage"، ويجب أن تكون معلمات الوظيفة متوافقة أيضًا مع ما ورد أعلاه.
احفظ الكود أعلاه كـ Sample.py (لاحظ أنه تم حفظه كملف بترميز utf8). ضعه في الدليل ~/.qqbot-tmp/plugins/ ( ~ يمثل الدليل الرئيسي للمستخدم، C:Usersxxx ضمن win7)، أو دليل يمكن استيراده في النظام (مثل Lib/ في python دليل التثبيت) دليل حزم الموقع).
بعد ذلك، استمر في تشغيل عملية qqbot السابقة وأدخل نموذج qq plug في وحدة تحكم أخرى، ثم يمكن تسجيل وظيفة onQQMessage في هذا الملف في الحدث المقابل لـ QQBot. في هذا الوقت، إذا كنت تستخدم QQ آخر لإرسال الرسالة "-مرحبًا" إلى QQ هذا، فسوف يرد تلقائيًا "مرحبًا، أنا روبوت QQ" . إذا أرسلت الرسالة "-stop" ، فسيكون روبوت QQ كذلك مغلق.
أدخل نموذج qq unplug على وحدة التحكم لإلغاء تثبيت هذا البرنامج الإضافي ووظيفة رد الاتصال المقابلة. يمكن تحميل العديد من المكونات الإضافية في نفس الوقت، وسيتم استدعاء الوظائف المقابلة في كل مكون إضافي بالتسلسل (ولكن ترتيب الاستدعاء ليس له علاقة بترتيب التحميل).
بعد بدء تشغيل QQBot، في كل مرة يتلقى فيها رسالة QQ، فإنه سيمرر مصدر الرسالة ومحتوى الرسالة وكائن QQBot إلى وظيفة استجابة الرسالة المسجلة. في:
bot : QQBot 对象,提供 List/SendTo/Stop/Restart 等接口,详见本文档第五节
contact : QContact 对象,消息的发送者,具有 ctype/qq/uin/nick/mark/card/name 等属性
member : QContact 对象,仅当本消息为 群消息或讨论组消息 时有效,代表实际发消息的成员
content : str 对象,消息内容
تمثل جهة الاتصال مرسل الرسالة، ويمكن أن تكون سمة ctype الخاصة بها عبارة عن buddy
/ group
/ discuss
، والتي تمثل كائن صديق / مجموعة / مجموعة مناقشة، مما يشير إلى أن هذه الرسالة هي رسالة صديق / رسالة مجموعة / رسالة مجموعة مناقشة.
العضو صالح فقط عندما تكون هذه الرسالة عبارة عن رسالة جماعية أو رسالة مجموعة مناقشة، وتمثل العضو الذي أرسل الرسالة بالفعل، ويمكن أن تكون سمة ctype الخاصة بها group-member
/ discuss-member
، والذي يمثل عضو المجموعة / كائن عضو مجموعة المناقشة. عندما تكون هذه الرسالة رسالة صديق، فإن العضو يساوي لا شيء.
كل من جهة الاتصال والعضو عبارة عن كائنات QContact للتعرف على معنى سمات الأنواع المختلفة لكائنات QContact، راجع: qcontact-attr. لاحظ أن جميع كائنات QContact هي كائنات للقراءة فقط . يمكن قراءة خصائصها فقط، ولا يمكن تعيين خصائصها، ولا يمكن إضافة خصائص إضافية إليها.
يمكنك استدعاء واجهة SendTo الخاصة بكائن QQBot لإرسال رسائل إلى كائن QContact، ولكن يرجى ملاحظة: يمكنك فقط إرسال رسائل إلى الأصدقاء/المجموعات/مجموعات المناقشة، ولكن ليس إلى أعضاء المجموعة/أعضاء مجموعة المناقشة . بمعنى آخر، يمكن استدعاء bot.SendTo(contact, 'xxx') فقط، لكن لا يمكن استدعاء bot.SendTo( member, 'xxx').
يوفر كائن QQBot إجمالي 9 واجهات عامة List/Update/SendTo/Plug/Unplug/Login/Stop/Restart/FreshRestart جميع الأحرف الأولى من هذه الواجهات مكتوبة بأحرف كبيرة. بالإضافة إلى ذلك، يتم توفير ملف conf للسمات العامة لحفظ معلومات التكوين العامة.
بشكل عام، لا تتصل/تصل إلى أساليب/خصائص أخرى لهذا الكائن. على وجه الخصوص، لا تستدعي هذه الواجهات في المواضيع الفرعية . فيما يلي وصف للواجهات السبعة الأولى وسمات conf.
إذا كنت بحاجة إلى تشغيل أو اختبار الواجهة المذكورة أعلاه في IDE أو python-shell، فأنت بحاجة إلى إغلاق عملية qqbot أولاً، وتشغيل التعليمات البرمجية التالية في IDE أو python-shell لتسجيل الدخول:
>>> from qqbot import _bot as bot
>>> bot.Login(['-q', '1234'])
يتوافق مع أمر القائمة في القسم 3 من هذه الوثيقة. إرجاع قائمة كائنات الاتصال (كائنات QContact) أو لا شيء. المعلمة الأولى tinfo هي الاسم الرمزي لقائمة جهات الاتصال، والمعلمة الثانية اختيارية (التنسيق هو نفس المعلمة الثالثة لأمر القائمة).
يتم استخدام المعلمة tinfo لتمثيل قائمة جهات الاتصال. هذه المعلمة مهمة جدًا في استعلام جهة الاتصال. يرجى التأكد من فهم الحالتين التاليتين :
معنى tinfo (الحالة 1): يمكن أن يكون tinfo buddy
/ group
/ discuss
، والتي تمثل على التوالي قائمة الأصدقاء/قائمة المجموعة/قائمة مجموعة المناقشة. مثال:
# 返回 好友列表:
>>> bot.List('buddy')
# 返回名为 'jack' 的好友的列表:
>>> bot.List('buddy', 'jack')
# 返回 群列表:
>>> bot.List('group')
# 返回名为 “机器人测试” 的群的列表:
>>> bot.List('group', '机器人测试')
معنى tinfo (الحالة 2): يمكن أن يكون tinfo أيضًا كائن QContact مع ctype يساوي group
/ discuss
، ويمثل قائمة أعضاء المجموعة / مجموعة المناقشة. على سبيل المثال، الجملتان الثانية والثالثة أدناه ترجع قائمة أعضاء المجموعة "الفئة 456" وقائمة الأعضاء الذين تكون بطاقة عملهم "جاك" في المجموعة على التوالي:
>>> g = bot.List('group', "456班")[0] # g 是一个 Group 对象(群“456班”)
>>> bot.List(g) # 返回 群“456班” 的成员列表
>>> bot.List(g, 'card=jack') # 返回 群“456班” 中名片为 “jack” 的成员列表
لاحظ أن الجملة الثالثة أعلاه لا تسمح بتنسيق bot.List(g,card='jack').
تسلسل التنفيذ الداخلي لواجهة القائمة: ابحث أولاً عن قائمة جهات الاتصال التي يمثلها tinfo في قاعدة بيانات جهات اتصال QQBot، إذا كانت القائمة موجودة بالفعل في قاعدة البيانات، فابحث داخل هذه القائمة وقم بإرجاع قائمة تحتوي على قائمة "الكل" و"جهات الاتصال المطابقة لـ cinfo". إذا لم تكن هناك قائمة من هذا القبيل في قاعدة البيانات، فاطلب البيانات من خادم QQ للحصول على قائمة جهات الاتصال بعد الحصول عليها بنجاح، وسيتم حفظ قائمة جهات الاتصال في قاعدة البيانات، ثم ابحث عن القائمة التي تحتوي على "هذه القائمة" وإرجاعها في سينفو قائمة "جهات الاتصال المطابقة" في حالة حدوث خطأ أثناء طلب البيانات من خادم QQ، ستتم طباعة معلومات الفشل ذات الصلة ولن يتم إرجاع أي شيء.
معنى القيمة المرجعة لواجهة القائمة: إرجاع قائمة غير فارغة لتمثيل جميع جهات الاتصال المطابقة لـ cinfo في قائمة جهات الاتصال المحددة بواسطة tinfo؛ إرجاع قائمة فارغة للإشارة إلى عدم وجود جهات اتصال تطابق cinfo في قائمة جهات الاتصال لا يوجد ما يمثل فشل طلب قائمة جهات الاتصال والمعلومات من خادم QQ، ولا أعرف ما إذا كانت هناك جهات اتصال مطابقة.
بعد استدعاء واجهة القائمة، تأكد من الحكم على قيمة الإرجاع بناءً على المواقف الثلاثة المذكورة أعلاه قبل تنفيذ التعليمات البرمجية اللاحقة.
ملاحظة: عندما تقوم واجهة القائمة بإرجاع قائمة غير فارغة، فإن العناصر الموجودة في القائمة هي كائنات QContact، وليست كائنات str:
>>> g = bot.List('group')[0] # g 是一个 Group 对象
>>> print([g, type(g), g.qq, g.name, g.uin, g.mark]) # 打印 g 的各项属性
للتعرف على معنى سمات الأنواع المختلفة لكائنات QContact، راجع: qcontact-attr.
المعلمة tinfo لواجهة التحديث لها نفس معنى المعلمات الموجودة في واجهة القائمة. سيؤدي استدعاء هذه الواجهة إلى طلب قائمة جهات الاتصال المقابلة على الفور من خادم QQ وتحديث قاعدة بيانات جهات الاتصال، وسيتم حظرها حتى يتم التحديث بنجاح. أبطأ تحديث هو قائمة الأصدقاء، إذا كان هناك العديد من الأصدقاء، فقد يتم حظرهم لمدة 5 إلى 10 ثوانٍ. يتم تحديث قائمة الأعضاء بسرعة كبيرة، حتى بالنسبة لمجموعة كبيرة مكونة من 2000 شخص، فإن وقت التحديث يتراوح من ثانية إلى ثانيتين فقط.
إذا نجح التحديث، فسيتم إرجاع True، وإلا سيتم إرجاع False.
مثال:
# 更新 好友列表 :
>>> bot.Update('buddy')
# 更新 群列表 :
>>> bot.Update('group')
# 更新 某个群的成员列表 :
>>> gl = bot.List('group', "456班")
>>> if gl:
>>> g = gl[0]
>>> bot.Update(g)
إرسال رسالة إلى جهة اتصال. المعلمة الأولى هي كائن QContact، والمعلمة الثانية هي محتوى الرسالة. تذكير مرة أخرى: يمكنك فقط إرسال رسائل إلى الأصدقاء/المجموعات/مجموعات المناقشة. لا يُسمح لك بإرسال رسائل إلى أعضاء المجموعة/أعضاء مجموعة المناقشة .
يمكنك تضمين الكلمات الرئيسية للرموز التعبيرية مثل "/smile" في محتوى الرسالة لإرسال الرموز التعبيرية إلى الطرف الآخر للحصول على التفاصيل، راجعfacemap.py.
إذا نجح الإرسال، فسيتم إرجاع سلسلة (向xx 发消息成功
). وإلا، فسيتم إرجاع سلسلة تحتوي على سبب الخطأ (错误:...
).
عند إرسال رسالة، قد يتم إرسال الرسالة بشكل متكرر وذلك لأن خادم QQ يقوم بإرجاع الرمز 1202. أضاف الإصدار v2.1.17 معلمة إلى واجهة bot.SendTo لهذه المشكلة: resendOn1202. إذا كانت هذه المعلمة صحيحة (القيمة الافتراضية)، إذا قام خادم QQ بإرجاع الرمز 1202 (يشير إلى احتمال فشل الرسالة) عند إرسال رسالة، وسيستمر أيضًا إرسالها 3 مرات حتى يصبح رمز الإرجاع 0. إذا كانت هذه المعلمة خاطئة، فلن تتم محاولة إعادة الإرسال.
يمكن أن يؤدي ضبطه على True إلى ضمان إرسال الرسالة في معظم الحالات، ولكن العيب هو أنه في بعض الأحيان سيتم إرسال الرسالة بشكل متكرر. إذا تم ضبطه على خطأ، على العكس من ذلك، لن يتم إرسال الرسالة بشكل متكرر، ولكن في بعض الأحيان لا يمكن إرسال الرسالة.
باختصار، بسبب عدم اليقين بشأن رمز 1202 هذا، لا يوجد حل مثالي. يرجى تحديد قيمة resendOn1202 وفقًا لوضعك الفعلي.
يجب أن تكون جهة اتصال المعلمة الأولى هي كائن QContact الذي تم إرجاعه بواسطة bot.List أو المعلمة الأولى التي تم تمريرها بواسطة وظيفة رد الاتصال علىQQMessage. مثال:
# 向 昵称 为 jack 的好友发消息
>>> bl = bot.List('buddy', 'jack')
>>> if bl:
>>> b = bl[0]
>>> bot.SendTo(b, 'hello')
يتم حفظ معلومات التكوين العامة في bot.conf للحصول على تفاصيل حول كل تكوين، راجع القسم 7 من هذا المستند. على سبيل المثال، يحفظ bot.conf.termServerPort رقم المنفذ لخادم سطر أوامر QQBot، ويحفظ bot.conf.qq رقم QQ لتسجيل الدخول هذا.
ملاحظة: معلومات التكوين المحفوظة في bot.conf هي للقراءة فقط. يرجى عدم تعديل معلومات التكوين هذه.
بالإضافة إلى وظيفة استجابة onQQMessage المذكورة أعلاه، يمكنك أيضًا تسجيل وظائف رد الاتصال لإجمالي تسعة أحداث onInit/onQrcode/onStartupComplete/onInterval/onUpdate/onPlug/onUnplug/onExit، يرجى الاطلاع على نماذج لتنسيق معلمة وظيفة رد الاتصال، بمعنى و أمثلة على جميع الأحداث.
عملية تشغيل البرنامج وتوقيت الاستدعاء لكل وظيفة رد اتصال هي كما يلي:
تذكير مرة أخرى: لا يجوز تغيير اسم وظيفة وظيفة رد الاتصال المسجلة ومعلمات الوظيفة (الرقم والاسم) .
عندما يتلقى QQBot رسالة جماعية، فإنه سيحدد أولاً ما إذا كان شخص ما @ نفسه بناءً على محتوى الرسالة. إذا كان الأمر كذلك، أضف علامة [@ME]
في بداية محتوى الرسالة وقم بتمريرها إلى وظيفة onQQMessage؛ وإلا، فاستبدل كل @ME
في محتوى الرسالة بـ @Me
وقم بتمريرها إلى onQQMessage. لذلك، في وظيفة onQQMessage، ما عليك سوى تحديد ما إذا كان المحتوى يحتوي على @ME
لمعرفة ما إذا كنت @ من قبل مرسل الرسالة. على سبيل المثال:
def onQQMessage ( bot , contact , member , content ):
if '@ME' in content :
bot . SendTo ( contact , member . name + ',艾特我干嘛呢?' )
يرجى ملاحظة أنه إذا كان هناك عضو آخر في المجموعة اسمه هو نفس بداية اسمك (على سبيل المثال: اسمك ab واسم عضو آخر هو abc)، فعندما يكون شخص @abc، سيتم الإبلاغ عنه بشكل خاطئ باعتبارك @ME، في هذه الحالة، تحتاج إلى تعديل بطاقة العمل الجماعية الخاصة بك لتجنب النتائج الإيجابية الخاطئة.
عندما يرسل QQ رسالة، سيتلقى QQBot أيضًا نفس الرسالة. يوفر كائن الروبوت طريقة isMe لتحديد ما إذا كانت الرسالة قد تم إرسالها بنفسها:
def onQQMessage ( bot , contact , member , content ):
if bot . isMe ( contact , member ):
print ( 'This is me' )
بدءًا من الإصدار 2.1.13، يوفر qqbot أداة تزيين وظيفية قوية - qqbotsched
لتخصيص المهام المجدولة، نموذج التعليمات البرمجية:
from qqbot import qqbotsched
@ qqbotsched ( hour = '11,17' , minute = '55' )
def mytask ( bot ):
gl = bot . List ( 'group' , '456班' )
if gl is not None :
for group in gl :
bot . SendTo ( group , '同志们:开饭啦啦啦啦啦啦!!!' )
بعد تحميل الكود أعلاه في شكل مكون إضافي، سيتم إرسال رسالة تلقائيًا إلى المجموعة "الفئة 456" كل 11:55 و17:55: "أيها الرفاق: تم تقديم العشاء !!!"
يقبل ديكور qqbotsched ما مجموعه 11 معلمة للكلمات الرئيسية: السنة، الشهر، اليوم، الأسبوع، day_of_week، الساعة، الدقيقة، الثانية، start_date، end_date، المنطقة الزمنية. تمثل كل معلمة القيمة التي يجب أن يطابقها مكون الوقت المخصص للمهمة. على سبيل المثال: الساعة='11,17' تعني أنه يجب تنفيذ المهمة في الساعة 11:xx أو 17:xx، والدقيقة='55' تعني أنه يجب تنفيذ المهمة في الساعة xx:55، والدقيقة='0-55/5'. يعني أن المهمة يجب أن يتم تنفيذها في xx: 00، xx:05، xx:10، ...، xx:55 ينفذ المهمة، day_of_week='mon-fri' (أو '0-4') يشير إلى أن المهمة يجب أن يتم تنفيذها يتم تنفيذها من الاثنين إلى الجمعة.
qqbotsched عبارة عن تغليف بسيط لإطار عمل المهام المجدولة في Python، ويجب إدخال معلماته بتنسيق crontab في أنظمة Unix. للحصول على معلومات حول crontab وإطار عمل المهام المجدولة في Python، يرجى الاطلاع على المواد المرجعية التالية:
للحصول على تفاصيل حول تنسيق كل معلمة crontab، راجع:
يعد تسجيل وظائف رد الاتصال وتخصيص المهام المجدولة هو الطريقة الوحيدة لتوسيع QQBot عند كتابة هذه الوظائف، يرجى الانتباه إلى ما يلي:
عند تسجيل الدخول إلى WebQQ، تحتاج إلى استخدام QQ على هاتفك المحمول لمسح صورة رمز الاستجابة السريعة في QQBot، ويمكن عرض صورة رمز الاستجابة السريعة في الأوضاع الأربعة التالية:
وضع واجهة المستخدم الرسومية هو الوضع الافتراضي وهو متاح فقط على أجهزة الكمبيوتر. يمكن استخدام وضع صندوق البريد على أجهزة الكمبيوتر الشخصية والخوادم البعيدة. يُستخدم وضع الخادم بشكل عام فقط في الأنظمة ذات عناوين IP العامة. إذا كنت تستخدم صندوق بريد QQ لتلقي رمز الاستجابة السريعة، بعد إرسال صورة رمز الاستجابة السريعة، سيتلقى عميل QQ المحمول إشعارًا على الفور. افتح البريد الإلكتروني على عميل QQ المحمول، ثم اضغط لفترة طويلة على رمز QR للمسح الضوئي. يعد وضع النص مناسبًا للاستخدام أثناء عملية التطوير أو نشر الخادم، ويوفر للمطورين اختصارًا لتسجيل الدخول إلى QQ.
ملاحظة: عند تشغيل وضع صندوق البريد/وضع الخادم/وضع النص، يتم إيقاف تشغيل وضع واجهة المستخدم الرسومية، ولن تظهر صورة رمز الاستجابة السريعة تلقائيًا عند تسجيل الدخول.
سيتم إنشاء مدير رمز الاستجابة السريعة (كائن QrcodeManager) في كل مرة تقوم فيها بتسجيل الدخول. سيحدد مدير رمز الاستجابة السريعة طريقة عرض صورة رمز الاستجابة السريعة بناءً على ملف التكوين ومعلمات سطر الأوامر.
ملف التكوين هو ~/.qqbot-tmp/v2.x.conf ( ~ يمثل الدليل الرئيسي للمستخدم، وهو C:Usersxxx ضمن win7 و/home/xxx ضمن Linux، وسيتم تكوينه تلقائيًا بعد التشغيل). QQBot لأول مرة قم بإنشاء ملف التكوين هذا بالمحتويات التالية:
{
# QQBot 的配置文件
# 使用 qqbot -u somebody 启动程序时,依次加载:
# 根配置 -> 默认配置 -> 用户 somebody 的配置 -> 命令行参数配置
# 使用 qqbot 启动程序时,依次加载:
# 根配置 -> 默认配置 -> 命令行参数配置
# 用户 somebody 的配置
"somebody" : {
# QQBot-term (HTTP-API) 服务器端口号(该服务器监听 IP 为 127.0.0.1 )
# 设置为 0 则不会开启本服务器(此时 qq 命令和 HTTP-API 接口都无法使用)。
"termServerPort" : 8188,
# 二维码 http 服务器 ip,请设置为公网 ip 或空字符串
"httpServerIP" : "",
# 二维码 http 服务器端口号
"httpServerPort" : 8189,
# 自动登录的 QQ 号
"qq" : "3497303033",
# 接收二维码图片的邮箱账号
"mailAccount" : "[email protected]",
# 该邮箱的 IMAP/SMTP 服务授权码
"mailAuthCode" : "feregfgftrasdsew",
# 是否以文本模式显示二维码
"cmdQrcode" : False,
# 显示/关闭调试信息
"debug" : False,
# QQBot 掉线后自动重启
"restartOnOffline" : False,
# 在后台运行 qqbot ( daemon 模式)
"daemon": False,
# 完成全部联系人列表获取之后才启动 QQBot
"startAfterFetch" : False,
# 插件目录
"pluginPath" : ".",
# 启动时需加载的插件
"plugins" : [],
# 插件的配置(由用户自定义)
"pluginsConf" : {},
},
# 可以在 默认配置 中配置所有用户都通用的设置
"默认配置" : {
"qq" : "",
"pluginPath" : "",
"plugins" : [
'qqbot.plugins.sampleslots',
'qqbot.plugins.schedrestart',
],
"pluginsConf" : {
'qqbot.plugins.schedrestart': '8:00',
}
},
# # 注意:根配置是固定的,用户无法修改(在本文件中修改根配置不会生效)
# "根配置" : {
# "termServerPort" : 8188,
# "httpServerIP" : "",
# "httpServerPort" : 8189,
# "qq" : "",
# "mailAccount" : "",
# "mailAuthCode" : "",
# "cmdQrcode" : False,
# "debug" : False,
# "restartOnOffline" : False,
# "daemon" : False,
# "startAfterFetch" : False,
# "pluginPath" : "",
# "plugins" : [],
# "pluginsConf" : {}
# },
}
يمكنك إضافة تكوين المستخدم الخاص بك في ملف التكوين (أي إضافة عنصر جديد إلى قاموس الملف، ويمثل مفتاح هذا العنصر مستخدمًا). على سبيل المثال، يمثل عنصر شخص ما الموجود بالفعل في الملف المستخدم اسمه someone. عند تشغيل QQBot، أدخل qqbot -u someone ، وسيتم تحميل التكوينات ضمن مشروع someone.
فيما يلي وصف لوظائف كل تكوين في ملف التكوين. يفترض المحتوى التالي أن التكوين تحت شخص ما قد تم تعديله وتشغيله في وضع qqbot -u someone .
إذا كنت بحاجة إلى استخدام وضع صندوق البريد لعرض رمز QR، فيمكنك تعيين عناصر mailAccount وmailAuthCode كحساب صندوق البريد ورمز التفويض على التوالي، بعد التشغيل، سيقوم مدير رمز QR بإرسال صورة رمز QR إلى صندوق البريد.
ملاحظة: رمز التفويض ليس كلمة مرور تسجيل الدخول لصندوق البريد، ولكنه رمز التفويض المقدم من موفر خدمة صندوق البريد لتنشيط خدمة IMAP/SMTP (تذكير: لا يمكن لصندوق بريد QQ/NetEase تنشيط هذا في خدمة POP3/SMTP ). إعدادات صندوق البريد لخدمة إصدار الويب والحصول على رمز التفويض. إذا تم تعريف mailAccount فقط وليس mailAuthCode، فستتم المطالبة بإدخال رمز التفويض يدويًا عند بدء تشغيل البرنامج.
تم اختبار وضع صندوق البريد في صناديق بريد QQ وNetEase وGoogle.
إذا كنت بحاجة إلى استخدام وضع الخادم، فيمكنك تكوين عناصر httpServerIP وhttpServerPort بشكل عام، ويجب ضبطها على عنوان IP للشبكة العامة. بعد تشغيل وضع الخادم، يمكنك الوصول إلى صورة رمز الاستجابة السريعة من خلال http://{httpServerIP}:{httpServerPort}/{any}. حيث {any} يمكن أن يكون أي سلسلة غير فارغة من الأرقام أو الحروف.
عند تشغيل وضع صندوق البريد ووضع الخادم في نفس الوقت، لن يتم إرسال الصورة الحقيقية عند إرسال بريد إلكتروني، سيتم إرسال عنوان الصورة فقط إلى صندوق البريد، وسيتم إرسالها مرة واحدة فقط عند رمز الاستجابة السريعة تنتهي الصلاحية، فقط قم بتحديث البريد الإلكتروني. إذا قمت بتشغيل وضع صندوق البريد فقط، فسيتم إرسال الصورة الحقيقية عند إرسال بريد إلكتروني. عند انتهاء صلاحية رمز الاستجابة السريعة، ستحتاج إلى تعيين البريد الإلكتروني كمقروء (ستتم قراءة البريد الإلكتروني بعد النقر فوق البريد الإلكتروني الذي يحتوي على QQ على جهازك). الهاتف المحمول) قبل أن يتم إرسال أحدث صور رمز الاستجابة السريعة.
إذا تم تعيين عنصر cmdQrcode على True، فسيتم عرض رمز QR في وضع النص في المصطلح. ملاحظة: لاستخدام وضع النص، تحتاج إلى تثبيت مكتبات Pillow وwcwidth بنفسك، ويمكنك استخدام النقطة (pip) لتثبيتها.
كل مستخدم في ملف التكوين لديه عنصر qq. إذا تم تعيين هذا العنصر على رقم QQ معين، فسيقوم QQBot بتسجيل الدخول تلقائيًا باستخدام معلومات تسجيل الدخول المحفوظة في آخر تسجيل دخول لرقم QQ هذا عند بدء تشغيله.
إذا تم تعيين عنصر RestartOnOffline على True في ملف التكوين، فسيتم إعادة تشغيل QQBot تلقائيًا عندما يصبح غير متصل بالإنترنت أو ينتهي بسبب خطأ.
هذا الخيار صالح فقط في الأنظمة المشابهة لـ UNIX. سيؤدي تعيين الخيار الخفي في التكوين إلى True إلى تشغيل البرنامج في الوضع الخفي. عند هذه النقطة، تتم إعادة توجيه الإخراج القياسي والخطأ القياسي إلى الملف daemon-$qq.log (حيث $qq هي قيمة خيار qq في التكوين).
في الظروف العادية، سيتم تشغيل QQBot فورًا بعد مسح رمز الاستجابة السريعة لتسجيل الدخول. وسيحصل فقط على قائمة جهات الاتصال وتحديث قاعدة بيانات جهات الاتصال عند الضرورة. إذا تم تعيين startAfterFetch في ملف التكوين على True، فسينتظر QQBot حتى يتم الحصول على جميع قوائم جهات الاتصال قبل البدء . لاحظ أنه إذا كان هناك المزيد من جهات الاتصال، فسوف يستغرق الأمر وقتًا أطول.
بعد بدء تشغيل QQBot، سيتم فتح خادم QQBot لمراقبة أوامر التشغيل التي يرسلها المستخدمون من خلال أداة سطر أوامر qq وأوامر التشغيل المرسلة من خلال واجهة HTTP API. دائمًا ما يكون IP الاستماع لهذا الخادم هو 127.0.0.1. ورقم منفذ الاستماع الافتراضي هو 8188، ويمكن تعديل رقم المنفذ هذا عن طريق تعديل قيمة termServerPort.
إذا لم يكن رقم منفذ خادم QQBot-term الذي تم تكوينه هو 8188 الافتراضي، فعند تشغيل أمر qq، تحتاج إلى تحديد رقم المنفذ في المعلمة الأولى، مثل:
$ qq 8100 send buddy jack hello
$ qq 8100 list group-member chatbot
وبالمثل، يجب أيضًا تغيير رقم منفذ واجهة HTTP API، مثل: http://127.0.0.1:8100/send/buddy/jack/hello.
إذا لم تكن بحاجة إلى استخدام أمر qq وواجهة HTTP-API، فيمكنك تعيين رقم المنفذ هذا على 0، ولن يتم فتح خادم QQBot-term في هذا الوقت.
إذا كنت بحاجة إلى تسجيل الدخول إلى أرقام QQ متعددة على نفس الجهاز، فيمكنك فتح عمليات qqbot متعددة مباشرة في محطات مختلفة لتسجيل الدخول. ومع ذلك، يجب على كل عملية qqbot تعيين termServerPort وhttpServerPort الخاص بها (أو تعيين كل شيء على 0 أو قيمة فارغة )، وإلا سيحدث تعارض في رقم المنفذ.
إذا تم تعيين عنصر التصحيح على True، فستتم طباعة معلومات التصحيح أثناء التشغيل.
بشكل عام، يجب تخزين المكونات الإضافية في دليل استيراد النظام أو دليل ~/.qqbot-tmp/plugins. يمكنك تكوين أدلة تخزين أخرى في خيار pluginPath. بالإضافة إلى ذلك، في خيار المكونات الإضافية، يمكنك تحديد المكونات الإضافية التي يجب تحميلها عند بدء تشغيل QQBot.
جميع الخيارات الموجودة في ملف التكوين لها معلمات سطر الأوامر المقابلة، والخيارات المدخلة في معلمات سطر الأوامر لها أولوية أعلى من تلك الموجودة في ملف التكوين. أدخل qqbot -h لعرض كافة تنسيقات معلمات سطر الأوامر.
هناك أربعة مستويات للتكوين في البرنامج، وأولوياتها هي كما يلي:
使用 qqbot -u somebody 启动程序时,依次加载:
根配置 -> 默认配置 -> 用户 somebody 的配置 -> 命令行参数配置
使用 qqbot 启动程序时,依次加载:
根配置 -> 默认配置 -> 命令行参数配置
من بينها: التكوين الجذر ثابت ولا يمكن للمستخدمين تعديله؛ يمكن للمستخدمين تعديل التكوين الافتراضي وتكوين المستخدم في ملف v2.x.conf، وأخيرًا، يمكن أيضًا إدخال التكوينات في معلمات سطر الأوامر.
عند تشغيل qqbot، سيقوم بالبحث/إنشاء الملفات/الأدلة التالية في دليل العمل:
دليل العمل الافتراضي هو ~/.qqbot-tmp/. يمكنك تحديد أدلة عمل أخرى من خلال معلمة سطر الأوامر -b|--bench عند بدء تشغيل qqbot، على سبيل المثال: qqbot -b bench.
المكون الإضافي هو في الواقع وحدة نمطية بيثون، لذلك يمكن أن يكون ملف بايثون أو حزمة بايثون. سيبحث qqbot عن المكونات الإضافية في الدلائل التالية بناءً على اسم المكون الإضافي:
طريقة المكونات الساخنة
يمكنك تحميل/إلغاء تحميل المكونات الإضافية ديناميكيًا أثناء تشغيل qqbot. هناك ثلاث طرق:
يتم استدعاء الطريقتين الأولين من خلال العمليات الخارجية لعملية qqbot، ويتم استخدام الطريقة الثالثة ضمن عملية qqbot. لا تستخدم الطريقتين الأوليين داخل عملية qqbot.
ملاحظة: سيتم فقدان المكونات الإضافية التي تم تحميلها باستخدام طريقة التوصيل السريع بعد إعادة تشغيل qqbot.
وضع التوصيل التلقائي عند البدء
يمكنك أيضًا تحميل المكونات الإضافية تلقائيًا عند بدء تشغيل qqbot، ما عليك سوى تحديد اسم المكون الإضافي الذي يجب تحميله في خيار المكونات الإضافية في التكوين (معلمة سطر الأوامر -pl|--plugins). سيتم تحميل هذه المكونات الإضافية عند بدء التشغيل، قبل تسجيل الدخول.
بالإضافة إلى ذلك، إذا كانت هناك حزمة باسم qqbotdefault في النظام (أو في دليل المكونات الإضافية)، فسيتم تحميل جميع الوحدات الفرعية الموجودة ضمن الحزمة تلقائيًا كمكونات إضافية عند بدء التشغيل (ملاحظة: لن يتم تحميل qqbotdefault نفسه كمكونات إضافية) البرنامج المساعد).
تتضمن كتابة المكونات الإضافية بشكل أساسي كتابة وظائف رد الاتصال أو وظائف المهام المجدولة، راجع الأقسام من 4 إلى 6 للحصول على التفاصيل.
اسم | مؤلف جيثب | وصف الوظيفة | ما إذا كان سيتم التحميل بشكل افتراضي |
---|---|---|---|
qqbot.plugins.sampleslots | باندوليا | مثال على وظيفة رد الاتصال | نعم |
qqbot.plugins.schedrestart | باندوليا | إعادة التشغيل المجدولة | نعم |
qqbot.plugins.miniirc | باندوليا | خادم آي آر سي | لا |
com.passwordlogin | باندوليا | تسجيل الدخول باستخدام اسم المستخدم وكلمة المرور | لا |
com.adblock | com.feisuweb | حظر الإعلانات الجماعية | لا |
سجل الدردشة | com.feisuweb | سجل محتوى الدردشة | لا |
إذا كان لديك أي مكونات إضافية مفيدة لمشاركتها، من فضلك أرسل لي رسالة بالبريد الإلكتروني.
في ظل نظام Linux، نظرًا لأنه لا يمكن استخدام عميل QQ، يمكن استخدام المكون الإضافي qqbot.plugins.miniirc لتنفيذ وظيفة الدردشة على IRC. طريقة التحميل: qq plug qqbot.plugins.miniirc، أو التحميل عند بدء التشغيل: qqbot -pl qqbot.plugins.miniirc، أو أضف qqbot.plugins.miniirc
إلى خيار المكونات الإضافية في ملف التكوين.
بعد تحميل المكون الإضافي، سيتم فتح خادم IRC صغير على المنفذ 6667. يمكن للمستخدمين استخدام عملاء IRC (مثل weechat وirssi وما إلى ذلك) للاتصال بهذا الخادم لإجراء الدردشة في وضع سطر الأوامر. يستخدم ما يلي weechat كمثال لتقديم كيفية استخدامه:
启动 weechat : weechat
连接本服务器: /connect localhost
进入 群聊天 会话: /join group-name
进入 讨论组聊天 会话: /join !discuss-name
进入 好友聊天 会话: /query buddy-name
进入 聊天会话 后,直接敲入文本并回车就可以向对方发送消息了。所有接收到的 QQ 消息也会被转发给相应的 聊天会话 。
在聊天会话之间切换: ctrl+P 或 ctrl+N
显示所有 群和讨论组 的名称: /list
ما ورد أعلاه هو تقريبًا جميع الوظائف التي يوفرها خادم IRC الصغير هذا، ولكنه يكفي للدردشة مع أصدقاء/مجموعات/مجموعات المناقشة في QQ.
يشير QQBOT إلى مشاريع المصادر المفتوحة التالية:
أود أن أشكر المؤلفين الثلاثة المذكورة أعلاه على مشاركتهم غير الأنانية ، وخاصة Scienjus على تحليلها المتعمق والتفصيلي لبروتوكول SmartQQ.