qqbot 是一個用python 實現的、基於騰訊SmartQQ 協議的QQ 機器人,可運行在Linux, Windows 和Mac OSX 平台下。
本專案github 網址: https://github.com/pandolia/qqbot
你可以透過擴展qqbot 來實現:
在Python 2.7/3.4+ 下使用,用pip 安裝:
pip install qqbot
或下載源碼解壓縮後cd 到該目錄並運行: pip install
.
在命令列輸入: qqbot ,即可啟動一個QQBot 。
啟動過程中會自動彈出二維碼圖片,需要用手機QQ 用戶端掃碼並授權登入。啟動成功後,會將本次登入資訊儲存到本機檔案中,下次啟動時,可以輸入: qqbot -q qq號碼,先嘗試從本機檔案中復原登入資訊(不需要手動掃碼),只有復原不成功或登入資訊已過期時才會需要手動掃碼登入。一般來說,已儲存的登入資訊將在2 天之後過期。
注意: Linux 下,需要係統中有gvfs-open 或shotwell 指令才能自動彈出二維碼圖片(一般安裝有GNOME 虛擬檔案系統gvfs 的系統中都會包含這兩個指令之一)。 Windows10 下,需要係統中已設定了png 圖片檔案的預設開啟程式才能自動彈出二維碼圖片。
若係統無法自動彈出二維碼圖片,可手動開啟圖片檔案進行掃碼,也可以將二維碼顯示模式設定為郵箱模式、 伺服器模式或文字模式進行掃碼,詳見本文檔的第七節。
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
list 指令提供強大的聯絡人查詢和搜尋功能,用法範例如下:
# 列出所有好友
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 的格式,如果不是key=val 的格式,則按以下原則處理:若為一串數字,則依QQ 號查詢,否則,依名稱查詢。
如果存在重名現象,會列出所有重名的聯絡人。如:
qq list group 机器人测试
將列出所有名為「機器人測試」 的群組。
如果在list 命令的第三、四個參數中加入“: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 版開始, list 指令採用表格的形式輸出聯絡人列表,其輸出樣式範例如下:
為確保表格在終端機中的顯示效果,建議將終端機的輸出字型設為consolas 、且每行可列印的最大字元數大於120 。另外要注意:為確保表格的顯示效果,當聯絡人的名稱、名片等屬性的長度太長或含有特殊字元時,將對這些屬性進行截斷或過濾後再輸出至終端。
update 指令更新指定的聯絡人列表,其參數意義和list 指令相同,如:
# 更新好友列表
qq update buddy
# 更新群列表
qq update group
# 更新 群“456班” 的成员列表
qq update group-member 456班
send 指令中第三個參數和list 指令中的第三個參數格式一致。要注意,如果有重名現象,會給所有重名的聯絡人發送訊息。 另外要注意,第二個參數只能是buddy/group/discuss ,不能是group-member/discuss-member 。範例:
# 给 好友“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這兩個轉義字元(如: send buddy jack 第一行n第二行)。
以上所有指令都提供對應的HTTP API 接口,供web 前端開發者調用,接口的url 位址為http://127.0.0.1:8188/{command} ,只需要將qq 後面的指令各參數用"/"分隔開替換url 中的command 就可以了,如: 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 你好wohao「 。 (提示:在JavaScript 中,可以使用encodeURIComponent 函數進行編碼)。
另外, QQBot 啟動後,用本QQ 號在其他客戶端(如:手機QQ )上向某個群/討論組發訊息“--version” ,則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/ 目錄下( ~代表使用者主目錄,win7 下為C:Usersxxx ),或系統中可以import 到的目錄下(如python 的安裝目錄下的Lib/ site-packages 目錄)。
之後,保持前面的qqbot 進程運行,在另一個控制台輸入qq plug sample ,則可將此檔案中的onQQMessage 函數註冊到QQBot 的對應事件上去。此時,用另外一個QQ 向本QQ 發送訊息「-hello」 ,則會自動回覆「你好,我是QQ 機器人」 ,發送訊息「-stop」則會關閉QQ 機器人。
在控制台輸入qq unplug sample 可以卸載此外掛程式及對應的回呼函數。可以同時載入多個插件,此時各插件中的對應函數會依序被呼叫(但呼叫順序和載入次序無關)。
QQBot 開始運作後,每收到一則QQ 訊息,會將訊息來源、訊息內容以及一個QQBot 物件傳遞給已註冊的訊息回應函數。其中:
bot : QQBot 对象,提供 List/SendTo/Stop/Restart 等接口,详见本文档第五节
contact : QContact 对象,消息的发送者,具有 ctype/qq/uin/nick/mark/card/name 等属性
member : QContact 对象,仅当本消息为 群消息或讨论组消息 时有效,代表实际发消息的成员
content : str 对象,消息内容
contact 代表訊息傳送者,其ctype 屬性可以為buddy
/ group
/ discuss
,代表好友/群組/討論群組對象,表示本訊息是好友訊息/群組訊息/討論群組訊息。
member 僅當本訊息為群組訊息或討論群組訊息時有效,代表實際發送訊息的成員,它的ctype 屬性可以為group-member
/ discuss-member
,代表群組成員/討論群組成員物件。當本訊息為好友訊息時, member 等於None 。
contact 和member 都是QContact 對象,不同類型的QContact 物件所具有的屬性意義見: qcontact-attr 。注意所有QContact 對像都是唯讀對象,只能讀取它的屬性,不能設定它的屬性,也不能為它增加額外的屬性。
可以呼叫QQBot 物件的SendTo 介面向QContact 物件傳送訊息,但要注意:只可以向好友/群組/討論群組發送訊息,不可以傳送訊息給群組成員/討論群組成員。也就是說,只可以呼叫bot.SendTo(contact, 'xxx') , 不可以呼叫bot.SendTo(member, 'xxx') 。
QQBot 物件提供List/Update/SendTo/Plug/Unplug/Login/Stop/Restart/FreshRestart 共計9 個公開接口,這些接口的第一個字母都是大寫的。另外,提供一個公開屬性conf 保存全域的設定資訊。
一般情況下,請勿呼叫/存取此物件的其他方法/屬性。特別的,請勿在子執行緒中呼叫這些介面。 以下介紹前7 個介面和conf 屬性。
如果需要在IDE 或python-shell 中運行或測試以上接口,則需要先關閉qqbot 進程,並在IDE 或python-shell 中執行以下程式碼進行登入:
>>> from qqbot import _bot as bot
>>> bot.Login(['-q', '1234'])
對應本文檔第三節的list 指令。傳回聯絡人物件( QContact 物件)清單或None 。第一個參數tinfo 是聯絡人清單的代號,第二個參數是可選的(和list 指令的第三個參數格式一致)。
參數tinfo 用來代表某個聯絡人列表,該參數在聯絡人的查詢中非常重要,請務必理解以下兩種情況:
tinfo 的意義(情況1): tinfo 可以為buddy
/ group
/ discuss
,分別代表好友清單/群組清單/討論群組清單。範例:
# 返回 好友列表:
>>> bot.List('buddy')
# 返回名为 'jack' 的好友的列表:
>>> bot.List('buddy', 'jack')
# 返回 群列表:
>>> bot.List('group')
# 返回名为 “机器人测试” 的群的列表:
>>> bot.List('group', '机器人测试')
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 介面的內部執行順序:首先在QQBot 的聯絡人資料庫內尋找tinfo 所代表的聯絡人清單;若資料庫內已有此列表,則在此清單內進行搜索,並傳回一個包含「此清單中所有和cinfo 符合的聯絡人」 的列表;若資料庫內沒有此列表,則向QQ 伺服器請求資料取得聯絡人列表,取得成功後將聯絡人清單儲存到資料庫內,然後再進行搜尋並傳回包含「此列表中所有和cinfo符合的聯絡人」 的清單;如果在向QQ 伺服器請求資料的過程中出錯了,則列印相關的失敗訊息,並傳回None 。
List 介面傳回值的意義:傳回非空列表表示tinfo 所指定的聯絡人清單內所有和cinfo 符合的聯絡人;傳回空列表表示該聯絡人清單內沒有和cinfo 符合的聯絡人;傳回None 表示向QQ 伺服器要求聯絡人清單和資料失敗,不知道是否有相符的聯絡人。
呼叫List 介面後,請務必先根據以上三種情況對回傳值進行判斷,然後再執行後續程式碼。
注意: 當List 介面傳回非空列表時,列表內的元素是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 。
Update 介面的參數tinfo 和List 介面中的參數意義相同,呼叫此介面會立即向QQ 伺服器要求對應的聯絡人清單並更新聯絡人資料庫,並一直阻塞至更新成功。更新最慢的是好友列表,若好友較多可能會阻塞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)
向聯絡人發送訊息。第一個參數為QContact 對象,第二個參數為訊息內容。再次提醒: 只可以向好友/群組/討論群組發送訊息,不允許向群組成員/討論群組成員發送訊息。
可以在訊息內容中嵌入「/微笑」等表情關鍵字來向對方發送表情,詳見facemap.py 。
若發送成功,返回字串(向xx 发消息成功
)。否則,傳回含錯誤原因的字串(错误:...
)。
發送訊息時可能會重複發送訊息,這是因為QQ 伺服器回傳代碼1202 的原因。 v2.1.17版已針對此問題在bot.SendTo 介面中增加了一個參數: resendOn1202 ,若此參數為True (預設值),則發送訊息時如果QQ 伺服器回傳代碼1202 (表示發送訊息可能失敗),還會繼續傳送3 次,直到回傳代碼0 , 若此參數為False ,則不會嘗試重發。
設為True 在絕大部分情況下能保證訊息一定能發出去,但缺點是有時一則訊息會重複發送。設為False 則相反,訊息不會重複發送,但有時訊息發送不出去。
總之因為這個1202 程式碼的不確定性,沒有完美的解決方法。請依照各自的實際情況選擇resendOn1202 的值。
第一個參數contact 必須是透過bot.List 傳回的QContact 物件、或回呼函數onQQMessage 傳遞進來的第一個參數。範例:
# 向 昵称 为 jack 的好友发消息
>>> bl = bot.List('buddy', 'jack')
>>> if bl:
>>> b = bl[0]
>>> bot.SendTo(b, 'hello')
bot.conf 中保存全域的設定訊息,各項設定詳見本文檔第七節。如bot.conf.termServerPort 保存QQBot 命令列伺服器的連接埠號, bot.conf.qq 保存本次登入的QQ 號碼。
注意: bot.conf 中儲存的設定資訊是唯讀的,請勿修改這些設定資訊。
除了上述的onQQMessage 回應函數,也可以註冊onInit/onQrcode/onStartupComplete/onInterval/onUpdate/onPlug/onUnplug/onExit 共計九種事件的回調函數,所有事件的回呼函數參數格式、意義及範例詳見sampleslots. py 。
程式的運行流程以及各回呼函數的呼叫時機如下:
再次提醒:註冊的回呼函數的函數名稱以及函數參數(數量和名稱)都不得更改。
QQBot 收到群組訊息時,會先根據訊息內容判斷是否有人@ 自己。如果是,則在訊息內容的開頭加上一個[@ME]
的標記,再傳遞給onQQMessage 函數;否則,將訊息內容中的所有@ME
替換成@Me
再傳給onQQMessage 。因此,在onQQMessage 函數內,只需要判斷content 內是否含有@ME
就知道自己是否被訊息傳送者@ 了。例如:
def onQQMessage ( bot , contact , member , content ):
if '@ME' in content :
bot . SendTo ( contact , member . name + ',艾特我干嘛呢?' )
請注意,若群內有另一個成員的名字和自己的名字的開頭部分相同(如:自己的名字是ab ,另一個成員的名字是abc ),那麼當有人@abc 時,也會誤報成@ME ,在這種情況下,需要修改自己的群組名片,以免誤報。
當本QQ 發訊息時, QQBot 也會收到一則相同的訊息, bot 物件提供一個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 , '同志们:开饭啦啦啦啦啦啦!!!' )
以上程式碼以插件形式載入後,每到11:55 和17:55 ,都會自動向群組「456班」 發送訊息:「同志們:開飯啦啦啦啦啦啦!!!」 。
qqbotsched 裝飾器接受year, month, day, week, day_of_week, hour, minute, second, start_date, end_date, timezone 共計11 個關鍵字參數,每個參數表示任務的定制時間的分量所應匹配的值。例如: hour='11,17' 表示應在11:xx 或17:xx 執行任務, minute='55' 表示應在xx:55 執行任務, minute='0-55/5' 表示應在xx: 00, xx:05, xx:10, ..., xx:55 執行任務, day_of_week='mon-fri' (或'0-4' ) 表示應在星期一~星期五執行任務。
qqbotsched 是Python 的定時任務框架apscheduler 的簡單封裝,其各項參數應採用Unix 系統中的crontab 格式輸入。有關crontab 以及Python 的定時任務架構apscheduler 的內容可參考以下參考資料:
crontab 各項參數格式說明詳見:
註冊回呼函數和定制定時任務是對QQBot 進行擴展的唯一方式,在編寫這些函數時,請注意以下事項:
WebQQ 登入時需要用手機QQ 掃描二維碼圖片,在QQBot 中,二維碼圖片可以透過以下四種模式顯示:
GUI 模式是預設的模式,只適用於個人電腦。郵箱模式可以適用於個人電腦和遠端伺服器。伺服器模式一般只在有公網ip 的系統中使用。如果使用QQ 信箱來接收二維碼,則傳送二維碼圖片之後,手機QQ 用戶端會立即收到通知,在手機QQ 用戶端上開啟郵件,再長按二維碼就可以掃描了。文字模式方便在開發過程或伺服器部署時使用,提供開發者捷徑登陸QQ 。
注意:當開啟了郵件信箱模式/伺服器模式/文字模式時, GUI 模式是關閉的,登陸時不會自動彈出二維碼圖片。
每次登入時會建立一個二維碼管理器( QrcodeManager 物件) ,二維碼管理器會根據設定檔及命令列參數來選擇二維碼圖片的顯示方式。
設定檔為~/.qqbot-tmp/v2.x.conf ( ~代表使用者主目錄,win7 下為C:Usersxxx , linux 下為/home/xxx ),第一次執行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" : {}
# },
}
可以在設定檔中新增自己的使用者設定(即在該檔案的字典中新增一個item ,此item 的key 就代表一個使用者),例如,該檔案中已有的somebody 專案就代表名為somebody 的用戶,執行QQBot 時,輸入qqbot -u somebody ,則會載入somebody 專案下的各項配置。
以下介紹設定檔中各項配置的功能,以下內容均假定已修改了somebody 下的配置,且以qqbot -u somebody的方式運作。
如果需要使用郵件匣模式顯示二維碼,可以將mailAccount 和mailAuthCode 項目中分別設定為郵件帳號和授權碼,執行後,二維碼管理員會將二維碼圖片傳送至該信箱。
注意:授權碼不是信箱的登入密碼,而是郵件信箱服務商提供的開通IMAP/SMTP服務的授權碼(提醒:不是POP3/SMTP服務), QQ/網易信箱可以在網頁版的信箱設定裡面開通此項服務,並得到授權碼。如果只定義了mailAccount 而沒定義mailAuthCode ,則程式執行的開始時會要求手動輸入此授權碼。
郵箱模式已在QQ 、 網易和Google 信箱中測試過。
如果需要使用伺服器模式,可以設定httpServerIP 和httpServerPort 項,一般來說應該設定為公網ip 。伺服器模式開啟後,可以透過http://{httpServerIP}:{httpServerPort}/{any} 來存取二維碼圖片。其中{any} 可以是任何非空的數字或字母串。
當郵箱模式和伺服器模式同時開啟時,發送郵件時不會發送真正的圖片,只會將圖片地址發到郵箱中去,而且只發送一次,二維碼過期時刷新一下郵件就可以了。如果只開啟郵箱模式,則發送郵件時會發送真正的圖片,當二維碼過期時,需要將郵件設定為已讀(用手機QQ 點開郵件後該郵件就是已讀了),之後才會發送最新的二維碼圖片。
若cmdQrcode 項設定為True ,則會在term 中以文字模式顯示二維碼。注意:若要使用文字模式,需要自行安裝pillow 和wcwidth 函式庫,可使用pip 安裝。
設定檔中每個使用者都有qq 這項,若此項目已設定為某QQ 號碼,則QQBot 啟動時會先使用此QQ 號上次登入已儲存的登入資訊來自動登入。
如果設定檔中將restartOnOffline 項目設為True ,則當QQBot 斷線或出錯終止時,會自動重新啟動QQBot 。
此選項僅在UNIX 類別系統中有效,且將設定中的daemon 選項設為True 則會以daemon 模式執行程式。此時,標準輸出和標準錯誤會重定向到daemon-$qq.log 檔案(其中$qq 是配置中qq 選項的值)。
一般情況下,掃碼登入完成就立即啟動QQBot,只有在需要的時候才會去取得聯絡人清單並更新聯絡人資料庫。如果將設定檔中的startAfterFetch 設定為True ,則QQBot 會等待所有聯絡人清單取得完成後才啟動,注意,如果聯絡人較多,會耗費較長的時間。
QQBot 啟動後,會開啟一個QQBot-term 伺服器監聽使用者透過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 或空值),否則會造成連接埠號碼衝突。
若debug 項設定為True ,則執行過程中會列印偵錯資訊。
一般情況下,插件需要存放在系統的import 目錄下或~/.qqbot-tmp/plugins 目錄下,可以在pluginPath 選項中配置其他的存放目錄。另外,在plugins 選項中可以指定QQBot 啟動時需要載入的插件。
設定檔中的所有選項都有對應的命令列參數,在命令列參數中輸入的選項優先順序比設定檔高。輸入qqbot -h可查看所有命令列參數格式。
程式一共有四個等級的配置,其優先順序如下:
使用 qqbot -u somebody 启动程序时,依次加载:
根配置 -> 默认配置 -> 用户 somebody 的配置 -> 命令行参数配置
使用 qqbot 启动程序时,依次加载:
根配置 -> 默认配置 -> 命令行参数配置
其中:根配置是固定的,使用者無法修改; 預設配置和使用者配置可由使用者在v2.x.conf 檔案中進行修改;最後,也可以在命令列參數中輸入配置。
qqbot 執行時,會在工作目錄下搜尋/建立以下檔案/目錄:
預設的工作目錄為~/.qqbot-tmp/ ,可以在啟動qqbot 時透過命令列參數-b|--bench 指定其他工作目錄,例如: qqbot -b bench 。
插件實際上是一個python 模組,因此可以是一個python 文件,也可以是一個python package。 qqbot 會根據插件名稱在以下目錄中搜尋插件:
hot-plug 方式
可以在qqbot 的運行過程中動態的載入/卸載插件,有以下三種方法:
前面兩種方法是供qqbot 進程的外部進程呼叫的,第三種方法是在qqbot 進程內部使用的。請勿在qqbot 流程的內部使用前面兩種方法。
注意:採用hot-plug 方式載入的插件在qqbot 重新啟動後會遺失。
auto-plug-at-start 方式
也可以在qqbot 的啟動時自動載入插件,在設定中的plugins 選項(命令列參數-pl|--plugins )中指定需要載入的插件名稱就可以了。這些插件將在啟動時、登入之前載入。
另外,如果系統中(或插件目錄中)存在名為qqbotdefault的package ,那麼該package 下面的所有子模組都會被當成插件在啟動時自動載入(注意:qqbotdefault 本身不會作為插件載入)。
編寫外掛主要是寫回呼函數或定時任務函數,詳見第四~六節。
名稱 | github作者 | 功能說明 | 是否預設載入 |
---|---|---|---|
qqbot.plugins.sampleslots | pandolia | 回調函數範例 | 是 |
qqbot.plugins.schedrestart | pandolia | 定時重啟 | 是 |
qqbot.plugins.miniirc | pandolia | IRC伺服器 | 否 |
passwordlogin | pandolia | 使用使用者名稱-密碼登入 | 否 |
adblock | feisuweb | 群廣告攔截 | 否 |
chatlog | feisuweb | 聊天內容記錄 | 否 |
如果您有好用的插件分享,歡迎寄email給我。
linux 系統下,由於無法使用QQ 用戶端,可以使用插件qqbot.plugins.miniirc 來實現用IRC 聊天的功能。載入方式: qq plug qqbot.plugins.miniirc ,或啟動時載入: qqbot -pl qqbot.plugins.miniirc ,或在設定檔中的plugins 選項中加入qqbot.plugins.miniirc
。
插件載入後將在6667 連接埠開啟一個微型的IRC 伺服器,使用者可以使用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 協議所做出的深入細緻的分析。