qqbot ist ein in Python implementierter QQ-Roboter, der auf dem SmartQQ-Protokoll von Tencent basiert. Er kann auf Linux-, Windows- und Mac OSX-Plattformen ausgeführt werden.
Die Github-Adresse dieses Projekts: https://github.com/pandolia/qqbot
Sie können dies tun, indem Sie qqbot erweitern:
Zur Verwendung unter Python 2.7/3.4+ installieren Sie mit pip:
pip install qqbot
Oder laden Sie den Quellcode herunter, entpacken Sie ihn, wechseln Sie in das Verzeichnis und führen Sie Folgendes aus: pip install
.
Geben Sie in der Befehlszeile qqbot ein, um einen QQBot zu starten.
Während des Startvorgangs wird automatisch ein QR-Code-Bild angezeigt. Sie müssen den mobilen QQ-Client verwenden, um den Code zu scannen und die Anmeldung zu autorisieren. Nach erfolgreichem Start werden die Anmeldeinformationen in einer lokalen Datei gespeichert. Beim nächsten Start können Sie Folgendes eingeben: qqbot -q qq number Versuchen Sie zunächst, die Anmeldeinformationen aus der lokalen Datei wiederherzustellen (kein manuelles Scannen des Codes erforderlich). . Nur die Wiederherstellung schlägt fehl. Sie müssen den QR-Code manuell scannen, um sich anzumelden, wenn die Anmeldung erfolgreich ist oder die Anmeldeinformationen abgelaufen sind. Im Allgemeinen verfallen gespeicherte Anmeldeinformationen nach 2 Tagen.
Hinweis: Unter Linux ist der Befehl gvfs-open oder shotwell im System erforderlich, um das QR-Code-Bild automatisch anzuzeigen (im Allgemeinen enthalten Systeme, auf denen das virtuelle GNOME-Dateisystem gvfs installiert ist, einen dieser beiden Befehle). Unter Windows 10 muss das Standard-Öffnungsprogramm für PNG-Bilddateien im System eingestellt werden, um das QR-Code-Bild automatisch anzuzeigen.
Wenn das System das QR-Code-Bild nicht automatisch anzeigen kann, können Sie die Bilddatei manuell öffnen und den Code scannen oder den QR-Code-Anzeigemodus auf Postfachmodus, Servermodus oder Textmodus einstellen, um den Code zu scannen. siehe Abschnitt 7 dieses Dokuments.
Nachdem QQBot gestartet wurde, verwenden Sie den Befehl qq in einem anderen Konsolenfenster, um QQBot zu bedienen. Derzeit sind die folgenden Befehle verfügbar:
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
Der Listenbefehl bietet leistungsstarke Kontaktabfrage- und Suchfunktionen. Beispiele für die Verwendung sind:
# 列出所有好友
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
Wenn der dritte und vierte Parameter das Format „key=val“ haben, sollten sie das Format „name=xx|nick=xx|mark=xx|card=xx|qq=xx“ haben key=val, press Das Verarbeitungsprinzip ist wie folgt: Wenn es sich um eine Zahlenfolge handelt, Abfrage nach QQ-Nummer, andernfalls Abfrage nach Name.
Wenn ein doppelter Name vorhanden ist, werden alle Kontakte mit dem doppelten Namen aufgelistet. wie:
qq list group 机器人测试
Alle Gruppen mit dem Namen „Bot Test“ werden aufgelistet.
Wenn „:like:“ zum dritten und vierten Parameter des Listenbefehls hinzugefügt wird, basiert die Suche auf teilweise übereinstimmenden Mustern. Anwendungsbeispiele sind wie folgt:
# 列出名称中含有 “李” 的好友
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
Ab Version v2.2.5 verwendet der Befehl list eine Tabelle zur Ausgabe der Kontaktliste. Ein Beispiel für seinen Ausgabestil ist wie folgt:
Um den Anzeigeeffekt der Tabelle im Terminal sicherzustellen, wird empfohlen, die Ausgabeschriftart des Terminals auf Consolas einzustellen und die maximale Anzahl der Zeichen, die in jeder Zeile gedruckt werden können, ist größer als 120. Beachten Sie außerdem: Um den Anzeigeeffekt der Tabelle sicherzustellen, werden diese Attribute vor der Ausgabe an das Terminal gekürzt oder gefiltert, wenn der Name, die Visitenkarte und andere Attribute des Kontakts zu lang sind oder Sonderzeichen enthalten.
Der Update-Befehl aktualisiert die angegebene Kontaktliste und seine Parameterbedeutungen sind dieselben wie die des List-Befehls, z. B.:
# 更新好友列表
qq update buddy
# 更新群列表
qq update group
# 更新 群“456班” 的成员列表
qq update group-member 456班
Der dritte Parameter im Sendebefehl hat dasselbe Format wie der dritte Parameter im Listenbefehl. Bitte beachten Sie, dass bei einem doppelten Namen eine Nachricht an alle Kontakte mit demselben Namen gesendet wird. Beachten Sie außerdem, dass der zweite Parameter nur „buddy/group/discuss“ sein kann, nicht „group-member/discuss-member“. Beispiel:
# 给 好友“jack” 发消息 “你好”
qq send buddy jack 你好
# 给 群“198班” 发消息 “大家好”
qq send group 198班 大家好
# 给 QQ 为 12345 的好友发消息
qq send buddy 12345 xxx
# 给讨论组发消息
qq send discuss MyDiscuss hello
Sie können Emoticon-Schlüsselwörter wie „/cute“ in den Nachrichteninhalt einbetten, um Emoticons an die andere Partei zu senden. Weitere Informationen finden Sie unter facemap.py. Sie können auch die beiden Escape-Zeichen n und t im Nachrichteninhalt verwenden (zum Beispiel: send buddy jack first linen second line).
Alle oben genannten Befehle stellen entsprechende HTTP-API-Schnittstellen zum Aufrufen von Web-Frontend-Entwicklern bereit. Die URL-Adresse der Schnittstelle lautet http://127.0.0.1:8188/{Befehl}. Sie müssen nur „/“ für jeden Parameter verwenden des Befehls nach qq. Trennen und ersetzen Sie einfach den Befehl in der URL, z. B.: http://127.0.0.1:8188/send/buddy/jack/hello Weitere Beispiele finden Sie unter urltestbot.md. Hinweis: Wenn der Befehl chinesische Zeichen oder Sonderzeichen enthält, muss zuerst die URL-Kodierung (utf8) durchgeführt werden. Rufen Sie beispielsweise http://127.0.0.1:8188/send/buddy/jack/nihao%20%E4%BD% auf. A0%E5 %A5%BD%20wohao sendet die Nachricht „nihao hallo wohao“. (Tipp: In JavaScript können Sie zum Kodieren die Funktion encodeURIComponent verwenden.)
Wenn Sie außerdem nach dem Start von QQBot dieses QQ-Konto verwenden, um eine Nachricht „--version“ an eine Gruppe/Diskussionsgruppe auf anderen Clients (z. B. mobiles QQ) zu senden, antwortet QQBot automatisch an die Gruppe/Diskussionsgruppe: „QQBot -v2.xx“.
Es ist sehr einfach, Ihren eigenen QQ-Roboter zu implementieren. Sie müssen lediglich Ihre eigene Nachrichtenantwortfunktion definieren und diese als Plug-In laden. Beispielcode:
# -*- 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 ()
Beachten Sie, dass der Funktionsname der oben registrierten Antwortfunktion „onQQMessage“ lauten muss und die Funktionsparameter ebenfalls mit den oben genannten übereinstimmen müssen.
Speichern Sie den obigen Code als sample.py (beachten Sie, dass er als utf8-codierte Datei gespeichert wird). Platzieren Sie es im Verzeichnis ~/.qqbot-tmp/plugins/ ( ~ stellt das Home-Verzeichnis des Benutzers dar, C:Usersxxx unter Win7) oder in einem Verzeichnis, das in das System importiert werden kann (z. B. Lib/ in Python). Installationsverzeichnis) Site-Packages-Verzeichnis).
Lassen Sie danach den vorherigen qqbot-Prozess laufen und geben Sie das qq-Plug-Beispiel in eine andere Konsole ein. Anschließend kann die onQQMessage-Funktion in dieser Datei für das entsprechende Ereignis von QQBot registriert werden. Wenn Sie zu diesem Zeitpunkt einen anderen QQ verwenden, um die Nachricht „-hello“ an diesen QQ zu senden, antwortet dieser automatisch „Hallo, ich bin ein QQ-Roboter“ . Wenn Sie die Nachricht „-stop“ senden, wird der QQ-Roboter dies tun geschlossen.
Geben Sie qq unplug sample auf der Konsole ein, um dieses Plug-in und die entsprechende Rückruffunktion zu deinstallieren. Es können mehrere Plug-Ins gleichzeitig geladen werden, und die entsprechenden Funktionen in jedem Plug-In werden nacheinander aufgerufen (die Aufrufreihenfolge hat jedoch nichts mit der Ladereihenfolge zu tun).
Nachdem QQBot gestartet wurde, übergibt es bei jedem Empfang einer QQ-Nachricht die Nachrichtenquelle, den Nachrichteninhalt und ein QQBot-Objekt an die registrierte Nachrichtenantwortfunktion. In:
bot : QQBot 对象,提供 List/SendTo/Stop/Restart 等接口,详见本文档第五节
contact : QContact 对象,消息的发送者,具有 ctype/qq/uin/nick/mark/card/name 等属性
member : QContact 对象,仅当本消息为 群消息或讨论组消息 时有效,代表实际发消息的成员
content : str 对象,消息内容
contact stellt den Absender der Nachricht dar, und sein ctype-Attribut kann buddy
/ group
/ discuss
sein, das das Freund-/Gruppen-/Diskussionsgruppenobjekt darstellt, was angibt, dass es sich bei dieser Nachricht um eine Freundesnachricht/Gruppennachricht/Diskussionsgruppennachricht handelt.
member ist nur gültig, wenn es sich bei dieser Nachricht um eine Gruppennachricht oder eine Diskussionsgruppennachricht handelt, und stellt das Mitglied dar, das die Nachricht tatsächlich gesendet hat. Das ctype-Attribut kann group-member
/ discuss-member
sein, das das Gruppenmitglied/Diskussionsgruppenmitgliedsobjekt darstellt. Wenn es sich bei dieser Nachricht um eine Freundschaftsnachricht handelt, ist „member“ gleich „None“.
Sowohl „contact“ als auch „member“ sind QContact-Objekte. Zur Bedeutung der Attribute verschiedener Typen von QContact-Objekten siehe: qcontact-attr. Beachten Sie, dass alle QContact-Objekte schreibgeschützte Objekte sind. Nur ihre Eigenschaften können gelesen werden, ihre Eigenschaften können nicht festgelegt werden und es können keine zusätzlichen Eigenschaften hinzugefügt werden.
Sie können die SendTo-Schnittstelle des QQBot-Objekts aufrufen, um Nachrichten an das QContact-Objekt zu senden. Beachten Sie jedoch: Sie können Nachrichten nur an Freunde/Gruppen/Diskussionsgruppen senden, nicht jedoch an Gruppenmitglieder/Diskussionsgruppenmitglieder . Mit anderen Worten: Nur bot.SendTo(contact, 'xxx') kann aufgerufen werden, bot.SendTo(member, 'xxx') kann jedoch nicht aufgerufen werden.
Das QQBot-Objekt bietet insgesamt 9 öffentliche Schnittstellen List/Update/SendTo/Plug/Unplug/Login/Stop/Restart/FreshRestart. Die Anfangsbuchstaben dieser Schnittstellen werden alle großgeschrieben. Darüber hinaus wird ein öffentliches Attribut conf bereitgestellt, um globale Konfigurationsinformationen zu speichern.
Rufen Sie im Allgemeinen keine anderen Methoden/Eigenschaften dieses Objekts auf bzw. greifen Sie nicht darauf zu. Rufen Sie diese Schnittstellen insbesondere nicht in untergeordneten Threads auf . Im Folgenden werden die ersten sieben Schnittstellen und conf-Attribute beschrieben.
Wenn Sie die obige Schnittstelle in der IDE oder Python-Shell ausführen oder testen müssen, müssen Sie zuerst den qqbot-Prozess schließen und den folgenden Code in der IDE oder Python-Shell ausführen, um sich anzumelden:
>>> from qqbot import _bot as bot
>>> bot.Login(['-q', '1234'])
Entspricht dem Listenbefehl in Abschnitt 3 dieses Dokuments. Gibt eine Liste von Kontaktobjekten (QContact-Objekten) oder „Keine“ zurück. Der erste Parameter tinfo ist der Codename der Kontaktliste und der zweite Parameter ist optional (das Format ist dasselbe wie der dritte Parameter des Listenbefehls).
Der Parameter tinfo wird zur Darstellung einer Kontaktliste verwendet. Dieser Parameter ist bei Kontaktabfragen sehr wichtig. Bitte beachten Sie die folgenden beiden Situationen :
Die Bedeutung von tinfo (Fall 1): tinfo kann buddy
/ „ group
/ „ discuss
sein, was jeweils eine Freundesliste/Gruppenliste/Diskussionsgruppenliste darstellt. Beispiel:
# 返回 好友列表:
>>> bot.List('buddy')
# 返回名为 'jack' 的好友的列表:
>>> bot.List('buddy', 'jack')
# 返回 群列表:
>>> bot.List('group')
# 返回名为 “机器人测试” 的群的列表:
>>> bot.List('group', '机器人测试')
Die Bedeutung von tinfo (Fall 2): tinfo kann auch ein QContact-Objekt sein, dessen ctype gleich group
/ discuss
ist und die Mitgliederliste der Gruppe/Diskussionsgruppe darstellt. Der zweite und dritte Satz unten geben beispielsweise die Liste der Mitglieder der Gruppe „Klasse 456“ bzw. die Liste der Mitglieder der Gruppe zurück, deren Visitenkarte „Jack“ ist:
>>> g = bot.List('group', "456班")[0] # g 是一个 Group 对象(群“456班”)
>>> bot.List(g) # 返回 群“456班” 的成员列表
>>> bot.List(g, 'card=jack') # 返回 群“456班” 中名片为 “jack” 的成员列表
Beachten Sie, dass der dritte Satz oben das Format bot.List(g, card='jack') nicht zulässt.
Die interne Ausführungssequenz der List-Schnittstelle: Suchen Sie zunächst nach der durch tinfo dargestellten Kontaktliste in der Kontaktdatenbank von QQBot. Wenn die Liste bereits in der Datenbank vorhanden ist, suchen Sie in dieser Liste und geben Sie eine Liste zurück, die die Liste „alle und cinfo passende Kontakte“ enthält ; Wenn keine solche Liste in der Datenbank vorhanden ist, fordern Sie Daten vom QQ-Server an, um die Kontaktliste zu erhalten. Nach erfolgreicher Erfassung wird die Kontaktliste in der Datenbank gespeichert und dann eine Liste mit allen „diesen Listen“ zurückgegeben in cinfo „Übereinstimmende Kontakte“-Liste; wenn beim Anfordern von Daten vom QQ-Server ein Fehler auftritt, werden die relevanten Fehlerinformationen gedruckt und „Keine“ zurückgegeben.
Die Bedeutung des Rückgabewerts der List-Schnittstelle: Gibt eine nicht leere Liste zurück, um alle mit cinfo übereinstimmenden Kontakte in der durch tinfo angegebenen Kontaktliste darzustellen. Gibt eine leere Liste zurück, um darzustellen, dass es in der Kontaktliste keine mit cinfo übereinstimmenden Kontakte gibt Keine. Das Anfordern der Kontaktliste und der Informationen vom QQ-Server ist fehlgeschlagen. Ich weiß nicht, ob es übereinstimmende Kontakte gibt.
Stellen Sie nach dem Aufruf der List-Schnittstelle sicher , dass Sie den Rückgabewert anhand der oben genannten drei Situationen beurteilen, bevor Sie den folgenden Code ausführen.
Hinweis: Wenn die List-Schnittstelle eine nicht leere Liste zurückgibt, sind die Elemente in der Liste QContact-Objekte und keine Str-Objekte:
>>> g = bot.List('group')[0] # g 是一个 Group 对象
>>> print([g, type(g), g.qq, g.name, g.uin, g.mark]) # 打印 g 的各项属性
Zur Bedeutung von Attributen verschiedener Typen von QContact-Objekten siehe: qcontact-attr.
Der Parameter tinfo der Update-Schnittstelle hat die gleiche Bedeutung wie die Parameter in der List-Schnittstelle. Durch Aufrufen dieser Schnittstelle wird sofort die entsprechende Kontaktliste vom QQ-Server angefordert und die Kontaktdatenbank aktualisiert und blockiert, bis die Aktualisierung erfolgreich ist. Das langsamste Update ist die Freundesliste. Wenn viele Freunde vorhanden sind, kann es sein, dass sie für 5 bis 10 Sekunden blockiert wird. Die Aktualisierung der Mitgliederliste erfolgt sehr schnell. Selbst bei einer großen Gruppe von 2.000 Personen beträgt die Aktualisierungszeit nur 1 bis 2 Sekunden.
Wenn die Aktualisierung erfolgreich ist, wird True zurückgegeben, andernfalls wird False zurückgegeben.
Beispiel:
# 更新 好友列表 :
>>> bot.Update('buddy')
# 更新 群列表 :
>>> bot.Update('group')
# 更新 某个群的成员列表 :
>>> gl = bot.List('group', "456班")
>>> if gl:
>>> g = gl[0]
>>> bot.Update(g)
Senden Sie eine Nachricht an einen Kontakt. Der erste Parameter ist das QContact-Objekt und der zweite Parameter ist der Nachrichteninhalt. Nochmals zur Erinnerung: Sie können Nachrichten nur an Freunde/Gruppen/Diskussionsgruppen senden. Es ist Ihnen nicht gestattet, Nachrichten an Gruppenmitglieder/Diskussionsgruppenmitglieder zu senden .
Sie können Emoticon-Schlüsselwörter wie „/smile“ in den Nachrichteninhalt einbetten, um Emoticons an die andere Partei zu senden. Weitere Informationen finden Sie unter facemap.py.
Wenn das Senden erfolgreich ist, wird eine Zeichenfolge zurückgegeben (向xx 发消息成功
). Andernfalls wird eine Zeichenfolge zurückgegeben, die die Fehlerursache (错误:...
) enthält.
Beim Senden einer Nachricht kann es vorkommen, dass die Nachricht wiederholt gesendet wird. Dies liegt daran, dass der QQ-Server den Code 1202 zurückgibt. Version v2.1.17 hat für dieses Problem einen Parameter zur bot.SendTo-Schnittstelle hinzugefügt: resendOn1202 Wenn dieser Parameter True (Standardwert) ist und der QQ-Server beim Senden einer Nachricht den Code 1202 zurückgibt (was darauf hinweist, dass die Nachricht möglicherweise fehlschlägt). Es wird auch weiterhin dreimal gesendet, bis der Rückkehrcode 0 ist. Wenn dieser Parameter False ist, wird kein erneuter Sendeversuch unternommen.
Wenn Sie den Wert auf „True“ setzen, kann sichergestellt werden, dass die Nachricht in den meisten Fällen gesendet wird. Der Nachteil besteht jedoch darin, dass eine Nachricht manchmal wiederholt gesendet wird. Wenn es hingegen auf „Falsch“ gesetzt ist, wird die Nachricht nicht wiederholt gesendet, aber manchmal kann die Nachricht nicht gesendet werden.
Kurz gesagt: Aufgrund der Unsicherheit dieses 1202-Codes gibt es keine perfekte Lösung. Bitte wählen Sie den Wert von resendOn1202 entsprechend Ihrer tatsächlichen Situation aus.
Der erste Parameterkontakt muss das von bot.List zurückgegebene QContact-Objekt oder der erste von der Rückruffunktion onQQMessage übergebene Parameter sein. Beispiel:
# 向 昵称 为 jack 的好友发消息
>>> bl = bot.List('buddy', 'jack')
>>> if bl:
>>> b = bl[0]
>>> bot.SendTo(b, 'hello')
Globale Konfigurationsinformationen werden in bot.conf gespeichert. Einzelheiten zu jeder Konfiguration finden Sie in Abschnitt 7 dieses Dokuments. Beispielsweise speichert bot.conf.termServerPort die Portnummer des QQBot-Befehlszeilenservers und bot.conf.qq speichert die QQ-Nummer dieses Logins.
Hinweis: Die in bot.conf gespeicherten Konfigurationsinformationen sind schreibgeschützt. Bitte ändern Sie diese Konfigurationsinformationen nicht.
Zusätzlich zur oben erwähnten onQQMessage-Antwortfunktion können Sie auch Callback-Funktionen für insgesamt neun Ereignisse onInit/onQrcode/onStartupComplete/onInterval/onUpdate/onPlug/onUnplug/onExit registrieren. Das Format, die Bedeutung und die Parameter der Callback-Funktion finden Sie in den Sampleslots Beispiele für alle Ereignisse.
Der laufende Prozess des Programms und der Aufrufzeitpunkt jeder Rückruffunktion sind wie folgt:
Nochmals zur Erinnerung: Der Funktionsname der registrierten Callback-Funktion und die Funktionsparameter (Nummer und Name) dürfen nicht geändert werden .
Wenn QQBot eine Gruppennachricht empfängt, ermittelt es zunächst anhand des Nachrichteninhalts, ob sich jemand @ anschließt. Wenn ja, fügen Sie am Anfang des Nachrichteninhalts eine [@ME]
-Markierung hinzu und übergeben Sie sie an die Funktion onQQMessage. Andernfalls ersetzen Sie alle @ME
im Nachrichteninhalt durch @Me
und übergeben Sie sie an onQQMessage. Daher müssen Sie in der Funktion onQQMessage nur feststellen, ob der Inhalt @ME
enthält, um zu wissen, ob Sie vom Absender der Nachricht @ erhalten haben. Zum Beispiel:
def onQQMessage ( bot , contact , member , content ):
if '@ME' in content :
bot . SendTo ( contact , member . name + ',艾特我干嘛呢?' )
Bitte beachten Sie, dass, wenn es ein anderes Mitglied in der Gruppe gibt, dessen Name mit dem Anfang Ihres eigenen Namens übereinstimmt (z. B. Ihr Name ist ab und der Name eines anderen Mitglieds ist abc), dies fälschlicherweise gemeldet wird, wenn jemand @abc hat Als @ME müssen Sie in diesem Fall Ihre Gruppenvisitenkarte ändern, um Fehlalarme zu vermeiden.
Wenn dieser QQ eine Nachricht sendet, empfängt QQBot auch dieselbe Nachricht. Das Bot-Objekt stellt eine isMe-Methode bereit, um zu bestimmen, ob die Nachricht selbst gesendet wird:
def onQQMessage ( bot , contact , member , content ):
if bot . isMe ( contact , member ):
print ( 'This is me' )
Ab 2.1.13 bietet qqbot einen leistungsstarken Funktionsdekorator – qqbotsched
zum Anpassen geplanter Aufgaben, Beispielcode:
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 , '同志们:开饭啦啦啦啦啦啦!!!' )
Nachdem der obige Code in Form eines Plug-Ins geladen wurde, wird automatisch alle 11:55 und 17:55 Uhr eine Nachricht an die Gruppe „Klasse 456“ gesendet: „Kameraden: Das Abendessen ist serviert!!!“
Der qqbotsched-Dekorator akzeptiert insgesamt 11 Schlüsselwortparameter: Jahr, Monat, Tag, Woche, Wochentag, Stunde, Minute, Sekunde, Startdatum, Enddatum, Zeitzone. Jeder Parameter stellt den Wert dar, mit dem die benutzerdefinierte Zeitkomponente der Aufgabe übereinstimmen soll. Beispiel: Stunde='11,17' bedeutet, dass die Aufgabe um 11:xx oder 17:xx ausgeführt werden sollte, Minute='55' bedeutet, dass die Aufgabe um xx:55 ausgeführt werden sollte, Minute='0-55/5' bedeutet, dass die Aufgabe um xx: 00, xx:05, xx:10, ... ausgeführt werden sollte, xx:55 führt die Aufgabe aus, day_of_week='mon-fri' (oder '0-4') gibt an, dass die Aufgabe ausgeführt werden sollte von Montag bis Freitag ausgeführt werden.
qqbotsched ist eine einfache Kapselung des Apscheduler des Python-Frameworks für geplante Aufgaben, und seine Parameter sollten in Unix-Systemen im Crontab-Format eingegeben werden. Informationen zu Crontab und dem Apscheduler des Python-Frameworks für geplante Aufgaben finden Sie in den folgenden Referenzmaterialien:
Einzelheiten zum Format der einzelnen Crontab-Parameter finden Sie unter:
Das Registrieren von Rückruffunktionen und das Anpassen geplanter Aufgaben ist die einzige Möglichkeit, QQBot zu erweitern. Achten Sie beim Schreiben dieser Funktionen bitte auf Folgendes:
Wenn Sie sich bei WebQQ anmelden, müssen Sie Ihr Mobiltelefon QQ verwenden, um das QR-Code-Bild zu scannen. In QQBot kann das QR-Code-Bild in den folgenden vier Modi angezeigt werden:
Der GUI-Modus ist der Standardmodus und nur auf PCs verfügbar. Der Postfachmodus kann auf PCs und Remote-Servern verwendet werden. Der Servermodus wird grundsätzlich nur in Systemen mit öffentlichen IP-Adressen verwendet. Wenn Sie das QQ-Postfach zum Empfangen des QR-Codes verwenden, erhält der mobile QQ-Client nach dem Senden des QR-Code-Bildes sofort eine Benachrichtigung. Öffnen Sie die E-Mail auf dem mobilen QQ-Client und drücken Sie dann lange auf den QR-Code, um ihn zu scannen. Der Textmodus ist praktisch für die Verwendung während des Entwicklungsprozesses oder der Serverbereitstellung und bietet Entwicklern eine Verknüpfung zur Anmeldung bei QQ.
Hinweis: Wenn der Postfachmodus/Servermodus/Textmodus aktiviert ist, ist der GUI-Modus deaktiviert und das QR-Code-Bild wird beim Anmelden nicht automatisch angezeigt.
Bei jeder Anmeldung wird ein QR-Code-Manager (QrcodeManager-Objekt) erstellt. Der QR-Code-Manager wählt die Anzeigemethode des QR-Code-Bildes basierend auf der Konfigurationsdatei und den Befehlszeilenparametern aus.
Die Konfigurationsdatei ist ~/.qqbot-tmp/v2.x.conf ( ~ stellt das Home-Verzeichnis des Benutzers dar, das unter Win7 C:Usersxxx und unter Linux /home/xxx ist. Es wird nach der Ausführung automatisch konfiguriert). Erstellen Sie zum ersten Mal diese Konfigurationsdatei mit folgendem Inhalt:
{
# 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" : {}
# },
}
Sie können Ihre eigene Benutzerkonfiguration in der Konfigurationsdatei hinzufügen (d. h. ein neues Element im Wörterbuch der Datei hinzufügen, und der Schlüssel dieses Elements stellt einen Benutzer dar. Beispielsweise stellt das bereits in der Datei enthaltene Element „jemand“ den Benutzer dar). Wenn Sie QQBot ausführen, geben Sie qqbot -u somebody ein, und die Konfigurationen unter dem jemand-Projekt werden geladen.
Im Folgenden werden die Funktionen jeder Konfiguration in der Konfigurationsdatei beschrieben. Der folgende Inhalt geht davon aus, dass die Konfiguration unter jemand geändert und im Modus „qqbot -u somebody“ ausgeführt wurde.
Wenn Sie den Postfachmodus zum Anzeigen des QR-Codes verwenden müssen, können Sie die Elemente „mailAccount“ und „mailAuthCode“ als Postfachkonto bzw. Autorisierungscode festlegen. Nach der Ausführung sendet der QR-Code-Manager das QR-Code-Bild an das Postfach.
Hinweis: Der Autorisierungscode ist nicht das Anmeldekennwort des Postfachs, sondern der vom Postfachdienstanbieter bereitgestellte Autorisierungscode zur Aktivierung des IMAP/SMTP- Dienstes (zur Erinnerung: Nicht der POP3/SMTP -Dienst kann dies aktivieren). Öffnen Sie die Postfacheinstellungen des Web-Dienstes und rufen Sie den Autorisierungscode ab. Wenn nur mailAccount, aber nicht mailAuthCode definiert ist, muss der Autorisierungscode beim Start des Programms manuell eingegeben werden.
Der Postfachmodus wurde in QQ-, NetEase- und Google-Postfächern getestet.
Wenn Sie den Servermodus verwenden müssen, können Sie die Elemente httpServerIP und httpServerPort konfigurieren. Im Allgemeinen sollten sie auf die öffentliche Netzwerk-IP eingestellt sein. Nachdem der Servermodus aktiviert wurde, können Sie über http://{httpServerIP}:{httpServerPort}/{any} auf das QR-Codebild zugreifen. Dabei kann {any} eine beliebige nicht leere Zeichenfolge aus Zahlen oder Buchstaben sein.
Wenn der Postfachmodus und der Servermodus gleichzeitig aktiviert sind, wird beim Senden einer E-Mail nur die Bildadresse und nur einmal der QR-Code gesendet abläuft, aktualisieren Sie einfach die E-Mail. Wenn Sie nur den Postfachmodus aktivieren, wird beim Senden einer E-Mail das echte Bild gesendet. Wenn der QR-Code abläuft, müssen Sie die E-Mail als gelesen festlegen (die E-Mail wird gelesen, nachdem Sie auf die E-Mail mit QQ geklickt haben). Mobiltelefon), bevor die neuesten QR-Code-Bilder gesendet werden.
Wenn das Element cmdQrcode auf True gesetzt ist, wird der QR-Code im Textmodus im Term angezeigt. Hinweis: Um den Textmodus verwenden zu können, müssen Sie die Bibliotheken „pillow“ und „wcwidth“ selbst installieren. Sie können sie mit pip installieren.
Jeder Benutzer in der Konfigurationsdatei verfügt über das Element qq. Wenn dieses Element auf eine bestimmte QQ-Nummer eingestellt wurde, meldet sich QQBot beim Start automatisch mit den Anmeldeinformationen an, die bei der letzten Anmeldung dieser QQ-Nummer gespeichert wurden.
Wenn das Element restartOnOffline in der Konfigurationsdatei auf True gesetzt ist, wird QQBot automatisch neu gestartet, wenn es offline geht oder mit einem Fehler beendet wird.
Diese Option ist nur in UNIX-ähnlichen Systemen gültig. Wenn Sie die Daemon-Option in der Konfiguration auf True setzen, wird das Programm im Daemon-Modus ausgeführt. An diesem Punkt werden Standardausgabe und Standardfehler in die Datei daemon-$qq.log umgeleitet (wobei $qq der Wert der qq-Option in der Konfiguration ist).
Unter normalen Umständen wird QQBot sofort nach dem Scannen des QR-Codes zum Anmelden gestartet. Es ruft nur die Kontaktliste ab und aktualisiert die Kontaktdatenbank nur bei Bedarf. Wenn startAfterFetch in der Konfigurationsdatei auf True gesetzt ist, wartet QQBot, bis alle Kontaktlisten abgerufen wurden, bevor es startet . Beachten Sie, dass es länger dauert, wenn mehr Kontakte vorhanden sind.
Nach dem Start von QQBot wird ein QQBot-Term-Server geöffnet, um die von Benutzern über das qq-Befehlszeilentool gesendeten Betriebsbefehle und die über die HTTP-API-Schnittstelle gesendeten Betriebsbefehle zu überwachen. Die Überwachungs-IP dieses Servers ist immer 127.0.0.1. und die Standard-Abhörportnummer ist 8188. Diese Portnummer kann durch Ändern des Werts von termServerPort geändert werden.
Wenn die konfigurierte QQBot-Term-Server-Portnummer nicht die Standardnummer 8188 ist, müssen Sie beim Ausführen des Befehls qq die Portnummer im ersten Parameter angeben, z. B.:
$ qq 8100 send buddy jack hello
$ qq 8100 list group-member chatbot
Ebenso muss auch die Portnummer der HTTP-API-Schnittstelle geändert werden, z. B.: http://127.0.0.1:8100/send/buddy/jack/hello.
Wenn Sie den Befehl qq und die HTTP-API-Schnittstelle nicht verwenden müssen, können Sie diese Portnummer auf 0 setzen. Der QQBot-Term-Server wird zu diesem Zeitpunkt nicht geöffnet.
Wenn Sie sich bei mehreren QQ-Nummern auf demselben Computer anmelden müssen, können Sie direkt mehrere qqbot-Prozesse in verschiedenen Terminals öffnen, um sich anzumelden. Allerdings muss jeder qqbot-Prozess seinen eigenen termServerPort und httpServerPort festlegen (oder alle auf 0 oder einen leeren Wert setzen). ), andernfalls kommt es zu einem Portnummernkonflikt.
Wenn das Debug-Element auf True gesetzt ist, werden Debugging-Informationen während der Ausführung gedruckt.
Im Allgemeinen müssen Plug-Ins im Importverzeichnis des Systems oder im Verzeichnis ~/.qqbot-tmp/plugins gespeichert werden. Sie können andere Speicherverzeichnisse in der Option „pluginPath“ konfigurieren. Darüber hinaus können Sie in der Option „Plugins“ die Plugins angeben, die beim Start von QQBot geladen werden müssen.
Alle Optionen in der Konfigurationsdatei verfügen über entsprechende Befehlszeilenparameter, und die in den Befehlszeilenparametern eingegebenen Optionen haben eine höhere Priorität als diejenigen in der Konfigurationsdatei. Geben Sie qqbot -h ein, um alle Befehlszeilenparameterformate anzuzeigen.
Es gibt vier Konfigurationsebenen im Programm, deren Prioritäten wie folgt sind:
使用 qqbot -u somebody 启动程序时,依次加载:
根配置 -> 默认配置 -> 用户 somebody 的配置 -> 命令行参数配置
使用 qqbot 启动程序时,依次加载:
根配置 -> 默认配置 -> 命令行参数配置
Darunter: Die Root-Konfiguration ist fest und kann von Benutzern nicht geändert werden; die Standardkonfiguration und die Benutzerkonfiguration können von Benutzern in der Datei v2.x.conf geändert werden; schließlich können Konfigurationen auch in Befehlszeilenparametern eingegeben werden.
Wenn qqbot ausgeführt wird, sucht/erstellt es die folgenden Dateien/Verzeichnisse im Arbeitsverzeichnis:
Das Standardarbeitsverzeichnis ist ~/.qqbot-tmp/. Sie können beim Starten von qqbot andere Arbeitsverzeichnisse über den Befehlszeilenparameter -b|--bench angeben, zum Beispiel: qqbot -b bench.
Ein Plug-In ist eigentlich ein Python-Modul, es kann sich also um eine Python-Datei oder ein Python-Paket handeln. qqbot sucht anhand des Plug-in-Namens in den folgenden Verzeichnissen nach Plug-ins:
Hot-Plug-Methode
Sie können Plug-Ins während der Ausführung von qqbot dynamisch laden/entladen. Es gibt drei Methoden:
Die ersten beiden Methoden werden von externen Prozessen des qqbot-Prozesses aufgerufen, und die dritte Methode wird innerhalb des qqbot-Prozesses verwendet. Verwenden Sie die ersten beiden Methoden nicht innerhalb des qqbot-Prozesses.
Hinweis: Mit der Hot-Plug-Methode geladene Plug-ins gehen nach dem Neustart von qqbot verloren.
Auto-Plug-at-Start-Modus
Sie können Plug-Ins auch automatisch laden, wenn qqbot startet. Geben Sie einfach den Namen des Plug-Ins an, das in der Plugins-Option in der Konfiguration geladen werden muss (Befehlszeilenparameter -pl|--plugins). Diese Plugins werden beim Start geladen, bevor Sie sich anmelden.
Wenn außerdem ein Paket mit dem Namen qqbotdefault im System (oder im Plug-in-Verzeichnis) vorhanden ist, werden alle Submodule unter dem Paket beim Start automatisch als Plug-ins geladen (Hinweis: qqbotdefault selbst wird nicht als geladen Plug-in).
Das Schreiben von Plug-Ins umfasst hauptsächlich das Schreiben von Rückruffunktionen oder geplanten Aufgabenfunktionen. Weitere Informationen finden Sie in den Abschnitten 4 bis 6.
Name | Github-Autor | Funktionsbeschreibung | Ob standardmäßig geladen werden soll |
---|---|---|---|
qqbot.plugins.sampleslots | Pandolia | Beispiel für eine Rückruffunktion | Ja |
qqbot.plugins.schedrestart | Pandolia | Geplanter Neustart | Ja |
qqbot.plugins.miniirc | Pandolia | IRC-Server | NEIN |
Passwortanmeldung | Pandolia | Melden Sie sich mit Benutzername und Passwort an | NEIN |
Adblocker | feisuweb | Blockieren von Gruppenanzeigen | NEIN |
Chatlog | feisuweb | Chat-Inhaltsdatensatz | NEIN |
Wenn Sie nützliche Plug-ins teilen möchten, senden Sie mir bitte eine E-Mail.
Da der QQ-Client unter Linux nicht verwendet werden kann, kann das Plug-In qqbot.plugins.miniirc zur Implementierung der IRC-Chat-Funktion verwendet werden. Lademethode: qq plug qqbot.plugins.miniirc, oder beim Start laden: qqbot -pl qqbot.plugins.miniirc, oder qqbot.plugins.miniirc
zur Plugins-Option in der Konfigurationsdatei hinzufügen.
Nachdem das Plug-in geladen wurde, wird ein Mikro-IRC-Server auf Port 6667 geöffnet. Benutzer können IRC-Clients (wie Weechat, Irssi usw.) verwenden, um eine Verbindung zu diesem Server herzustellen und einen Chat im Befehlszeilenmodus zu erreichen. Im Folgenden wird Weechat als Beispiel verwendet, um die Verwendung vorzustellen:
启动 weechat : weechat
连接本服务器: /connect localhost
进入 群聊天 会话: /join group-name
进入 讨论组聊天 会话: /join !discuss-name
进入 好友聊天 会话: /query buddy-name
进入 聊天会话 后,直接敲入文本并回车就可以向对方发送消息了。所有接收到的 QQ 消息也会被转发给相应的 聊天会话 。
在聊天会话之间切换: ctrl+P 或 ctrl+N
显示所有 群和讨论组 的名称: /list
Die oben genannten sind fast alle Funktionen, die dieser Mikro-IRC-Server bietet, aber es reicht aus, mit QQ-Freunden/Gruppen/Diskussionsgruppen zu chatten.
QQBOT bezieht sich auf die folgenden Open -Source -Projekte:
Ich möchte mich bei den oben genannten drei Autoren für ihre selbstlose Teile bedanken, insbesondere Scienjus für seine eingehende und detaillierte Analyse des SmartQQ-Protokolls.