QQBot:基于SmartQQ協(xié)議的QQ機(jī)器人(轉(zhuǎn))

一垛贤、介紹

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/pluginnamehttp://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ù)器否

adblockfeisuweb群廣告攔截否

chatlogfeisuweb聊天內(nèi)容記錄否

如果您有好用的插件分享蚪腐,歡迎發(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末桐愉,一起剝皮案震驚了整個濱河市财破,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌从诲,老刑警劉巖左痢,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異系洛,居然都是意外死亡俊性,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門描扯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來定页,“玉大人,你說我怎么就攤上這事绽诚〉浠玻” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵恩够,是天一觀的道長卒落。 經(jīng)常有香客問我,道長蜂桶,這世上最難降的妖魔是什么儡毕? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮扑媚,結(jié)果婚禮上腰湾,老公的妹妹穿的比我還像新娘雷恃。我一直安慰自己,他們只是感情好费坊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布倒槐。 她就那樣靜靜地躺著,像睡著了一般葵萎。 火紅的嫁衣襯著肌膚如雪导犹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天羡忘,我揣著相機(jī)與錄音谎痢,去河邊找鬼。 笑死卷雕,一個胖子當(dāng)著我的面吹牛节猿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播漫雕,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼滨嘱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了浸间?” 一聲冷哼從身側(cè)響起太雨,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎魁蒜,沒想到半個月后囊扳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兜看,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年锥咸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片细移。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡搏予,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弧轧,到底是詐尸還是另有隱情雪侥,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布精绎,位于F島的核電站速缨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏捺典。R本人自食惡果不足惜鸟廓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一从祝、第九天 我趴在偏房一處隱蔽的房頂上張望襟己。 院中可真熱鬧引谜,春花似錦、人聲如沸擎浴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贮预。三九已至贝室,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仿吞,已是汗流浹背滑频。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唤冈,地道東北人峡迷。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像你虹,于是被迫代替她去往敵國和親绘搞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容