一垛贤、介紹
qqbot 是一個用 python 實(shí)現(xiàn)的创淡、基于騰訊 SmartQQ 協(xié)議的 QQ 機(jī)器人框架,可運(yùn)行在 Linux 南吮、 Windows 和 Mac OSX 平臺下。
本項(xiàng)目 github 地址:https://github.com/pandolia/qqbot
你可以通過擴(kuò)展 qqbot 來實(shí)現(xiàn):
監(jiān)控誊酌、收集 QQ 消息
自動消息推送
聊天機(jī)器人
通過 QQ 遠(yuǎn)程控制你的設(shè)備
二部凑、安裝方法
在 Python 2.7/3.4+ 下使用,用 pip 安裝:
pip install qqbot
或者下載源碼解壓后 cd 到該目錄并運(yùn)行: “pip install .”
三碧浊、使用方法
1. 啟動 QQBot
在命令行輸入:qqbot涂邀,即可啟動一個 QQBot 。
啟動過程中會自動彈出二維碼圖片箱锐,需要用手機(jī) QQ 客戶端掃碼并授權(quán)登錄比勉。啟動成功后,會將本次登錄信息保存到本地文件中,下次啟動時浩聋,可以輸入:qqbot -q qq號碼观蜗,先嘗試從本地文件中恢復(fù)登錄信息(不需要手動掃碼),只有恢復(fù)不成功或登錄信息已過期時才會需要手動掃碼登錄衣洁。一般來說墓捻,保存的登錄信息將在 2 天之后過期。
注意: Linux 下坊夫,需要系統(tǒng)中有 gvfs-open 或者 shotwell 命令才能自動彈出二維碼圖片(一般安裝有 GNOME 虛擬文件系統(tǒng) gvfs 的系統(tǒng)中都會含這兩個命令之一)砖第。 Windows10 下,需要系統(tǒng)中已設(shè)置了 png 圖片文件的默認(rèn)打開程序才能自動彈出二維碼圖片环凿。
若系統(tǒng)無法自動彈出二維碼圖片梧兼,可以手動打開圖片文件進(jìn)行掃碼,也可以將二維碼顯示模式設(shè)置為 郵箱模式 智听、 服務(wù)器模式 或 文本模式 進(jìn)行掃碼羽杰,詳見本文檔的第七節(jié)。
2. 操作 QQBot
QQBot 啟動后瞭稼,在另一個控制臺窗口使用 qq 命令操作 QQBot 忽洛,目前提供以下命令:
1) 幫助、停機(jī)和重啟命令
qq help|stop|restart|fresh-restart
2) 聯(lián)系人查詢环肘、搜索命令
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) 聯(lián)系人更新命令
qq update buddy|group|discuss
qq update group-member|discuss-member $ginfo
4) 消息發(fā)送命令
qq send buddy|group|discuss $rinfo $message
5) 群管理命令: 設(shè)置/取消管理員 欲虚、 設(shè)置/刪除群名片 、 群成員禁言 以及 踢除群成員
qq group-set-admin $ginfo $minfo1,$minfo2,...
qq group-unset-admin $ginfo $minfo1,$minfo2,...
qq group-set-card $ginfo $minfo1,$minfo2,... card
qq group-unset-card $ginfo $minfo1,$minfo2,...
qq group-shut $ginfo $minfo1,$minfo2,... [t]
qq group-kick $ginfo $minfo1,$minfo2,...
6) 加載/卸載/顯示插件
qq plug/unplug myplugin
qq plugins
list 命令提供強(qiáng)大的聯(lián)系人查詢和搜索功能悔雹,用法示例如下:
# 列出所有好友
qq list buddy
# 列出 QQ 為 123456 的群
qq list group 123456
# 列出備注名為 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
其中第三复哆、四個參數(shù)如果是 key=val 的格式,則應(yīng)為 name=xx|nick=xx|mark=xx|card=xx|qq=xx 的格式腌零,如果不是 key=val 的格式梯找,則按以下原則進(jìn)行處理:若是一串?dāng)?shù)字,則按 QQ 號進(jìn)行查詢益涧,否則锈锤,按名稱進(jìn)行查詢。
如果存在重名現(xiàn)象闲询,會列出所有重名的聯(lián)系人久免。如:
qq list group 機(jī)器人測試
將列出所有名為 “機(jī)器人測試” 的群。
如果在 list 命令的第三扭弧、四個參數(shù)中加入 “:like:” 阎姥,則會按部分匹配的模式進(jìn)行搜索,用法示例如下:
# 列出名稱中含有 “李” 的好友
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 版開始鸽捻, list 命令采用表格的形式輸出聯(lián)系人列表呼巴,其輸出樣式示例如下:
為保證表格在終端中的顯示效果泽腮,建議將終端的輸出字體設(shè)置為 consolas 、且每行可打印的最大字符數(shù)大于 120 衣赶。另外需要注意:為保證表格的顯示效果诊赊,當(dāng)聯(lián)系人的名稱、名片等屬性的長度太長或含有特殊字符時屑埋,將對這些屬性進(jìn)行截?cái)嗷蜻^濾后再輸出至終端豪筝。
update 命令更新指定的聯(lián)系人列表,其參數(shù)含義和 list 命令相同摘能,如:
# 更新好友列表
qq update buddy
# 更新群列表
qq update group
# 更新 群“456班” 的成員列表
qq update group-member 456班
send 命令中第三個參數(shù)和 list 命令中的第三個參數(shù)格式一致续崖。要注意,如果有重名現(xiàn)象团搞,會給所有重名的聯(lián)系人發(fā)信息严望。 另外要注意,第二個參數(shù)只能是 buddy/group/discuss 逻恐,不能是 group-member/discuss-member 像吻。示例:
# 給 好友“jack” 發(fā)消息 “你好”
qq send buddy jack 你好
# 給 群“198班” 發(fā)消息 “大家好”
qq send group 198班 大家好
# 給 QQ 為 12345 的好友發(fā)消息
qq send buddy 12345 xxx
# 給討論組發(fā)消息
qq send discuss MyDiscuss hello
可以在消息內(nèi)容中嵌入“/可愛”等表情關(guān)鍵詞來向?qū)Ψ桨l(fā)送表情,詳見facemap.py复隆。還可以在消息內(nèi)容中使用\n,\t這兩個轉(zhuǎn)義字符(如: send buddy jack 第一行\(zhòng)n第二行)拨匆。
群管理命令中的 $ginfo 和 $minfo 和 list 命令中的第三、四個參數(shù)格式一致挽拂。例如:
# 禁止 群“456班” 中的 jack,mike,jim 發(fā)言( 2 分鐘)
qq group-shut 456班 jack,mike,jm 120
以上所有命令都提供對應(yīng)的 HTTP API 接口惭每,供 web 前端開發(fā)者調(diào)用,接口的 url 地址為http://127.0.0.1:8188/{command} 亏栈,只需要將 qq 后面的命令各參數(shù)用 “/” 分隔開替換 url 中的 command 就可以了台腥,如:http://127.0.0.1:8188/send/buddy/jack/hello,其他示例詳見urltestbot.md绒北。注意:如果命令中含有中文或特殊字符黎侈,需要先進(jìn)行 url 編碼( utf8 ),例如闷游,調(diào)用http://127.0.0.1:8188/send/buddy/jack/nihao%20%E4%BD%A0%E5%A5%BD%20wohao將發(fā)送消息 ”nihao 你好 wohao“ 峻汉。(提示:在 JavaScript 中,可以使用 encodeURIComponent 函數(shù)進(jìn)行編碼)脐往。
另外俱济, QQBot 啟動后,用本 QQ 號在其他客戶端(如:手機(jī) QQ )上向某個 群/討論組 發(fā)消息 “–version” 钙勃,則 QQBot 會自動在該 群/討論組 回復(fù): “QQBot-v2.x.x” 。
四聂喇、實(shí)現(xiàn)你自己的 QQ 機(jī)器人
實(shí)現(xiàn)自己的 QQ 機(jī)器人非常簡單辖源,只需要定義一個自己的消息響應(yīng)函數(shù)并按插件加載蔚携。示例代碼:
# -*- coding: utf-8 -*-
def onQQMessage(bot, contact, member, content):
if content == '-hello':
bot.SendTo(contact, '你好,我是QQ機(jī)器人')
elif content == '-stop':
bot.SendTo(contact, 'QQ機(jī)器人已關(guān)閉')
bot.Stop()
注意克饶,上面注冊的響應(yīng)函數(shù)的函數(shù)名必須為 “onQQMessage” 酝蜒,函數(shù)參數(shù)也必須和上面的一致。
將以上代碼另存為 sample.py (注意保存為 utf8 編碼的文件)矾湃。放到 \~/.qqbot-tmp/plugins/ 目錄下(\~代表用戶主目錄亡脑, win7 下為 C:\Users\xxx ),或系統(tǒng)中可以 import 到的目錄下(如 python 的安裝目錄下的 Lib/site-packages 目錄)邀跃。
之后霉咨,保持前面的 qqbot 進(jìn)程運(yùn)行,在另一個控制臺輸入 qq plug sample 拍屑,則可將此文件中的 onQQMessage 函數(shù)注冊到 QQBot 的相應(yīng)事件上去途戒。此時,用另外一個 QQ 向本 QQ 發(fā)送消息“-hello”僵驰,則會自動回復(fù)“你好喷斋,我是 QQ 機(jī)器人”,發(fā)送消息“-stop”則會關(guān)閉 QQ 機(jī)器人蒜茴。
在控制臺輸入 qq unplug sample 可以卸載此插件及相應(yīng)的回調(diào)函數(shù)星爪。可以同時加載多個插件粉私,此時各插件中的相應(yīng)函數(shù)會依次被調(diào)用(但調(diào)用順序和加載次序無關(guān))顽腾。
QQBot 開始運(yùn)行后,每收到一條 QQ 消息毡鉴,會將消息來源崔泵、消息內(nèi)容以及一個 QQBot 對象傳遞給已注冊的消息響應(yīng)函數(shù)。其中:
bot? ? : QQBot 對象猪瞬,提供 List/SendTo/Stop/Restart 等接口憎瘸,詳見本文檔第五節(jié)
contact : QContact 對象,消息的發(fā)送者陈瘦,具有 ctype/qq/uin/nick/mark/card/name 等屬性
member? : QContact 對象幌甘,僅當(dāng)本消息為 群消息或討論組消息 時有效,代表實(shí)際發(fā)消息的成員
content : str 對象痊项,消息內(nèi)容
contact 代表消息發(fā)送者锅风,其 ctype 屬性可以為 ‘buddy’/’group’/’discuss’ ,代表 好友/群/討論組 對象鞍泉,表示本消息是 好友消息/群消息/討論組消息 皱埠。
member 僅當(dāng)本消息為 群消息或討論組消息 時有效,代表實(shí)際發(fā)消息的成員咖驮,它的 ctype 屬性可以為 ‘group-member’/’discuss-member’ 边器,代表 群成員/討論組成員 對象训枢。當(dāng)本消息為 好友消息 時, member 等于 None 忘巧。
contact 和 member 都是 QContact 對象恒界,不同類型的 QContact 對象所具有的屬性含義見:qcontact-attr。注意所有 QContact 對象都是只讀對象砚嘴,只能讀取它的屬性十酣,不能設(shè)置它的屬性,也不能向它添加額外的屬性际长。
可以調(diào)用 QQBot 對象的 SendTo 接口向 QContact 對象發(fā)送消息耸采,但要注意:只可以向 好友/群/討論組 發(fā)消息,不可以向 群成員/討論組成員 發(fā)送消息也颤。也就是說洋幻,只可以調(diào)用 bot.SendTo(contact, ‘xxx’) , 不可以調(diào)用 bot.SendTo(member, ‘xxx’) 翅娶。
五文留、 QQBot 對象的公開接口和屬性
QQBot 對象提供 List/Update/SendTo/GroupSetAdmin/GroupSetCard/GroupShut/GroupKick/Plug/Unplug/Login/Stop/Restart/FreshRestart 共計(jì) 11 個公開接口,這些接口的第一個字母都是大寫的竭沫。另外燥翅,提供一個公開屬性 conf 保存全局的配置信息。
一般情況下蜕提,請勿 調(diào)用/存取 此對象的其他 方法/屬性 森书。特別的,請勿在子線程中調(diào)用這些接口谎势。 以下介紹前 7 個接口和 conf 屬性凛膏。
如果需要在 IDE 或 python-shell 中運(yùn)行或測試以上接口,需要先關(guān)閉 qqbot 進(jìn)程脏榆,并在 IDE 或 python-shell 中運(yùn)行以下代碼進(jìn)行登錄:
>>> from qqbot import _bot as bot
>>> bot.Login(['-q', '1234'])
(1) bot.List(tinfo, [cinfo]) –> [contact0, contact1, …, ]/[]/None
對應(yīng)本文檔第三節(jié)的 list 命令猖毫。返回聯(lián)系人對象( QContact 對象)列表或者 None 。第一個參數(shù) tinfo 是聯(lián)系人列表的代號须喂,第二個參數(shù)是可選的(和 list 命令的第三個參數(shù)格式一致)吁断。
參數(shù) tinfo 用來代表某個聯(lián)系人列表,該參數(shù)在聯(lián)系人的查詢中非常重要坞生,請務(wù)必理解以下兩種情況:
tinfo 的含義(情況1):tinfo 可以為 ‘buddy’/’group’/’discuss’ 仔役,分別代表 好友列表/群列表/討論組列表 。示例:
# 返回 好友列表:
>>> bot.List('buddy')
# 返回名為 'jack' 的好友的列表:
>>> bot.List('buddy', 'jack')
# 返回 群列表:
>>> bot.List('group')
# 返回名為 “機(jī)器人測試” 的群的列表:
>>> bot.List('group', '機(jī)器人測試')
tinfo 的含義(情況2):tinfo 也可以是一個 ctype 等于 ‘group’/’discuss’ 的 QContact 對象是己,代表該 群/討論組 的成員列表又兵。如以下第二句和第三句分別返回 群“456班” 的成員列表和該群中名片為 “jack” 的成員列表:
>>> 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’) 的格式。
List 接口的內(nèi)部執(zhí)行順序:首先在 QQBot 的聯(lián)系人數(shù)據(jù)庫內(nèi)查找 tinfo 所代表的聯(lián)系人列表卒废;若數(shù)據(jù)庫內(nèi)已有此列表寒波,則在此列表內(nèi)進(jìn)行搜索乘盼,并返回一個包含 “此列表中所有和 cinfo 匹配的聯(lián)系人” 的列表;若數(shù)據(jù)庫內(nèi)沒有此列表俄烁,則向 QQ 服務(wù)器請求數(shù)據(jù)獲取聯(lián)系人列表,獲取成功后將聯(lián)系人列表保存到數(shù)據(jù)庫內(nèi)级野,然后再進(jìn)行搜索并返回一個包含 “此列表中所有和 cinfo 匹配的聯(lián)系人” 的列表页屠;如果在向 QQ 服務(wù)器請求數(shù)據(jù)的過程中出錯了,則打印相關(guān)的失敗信息蓖柔,并返回 None 辰企。
List 接口返回值的含義:返回一個非空列表表示 tinfo 所指定的聯(lián)系人列表內(nèi)所有和 cinfo 匹配的聯(lián)系人;返回一個空列表表示該聯(lián)系人列表內(nèi)沒有和 cinfo 匹配的聯(lián)系人况鸣;返回 None 表示向 QQ 服務(wù)器請求聯(lián)系人列表和資料失敗牢贸,不知道是否有相匹配的聯(lián)系人。
調(diào)用 List 接口后镐捧,務(wù)必先根據(jù)以上三種情況對返回值進(jìn)行判斷潜索,然后再執(zhí)行后續(xù)代碼。
(2) bot.Update(tinfo) –> True/False
Update 接口的參數(shù) tinfo 和 List 接口中的參數(shù)含義相同懂酱,調(diào)用此接口會立即向 QQ 服務(wù)器請求相應(yīng)的聯(lián)系人列表并更新聯(lián)系人數(shù)據(jù)庫竹习,并一直阻塞至更新成功。更新最慢的是好友列表列牺,若好友較多可能會阻塞 5 ~ 10 秒整陌。成員列表更新的較快,即便是 2000 人的大群瞎领,更新時間僅 1 ~ 2 秒泌辫。
若更新成功,返回 True 九默,否則震放,返回 False 。
示例:
# 更新 好友列表 :
>>> bot.Update('buddy')
# 更新 群列表 :
>>> bot.Update('group')
# 更新 某個群的成員列表 :
>>> gl = bot.List('group', "456班")
>>> if gl:
>>>? ? g = gl[0]
>>>? ? bot.Update(g)
(3) bot.SendTo(contact, content, resendOn1202=True) –> ‘向 xx 發(fā)消息成功’/’錯誤:…’
向聯(lián)系人發(fā)送消息荤西。第一個參數(shù)為 QContact 對象澜搅,第二個參數(shù)為消息內(nèi)容。再次提醒: 只可以向 好友/群/討論組 發(fā)消息邪锌,不允許向 群成員/討論組成員 發(fā)消息勉躺。
可以在消息內(nèi)容中嵌入“/微笑”等表情關(guān)鍵詞來向?qū)Ψ桨l(fā)送表情,詳見facemap.py觅丰。
若發(fā)送成功饵溅,返回字符串(’向 xx 發(fā)消息成功’)。否則妇萄,返回含錯誤原因的字符串(’錯誤:…’)蜕企。
發(fā)消息時可能會重復(fù)發(fā)消息咬荷,這是因?yàn)?QQ 服務(wù)器返回代碼 1202 的原因。v2.1.17版已針對此問題在 bot.SendTo 接口中增加了一個參數(shù): resendOn1202 轻掩,若此參數(shù)為 True (默認(rèn)值)幸乒,則發(fā)消息時如果 QQ 服務(wù)器返回代碼 1202 (表明發(fā)消息可能失敗)唇牧,還會繼續(xù)發(fā)送 3 次罕扎,直至返回代碼 0 , 若此參數(shù)為 False 丐重,則不會嘗試重發(fā)腔召。
設(shè)為 True 在絕大部分情況下能保證消息一定能發(fā)出去,但缺點(diǎn)是有時一條消息會重復(fù)發(fā)送扮惦。設(shè)為 False 則相反臀蛛,消息不會重復(fù)發(fā)送,但有時消息發(fā)送不出去崖蜜。
總之因?yàn)檫@個 1202 代碼的不確定性浊仆,沒有完美的解決辦法。請根據(jù)各自的實(shí)際情況選擇 resendOn1202 的值纳猪。
第一個參數(shù) contact 必須是通過 bot.List 返回的 QContact 對象氧卧、或回調(diào)函數(shù) onQQMessage 傳遞進(jìn)來的第一個參數(shù)。示例:
# 向 QQ 為 12345 的好友發(fā)消息
>>> bl = bot.List('buddy', '12345')
>>> if bl:
>>>? ? b = bl[0]
>>>? ? bot.SendTo(b, 'hello')
(4) bot.GroupXXX(group, membs[, arg]) –> [‘成功:…’, ‘成功:…’, ‘錯誤:…’]
對應(yīng)第三節(jié)的群管理命令氏堤,共四個接口:
設(shè)置/取消管理員: bot.GroupSetAdmin(group, membs, admin=True)
設(shè)置/取消群成員名片: bot.GroupSetCard(group, membs, card)
禁止群成員發(fā)言: bot.GroupShut(group, membs, t=60)
踢除群成員: bot.GroupKick(group, membs)
其中第一個參數(shù) group 為 群對象( ctype 等于 ‘group’ 的 QContact 對象)沙绝,第二個參數(shù) membs 為被操作的成員列表。返回值為 membs 中各成員的操作信息鼠锈。示例代碼:
# 禁止 群“456班” 中名稱為 jack 的成員發(fā)言(120秒)
gl = bot.List('group', '456班')
if gl:
group = gl[0]
membs = bot.List(group, 'jack')
if membs:
bot.GroupShut(group, membs, 120)
注意: 1) 第二個參數(shù) membs 是一個 list 對象(如: [memb0,memb1,…] )闪檬,而不是一個 QContact 對象; 2) 若 membs 中的某個成員是管理員购笆,則除 SetCard 外的其他接口可能對其無效粗悯,盡管此時返回成功信息。 3) 使用這四個接口時同欠,請自行保證登錄的用戶是該群的管理員样傍,且 membs 中的各成員均屬于該群。
(5) bot.conf
bot.conf 中保存全局的配置信息铺遂,各項(xiàng)配置詳見本文檔第七節(jié)衫哥。如 bot.conf.termServerPort 保存 QQBot 命令行服務(wù)器的端口號, bot.conf.qq 保存本次登錄的 QQ 號碼襟锐。
注意: bot.conf 中保存的配置信息是只讀的撤逢,請勿修改這些配置信息。
六、 注冊回調(diào)函數(shù)蚊荣、被他人 @ 的通知初狰、判斷是否是自己發(fā)的消息、定制定時任務(wù)
注冊回調(diào)函數(shù)
除了上面提到的 onQQMessage 響應(yīng)函數(shù)互例,還可以注冊 onInit/onQrcode/onStartupComplete/onInterval/onUpdate/onPlug/onUnplug/onExit 共計(jì)九種事件的回調(diào)函數(shù)奢入,所有事件的回調(diào)函數(shù)參數(shù)格式、含義及示例詳見sampleslots.py媳叨。
程序的運(yùn)行流程以及各回調(diào)函數(shù)的調(diào)用時機(jī)如下:
再次提醒:注冊的回調(diào)函數(shù)的函數(shù)名以及函數(shù)參數(shù)(數(shù)量和名稱)都不得更改俊马。
被群內(nèi)其他成員 @ 的通知
QQBot 收到群消息時,會先根據(jù)消息內(nèi)容判斷是否有人 @ 自己肩杈。如果是,則在消息內(nèi)容的開頭加一個 ‘[@ME] ’ 的標(biāo)記解寝,再傳遞給 onQQMessage 函數(shù)扩然;否則,將消息內(nèi)容中的所有 ‘@ME’ 替換成 ‘@Me’ 再傳給 onQQMessage 聋伦。因此夫偶,在 onQQMessage 函數(shù)內(nèi),只需要判斷 content 內(nèi)是否含有 ‘@ME’ 就知道自己是否被消息發(fā)送者 @ 了觉增。例如:
def onQQMessage(bot, contact, member, content):
if '@ME' in content:
bot.SendTo(contact, member.name+'兵拢,艾特我干嘛呢?')
請注意逾礁,若群內(nèi)有另一個成員的名字和自己的名字的開頭部分相同(如:自己的名字是 ab 说铃,另一個成員的名字是 abc ),那么當(dāng)有人 @abc 時嘹履,也會誤報成 @ME 腻扇,在這種情況下,需要修改自己的群名片砾嫉,以免誤報幼苛。
判斷是否是自己發(fā)的消息
當(dāng)本 QQ 在群內(nèi)或討論組內(nèi)發(fā)言時, QQBot 也會收到一條同樣的消息焕刮,此時 onQQMessage 中的 contact 參數(shù)就是該 群/討論組 對象舶沿, member 參數(shù)就是自己在該 群/討論組 中的成員對象,此時 member.uin 就是本次登錄的 QQ 號碼配并,因此括荡,在 onQQMessage 中,只要判斷 member 的 uin屬性 是否是本次登錄的 QQ 號碼就可以知道是否是自己的發(fā)的消息了荐绝,例如:
from qqbot.utf8logger import INFO
def onQQMessage(bot, contact, member, content):
if getattr(member, 'uin', None) == bot.conf.qq: # 注意:不要使用 member.uin
INFO('你在 %s 內(nèi)發(fā)言', contact)
定制定時任務(wù)
從 2.1.13 起一汽, qqbot 提供一個功能強(qiáng)大的函數(shù)裝飾器 – qqbotsched 來定制定時任務(wù),示例代碼:
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, '同志們:開飯啦啦啦啦啦啦!U偌小岩喷!')
以上代碼以插件形式加載后,每到 11:55 和 17:55 监憎,都會自動向 群“456班” 發(fā)送消息:“同志們:開飯啦啦啦啦啦啦I匆狻!鲸阔!” 偷霉。
qqbotsched 裝飾器接受 year, month, day, week, day_of_week, hour, minute, second, start_date, end_date, timezone 共計(jì) 11 個關(guān)鍵字參數(shù),每個參數(shù)表示任務(wù)的定制時間的分量所應(yīng)匹配的值褐筛。例如: hour=’11,17’ 表示應(yīng)在 11:xx 或 17:xx 執(zhí)行任務(wù)类少, minute=’55’ 表示應(yīng)在 xx:55 執(zhí)行任務(wù), minute=’0-55/5’ 表示應(yīng)在 xx:00, xx:05, xx:10, …, xx:55 執(zhí)行任務(wù)渔扎, day_of_week=’mon-fri’ (或 ‘0-4’ ) 表示應(yīng)在 星期一 ~ 星期五 執(zhí)行任務(wù)硫狞。
qqbotsched 是對 Python 的定時任務(wù)框架 apscheduler 的簡單封裝,其各項(xiàng)參數(shù)應(yīng)采用 Unix 系統(tǒng)中的 crontab 格式輸入晃痴。有關(guān) crontab 以及 Python 的定時任務(wù)框架 apscheduler 的內(nèi)容可參見以下參考資料:
https://code.tutsplus.com/tutorials/scheduling-tasks-with-cron-jobs–net-8800/
http://apscheduler.readthedocs.io/en/latest/userguide.html
https://lz5z.com/Python定時任務(wù)的實(shí)現(xiàn)方式/
http://debugo.com/apscheduler/
crontab 各項(xiàng)參數(shù)格式說明詳見:
http://apscheduler.readthedocs.io/en/latest/modules/triggers/cron.html
注冊回調(diào)函數(shù)和定制定時任務(wù)的注意事項(xiàng)
注冊回調(diào)函數(shù)和定制定時任務(wù)是對 QQBot 進(jìn)行擴(kuò)展的唯一方式残吩,在編寫這些函數(shù)時,請注意以下事項(xiàng):
回調(diào)函數(shù)的函數(shù)名倘核、參數(shù)名泣侮、參數(shù)數(shù)量、參數(shù)順序都不得更改
定時任務(wù)的函數(shù)名可以自己定義紧唱,但參數(shù)有且只有一個活尊,參數(shù)名必須為 bot ,為一個 QQBot 對象琼蚯。
所有回調(diào)函數(shù)和定時任務(wù)都將在主線程中被依次調(diào)用酬凳,因此不必?fù)?dān)心全局變量的線程安全問題。
回調(diào)函數(shù)和定時任務(wù)的運(yùn)行時間應(yīng)盡量短遭庶,盡量不要再這些函數(shù)中進(jìn)行阻塞式的操作宁仔,否則會阻塞整個程序的運(yùn)行。一般來說峦睡,每個函數(shù)的運(yùn)行時間在 5 秒以內(nèi)是可以接受的翎苫。
絕對不要在回調(diào)函數(shù)、定時任務(wù)或 qqbot 主線程的內(nèi)部調(diào)用 os.system 執(zhí)行本 QQ 號對應(yīng)的 qq 命令( 如 os.system(‘qq send buddy jack hello’) )或請求本 QQ 號對應(yīng)的 HTTP-API 接口榨了,否則整個程序會形成死鎖(因?yàn)?os.system 要等 qq 命令執(zhí)行完成后才返回煎谍、而 qq 命令要等 os.system 返回后才會被執(zhí)行)。請直接使用 bot 的 SendTo/List/GroupXXX 等接口龙屉。
七呐粘、二維碼管理器满俗、QQBot 配置、命令行參數(shù)以及工作目錄
二維碼的顯示模式
WebQQ 登錄時需要用手機(jī) QQ 掃描二維碼圖片作岖,在 QQBot 中唆垃,二維碼圖片可以通過以下四種模式顯示:
GUI模式: 在 GUI 界面中自動彈出二維碼圖片
郵箱模式: 將二維碼圖片發(fā)送到指定的郵箱
服務(wù)器模式: 在一個 HTTP 服務(wù)器中顯示二維碼圖片
文本模式: 在 Term 中以文本形式展示二維碼(需要自行安裝 pillow 和 wcwidth 庫)
GUI 模式是默認(rèn)的模式,只適用于個人電腦痘儡。郵箱模式可以適用于個人電腦和遠(yuǎn)程服務(wù)器辕万。服務(wù)器模式一般只在有公網(wǎng) ip 的系統(tǒng)中使用。如果使用 QQ 郵箱來接收二維碼沉删,則發(fā)送二維碼圖片之后渐尿,手機(jī) QQ 客戶端會立即收到通知,在手機(jī) QQ 客戶端上打開郵件矾瑰,再長按二維碼就可以掃描了砖茸。文本模式方便在開發(fā)過程或者服務(wù)器部署時使用,為開發(fā)者提供快捷方式登陸 QQ 殴穴。
注意:當(dāng)開啟了 郵箱模式/服務(wù)器模式/文本模式 時渔彰, GUI 模式是關(guān)閉的,登陸時不會自動彈出二維碼圖片推正。
每次登錄時會創(chuàng)建一個二維碼管理器 ( QrcodeManager 對象) ,二維碼管理器會根據(jù)配置文件及命令行參數(shù)來選擇二維碼圖片的顯示方式宝惰。
配置文件的使用方法
配置文件為~/.qqbot-tmp/v2.x.conf植榕,第一次運(yùn)行 QQBot 后就會自動創(chuàng)建這個配置文件,其中內(nèi)容如下:
{
# QQBot 的配置文件
# 使用 qqbot -u somebody 啟動程序時尼夺,依次加載:
#? ? 根配置 -> 默認(rèn)配置 -> 用戶 somebody 的配置 -> 命令行參數(shù)配置
# 使用 qqbot 啟動程序時尊残,依次加載:
#? ? 根配置 -> 默認(rèn)配置 -> 命令行參數(shù)配置
# 用戶 somebody 的配置
"somebody" : {
# QQBot-term (HTTP-API) 服務(wù)器端口號(該服務(wù)器監(jiān)聽 IP 為 127.0.0.1 )
# 設(shè)置為 0 則不會開啟本服務(wù)器(此時 qq 命令和 HTTP-API 接口都無法使用)。
"termServerPort" : 8188,
# 二維碼 http 服務(wù)器 ip淤堵,請?jiān)O(shè)置為公網(wǎng) ip 或空字符串
"httpServerIP" : "",
# 二維碼 http 服務(wù)器端口號
"httpServerPort" : 8189,
# 自動登錄的 QQ 號
"qq" : "3497303033",
# 接收二維碼圖片的郵箱賬號
"mailAccount" : "3497303033@qq.com",
# 該郵箱的 IMAP/SMTP 服務(wù)授權(quán)碼
"mailAuthCode" : "feregfgftrasdsew",
# 是否以文本模式顯示二維碼
"cmdQrcode" : False,
# 顯示/關(guān)閉調(diào)試信息
"debug" : False,
# QQBot 掉線后自動重啟
"restartOnOffline" : False,
# 在后臺運(yùn)行 qqbot ( daemon 模式)
"daemon": False,
# 完成全部聯(lián)系人列表獲取之后才啟動 QQBot
"startAfterFetch" : False,
# 插件目錄
"pluginPath" : ".",
# 啟動時需加載的插件
"plugins" : [],
# 插件的配置(由用戶自定義)
"pluginsConf" : {},
},
# 可以在 默認(rèn)配置 中配置所有用戶都通用的設(shè)置
"默認(rèn)配置" : {
"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" : {}
# },
}
可以在配置文件中添加自己的用戶配置(即在該文件的字典中新增一個 item ,此 item 的 key 就代表一個用戶)拐邪,例如厘唾,該文件中已有的 somebody 項(xiàng)目就代表名為 somebody 的用戶耕姊,運(yùn)行 QQBot 時,輸入qqbot -u somebody,則會加載 somebody 項(xiàng)目下的各項(xiàng)配置曲伊。
下面介紹配置文件中各項(xiàng)配置的功能,以下內(nèi)容均假定已修改了 somebody 下的配置坯苹,且以qqbot -u somebody的方式運(yùn)行参咙。
郵箱模式的配置( mailAccount 和 mailAuthCode )
如果需要使用郵箱模式顯示二維碼,可以將 mailAccount 和 mailAuthCode 項(xiàng)中分別設(shè)置為郵箱帳號和授權(quán)碼惰赋,運(yùn)行后宰掉,二維碼管理器會將二維碼圖片發(fā)送至該郵箱。
注意:授權(quán)碼不是郵箱的登錄密碼,而是郵箱服務(wù)商提供的開通IMAP/SMTP服務(wù)的授權(quán)碼(提醒:不是POP3/SMTP服務(wù))轨奄, QQ/網(wǎng)易 郵箱可以在網(wǎng)頁版的郵箱設(shè)置里面開通此項(xiàng)服務(wù)孟害,并得到授權(quán)碼。如果只定義了 mailAccount 而沒定義 mailAuthCode 戚绕,則程序運(yùn)行的開始時會要求手工輸入此授權(quán)碼纹坐。
郵箱模式已在 QQ 、 網(wǎng)易 和 Google 郵箱中測試過舞丛。
服務(wù)器模式的配置( httpServerIP 和 httpServerPort )
如果需要使用服務(wù)器模式耘子,可以配置 httpServerIP 和 httpServerPort 項(xiàng),一般來說應(yīng)該設(shè)置為公網(wǎng) ip 球切。服務(wù)器模式開啟后谷誓,可以通過 http://{httpServerIP}:{httpServerPort}/{any} 來訪問二維碼圖片。其中 {any} 可以是任何非空的數(shù)字或字母串吨凑。
當(dāng)郵箱模式和服務(wù)器模式同時開啟時捍歪,發(fā)郵件時不會發(fā)送真正的圖片,只會將圖片地址發(fā)到郵箱中去鸵钝,而且只發(fā)送一次糙臼,二維碼過期時刷新一下郵件就可以了。如果只開啟郵箱模式恩商,則發(fā)郵件時會發(fā)送真正的圖片变逃,當(dāng)二維碼過期時,需要將郵件設(shè)置為已讀(用手機(jī) QQ 點(diǎn)開郵件后該郵件就是已讀了)怠堪,之后才會發(fā)送最新的二維碼圖片揽乱。
文本模式顯示二維碼(cmdQrcode)
若 cmdQrcode 項(xiàng)設(shè)置為 True ,則會在 term 中以文本模式顯示二維碼粟矿。注意:要使用文本模式凰棉,需要自行安裝 pillow 和 wcwidth 庫,可使用 pip 安裝陌粹。
自動登錄的 QQ 號碼( qq )
配置文件中每個用戶都有 qq 這一項(xiàng)撒犀,若此項(xiàng)已設(shè)置為某 QQ 號碼,則 QQBot 在啟動時會先使用此 QQ 號上次登錄保存的登錄信息來自動登錄掏秩。
掉線后自動重啟( restartOnOffline )
如果配置文件中將 restartOnOffline 項(xiàng)設(shè)置為 True 绘证,則當(dāng) QQBot 掉線或出錯終止時,會自動重新啟動 QQBot 哗讥。
在后臺運(yùn)行 qqbot ( daemon )
此選項(xiàng)僅在 UNIX 類系統(tǒng)中有效嚷那,將配置中的 daemon 選項(xiàng)設(shè)置為 True 則會以 daemon 模式運(yùn)行程序。此時杆煞,標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤會重定向到 daemon-$qq.log 文件(其中 $qq 是配置中 qq 選項(xiàng)的值)魏宽。
聯(lián)系人列表獲取完成后再啟動( startAfterFetch )
一般情況下腐泻,掃碼登錄完成就立即啟動 QQBot,只有在需要的時候才會去獲取聯(lián)系人列表并更新聯(lián)系人數(shù)據(jù)庫队询。如果將配置文件中的 startAfterFetch 設(shè)置為 True 派桩,則QQBot 會等待所有聯(lián)系人列表獲取完成后才啟動,注意蚌斩,如果聯(lián)系人較多铆惑,會耗費(fèi)較長的時間。
QQBot-term 服務(wù)器端口號( termServerPort )
QQBot 啟動后送膳,會開啟一個 QQBot-term 服務(wù)器監(jiān)聽用戶通過 qq 命令行工具發(fā)過來的操作命令以及通過 HTTP API 接口發(fā)過來的操作命令员魏,此服務(wù)器的監(jiān)聽 IP 永遠(yuǎn)為 127.0.0.1 ,監(jiān)聽端口號默認(rèn)為 8188 叠聋,可以通過修改 termServerPort 的值來修改此端口號撕阎。
如果配置的 QQBot-term 服務(wù)器端口號不是默認(rèn)的 8188 ,那么在運(yùn)行 qq 命令時碌补,需要在第一個參數(shù)中指定端口號虏束,如:
$ 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 接口,可以將此端口號設(shè)置為 0 袜啃,此時 QQBot-term 服務(wù)器不會開啟坑律。
如果需要在同一臺機(jī)器上登錄多個 QQ 號碼,可以直接在不同的終端中開啟多個 qqbot 進(jìn)程進(jìn)行登錄囊骤,但是,每個 qqbot 進(jìn)程必須設(shè)置專有的 termServerPort 和 httpServerPort (或者全部設(shè)置為 0 或 空值 )冀值,否則會造成端口號沖突也物。
調(diào)試模式( debug )
若 debug 項(xiàng)設(shè)置為 True ,則運(yùn)行過程中會打印調(diào)試信息列疗。
插件的配置( pluginPath 和 plugins )
一般情況下滑蚯,插件需要存放在系統(tǒng)的 import 目錄下或 \~/.qqbot-tmp/plugins 目錄下,可以在 pluginPath 選項(xiàng)中配置其他的存放目錄抵栈。另外告材,在 plugins 選項(xiàng)中可以指定 QQBot 啟動時需要加載的插件。
命令行參數(shù)及配置的優(yōu)先級
配置文件中的所有選項(xiàng)都有對應(yīng)的命令行參數(shù)古劲,在命令行參數(shù)中輸入的選項(xiàng)優(yōu)先級比配置文件高斥赋。輸入qqbot -h可查看所有命令行參數(shù)格式。
程序一共有四個級別的配置产艾,其優(yōu)先級如下:
使用 qqbot -u somebody 啟動程序時疤剑,依次加載:
根配置 -> 默認(rèn)配置 -> 用戶 somebody 的配置 -> 命令行參數(shù)配置
使用 qqbot 啟動程序時滑绒,依次加載:
根配置 -> 默認(rèn)配置 -> 命令行參數(shù)配置
其中:根配置 是固定的,用戶無法修改隘膘; 默認(rèn)配置 和 用戶配置 可由用戶在 v2.x.conf 文件中進(jìn)行修改疑故;最后,還可以在 命令行參數(shù) 中輸入配置弯菊。
工作目錄
qqbot 運(yùn)行時纵势,會在 工作目錄 下 搜索/創(chuàng)建 以下 文件/目錄 :
配置文件: v2.x.conf
插件目錄: plugins/
登錄文件: v2.x-pyx-xxxx.pickle
聯(lián)系人數(shù)據(jù)庫文件: 2017-05-06-20-03-12-xxxx-contact.db
臨時二維碼圖片: xxxx.png
保存QQ的文件: qq(pid9816)
以 daemon 模式運(yùn)行時的 log 文件: daemon-xxx.log
默認(rèn)的工作目錄為 \~/.qqbot-tmp/ ,可以在啟動 qqbot 時通過命令行參數(shù) -b|–bench 指定其他工作目錄管钳,例如: qqbot -b bench 钦铁。
八、 插件
插件的存放位置
插件實(shí)際上是一個 python 模塊蹋嵌,因此可以是一個 python 文件育瓜,也可以是一個 python package。 qqbot 會根據(jù)插件名在以下目錄中搜索插件:
配置中的 pluginPath 選項(xiàng)(命令行參數(shù) -pp|–pluginPath )指定的目錄
工作目錄下的 plugins 目錄
python 的導(dǎo)入目錄
插件的加載/卸載
hot-plug 方式
可以在 qqbot 的運(yùn)行過程中動態(tài)的加載/卸載插件栽烂,有以下三種方法:
利用 qq 命令行工具: qq plug pluginname 或 qq unplug pluginname
利用 http-api 接口:http://127.0.0.1:8188/plug/pluginname或http://127.0.0.1:8188/unplug/pluginname
利用 bot 對象的接口: bot.Plug(‘pluginname’) 或 bot.Unplug(‘pluginname’)
前面兩種方法是供 qqbot 進(jìn)程的外部進(jìn)程調(diào)用的躏仇,第三種方法是在 qqbot 進(jìn)程內(nèi)部使用的。請勿在 qqbot 進(jìn)程的內(nèi)部使用前面兩種方法腺办。
注意:采用 hot-plug 方式加載的插件在 qqbot 重啟后會丟失焰手。
auto-plug-at-start 方式
也可以在 qqbot 的啟動時自動加載插件,在配置中的 plugins 選項(xiàng)(命令行參數(shù) -pl|–plugins )中指定需要加載的插件名就可以了怀喉。這些插件將在啟動時书妻、登錄之前被加載。
另外躬拢,如果系統(tǒng)中(或插件目錄中)存在名為qqbotdefault的 package 躲履,那么該 package 下面的所有子模塊都會被當(dāng)成插件在啟動時自動加載(注意:qqbotdefault 本身不會作為插件加載)。
插件內(nèi)的 onPlug 和 onUnplug 回調(diào)函數(shù)
插件被加載時聊闯,會執(zhí)行 reload(pluginName) 工猜,因此插件內(nèi)的所有代碼都會被執(zhí)行一次
當(dāng)采用 hot-plug 的方式加載時,插件內(nèi)的 onPlug 函數(shù)會緊接在 reload 成功后被執(zhí)行
當(dāng)采用 auto-plug-at-start 方式加載時菱蔬,插件在啟動時篷帅、登錄之前被加載,但插件內(nèi)的 onPlug 函數(shù)會延遲到登錄成功后才被執(zhí)行
插件被卸載時拴泌,插件內(nèi)的 onUnplug 被執(zhí)行
插件的編寫
編寫插件主要就是編寫回調(diào)函數(shù)或定時任務(wù)函數(shù)魏身,詳見第四~六節(jié)。
插件列表
名稱github作者功能說明是否默認(rèn)加載
qqbot.plugins.sampleslotspandolia回調(diào)函數(shù)示例是
qqbot.plugins.schedrestartpandolia定時重啟是
qqbot.plugins.miniircpandoliaIRC服務(wù)器否
如果您有好用的插件分享蚪腐,歡迎發(fā)郵件給我箭昵。
九、 命令行模式下使用 IRC 聊天
linux 系統(tǒng)下回季,由于無法使用 QQ 客戶端宙枷,可以使用插件 qqbot.plugins.miniirc 來實(shí)現(xiàn)用 IRC 聊天的功能掉房。加載方式: qq plug qqbot.plugins.miniirc ,或啟動時加載: qqbot -pl qqbot.plugins.miniirc 慰丛,或者在配置文件中的 plugins 選項(xiàng)中加入 ‘qqbot.plugins.miniirc’ 卓囚。
插件加載后將在 6667 端口開啟一個微型的 IRC 服務(wù)器,用戶可以使用 IRC 客戶端(如 weechat, irssi 等)連接此服務(wù)器來實(shí)現(xiàn)命令行模式下的聊天诅病。以下以 weechat 為例介紹使用方法:
啟動 weechat : weechat
連接本服務(wù)器: /connect localhost
進(jìn)入 群聊天 會話: /join group-name
進(jìn)入 討論組聊天 會話: /join !discuss-name
進(jìn)入 好友聊天 會話: /query buddy-name
進(jìn)入 聊天會話 后哪亿,直接敲入文本并回車就可以向?qū)Ψ桨l(fā)送消息了。所有接收到的 QQ 消息也會被轉(zhuǎn)發(fā)給相應(yīng)的 聊天會話 贤笆。
在聊天會話之間切換: ctrl+P 或 ctrl+N
顯示所有 群和討論組 的名稱: /list
以上幾乎就是此微型 IRC 服務(wù)器所提供的所有功能了蝇棉,但已經(jīng)足夠用來和 QQ 好友/群/討論組 聊天了。
十芥永、 smartqq 協(xié)議支持及限制
本項(xiàng)目已實(shí)現(xiàn)絕大部分 smartqq 協(xié)議支持的功能篡殷,如下:
消息收/發(fā)
聯(lián)系人(包括 好友/群/討論組/群成員/討論組成員)資料獲取和查詢(包括 QQ號/昵稱/名稱/備注名/群成員名片)
聯(lián)系人資料根據(jù)需要動態(tài)更新
被群內(nèi)其他成員 @ 的通知
群管理功能: 設(shè)置/取消管理員 、 設(shè)置/刪除群名片 埋涧、 群成員禁言 以及 踢除群成員
發(fā)送板辽、接收表情(詳見facemap.py)
其他功能:
調(diào)用系統(tǒng)默認(rèn)圖片瀏覽器顯示登錄二維碼、將登錄二維碼發(fā)送至郵箱棘催、開啟一個 http 服務(wù)器用來顯示登錄二維碼劲弦、在命令行窗口使用文本模式顯示二維碼
用 qq 命令行工具發(fā)消息、查詢|更新聯(lián)系人醇坝、群管理
提供 HTTP-API 接口發(fā)消息邑跪、查詢|更新聯(lián)系人、群管理
提供 miniirc 插件呼猪,可以在命令行模式下使用 IRC 客戶端聊天
掉線后自動重啟功能(有時需要手工掃碼)
定時執(zhí)行任務(wù)(通過 qqbotsched 實(shí)現(xiàn))
因 smartqq 協(xié)議的限制画畅,以下問題沒有好的解決辦法:
無法長時間保持在線狀態(tài),每次登錄成功后的 cookie 會每在 1 ~ 2 天后失效宋距,將被騰訊服務(wù)器強(qiáng)制下線轴踱,此時必須手工掃碼重新登錄∠绺铮可以打開郵箱模式和自動重啟模式,并配合 qqbot.plugins.schedrestart 插件使用摊腋,每天在固定的時間掃碼登錄一次沸版,基本上可以穩(wěn)定的保持在線狀態(tài)。
無法發(fā)送圖片兴蒸、文件视粮、音頻、 xml 卡片消息
無法獲取到自己通過其他客戶端(手機(jī) QQ 橙凳、PC-QQ)發(fā)送的 好友 消息(提示:自己發(fā)送的 群/討論組 消息可以獲取到)
當(dāng) 好友/群/群成員 存在同名現(xiàn)象或名稱中含特殊字符時蕾殴,無法綁定其實(shí)際 QQ
無法在群內(nèi) @ 其他成員笑撞,即便用本程序在群里發(fā)送了 “@jack xxx” 這樣的消息, jack 也只能收到這個純文本钓觉,收不到“有人@我”的提醒茴肥。
無法向 群/討論組 內(nèi)的其他非好友成員發(fā)消息,也無法收到非好友成員發(fā)過來的臨時會話消息
在非常少的情況下荡灾,發(fā)消息時會重復(fù)發(fā)送多次瓤狐,也可能對方已收到消息但返回發(fā)送失敗的結(jié)果
十一、其他
十二批幌、參考資料
QQBot 參考了以下開源項(xiàng)目:
ScienJus/qqbot(ruby)
floatinghotpot/qqbot(node.js)
sjdy521/Mojo-Webqq(perl)
在此感謝以上三位作者的無私分享础锐,特別是感謝 ScienJus 對 SmartQQ 協(xié)議所做出的深入細(xì)致的分析。
十三荧缘、反饋
有任何問題或建議可以發(fā)郵件給我pandolia@yeah.net皆警,或者直接提 issue ,也可以加 QQ 群: 577126408 截粗。但還是希望您在提問之前通讀一下本文檔信姓,很有可能您想要的答案已經(jīng)在文檔中了。
該文章轉(zhuǎn)載自:http://geek.csdn.net/news/detail/92383