久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

用python實(shí)現(xiàn)QQ機(jī)器人

 天天向上wish 2018-01-17


一,、介紹

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/3.5 下使用,用 pip 安裝:

?
1pip install qqbot

原 2.0 版的用戶請先到 issue74 查看 2.1 版的升級和改動,。

注:一般安裝有 Python 的系統(tǒng)都已經(jīng)自帶 pip 了,。 Windows 下,請確保安裝 Python 的時候勾選了 pip 和 Add python.exe to Path。如果系統(tǒng)中沒有 pip ,,請到 pip主頁 下載 get-pip.py 并運(yùn)行,,可將 pip 安裝至系統(tǒng)中。

三,、使用方法

1. 啟動 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 ,,目前提供以下命令:

?
12345678910111213141516171819201) 幫助,、停機(jī)和重啟命令qq help|stop|restart2) 聯(lián)系人查詢命令qq list buddy|group|discuss|group-member|discuss-member [oqq|oname|okey=oval] [qq|name|key=val]3) 消息發(fā)送命令qq send buddy|group|discuss qq|name|key=val message4) 群管理命令: 設(shè)置/取消管理員 、 設(shè)置/刪除群名片 ,、 群成員禁言 以及 踢除群成員qq group-set-admin ginfo minfo1,minfo2,...qq group-unset-admin ginfo minfo1,minfo2,...qq group-set-card ginfo minfo1,minfo2,... cardqq group-unset-card ginfo minfo1,minfo2,...qq group-shut ginfo minfo1,minfo2,... [t]qq group-kick ginfo minfo1,minfo2,...5) 加載/卸載/顯示 插件qq plug/unplug plugin-nameqq plugins

list 命令提供強(qiáng)大的聯(lián)系人查詢功能,,用法示例如下:

?
1234567891011121314151617# 列出所有好友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)系人。如:

?
1qq list group 機(jī)器人測試

將列出所有名為 “機(jī)器人測試” 的群。

send 命令中第三個參數(shù)和 list 命令中的第三,、四個參數(shù)格式一致,。要注意,如果有重名現(xiàn)象,,會給所有重名的聯(lián)系人發(fā)信息,。 另外要注意,第二個參數(shù)只能是 buddy/group/discuss ,,不能是 group-member/discuss-member ,。

可以在消息內(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ù)格式一致,。例如:

?
12345# 設(shè)置 jack,mike,jim 為 群“456班” 的管理員qq group-set-admin 456班 jack,mike,jm# 禁止 群“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.txt ,。注意:如果命令中含有中文或特殊字符,,需要先進(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 向本 QQ 發(fā)送 “--version” ,,則 QQBot 會自動回復(fù): “QQBot-v2.x.x” 。

四,、實(shí)現(xiàn)你自己的 QQ 機(jī)器人

實(shí)現(xiàn)自己的 QQ 機(jī)器人非常簡單,,只需要注冊一個自己的消息響應(yīng)函數(shù)。示例代碼:

?
123456789101112from qqbot import QQBotSlot as qqbotslot, RunBot@qqbotslotdef 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()if __name__ == '__main__':RunBot()

注意,,上面注冊的響應(yīng)函數(shù)的函數(shù)名必須為 “onQQMessage” ,函數(shù)參數(shù)也必須和上面的一致,。

將以上代碼另存為 sample.py ,,關(guān)掉前面的 qqbot 進(jìn)程,再在命令行輸入 “python sample.py -q QQ號碼” ,就可以啟動自己的 QQ 機(jī)器人,。此時,,用另外一個 QQ 向本 QQ 發(fā)送消息 “-hello”,則會自動回復(fù) “你好,,我是 QQ 機(jī)器人”,,發(fā)送消息 “-stop” 則會關(guān)閉 QQ 機(jī)器人。

QQBot 開始運(yùn)行后,,每收到一條 QQ 消息,,會將消息來源、消息內(nèi)容以及一個 QQBot 對象傳遞給上面注冊的消息響應(yīng)函數(shù),。其中:

?
1234bot : QQBot 對象,,提供 List/SendTo/Stop/Restart 四個接口,詳見本文檔第五節(jié)contact : QContact 對象,,消息的發(fā)送者,,具有 ctype/qq/uin/nick/mark/card/name 屬性,這些屬性都是 str 對象member : QContact 對象,,僅當(dāng)本消息為 群或討論組 消息時有效,,代表實(shí)際發(fā)消息的成員content : str 對象,消息內(nèi)容

一個 QContact 對象代表一個聯(lián)系人,,它的 ctype 屬性可以為 'buddy'/'group'/'discuss'/'group-member'/'discuss-member' ,,代表 好友/群/討論組/群成員/討論組成員 。注意所有 QContact 對象都是 只讀對象 ,,只能讀取它的屬性,,不能設(shè)置它的屬性,也不能向它添加額外的屬性,。 不同類型的 QContact 對象的 nick/mark/card/name 屬性所代表的含義有所不同,,參見 contact-attr-meannings.png 。

可以調(diào)用 QQBot 對象的 SendTo 接口向 QContact 對象發(fā)送消息,,但要注意:只可以向 好友/群/討論組 發(fā)消息,, 不可以向 群成員/討論組成員 發(fā)送消息 。

除了直接運(yùn)行 sample.py 文件,,還可以將此文件當(dāng)做一個插件,,在 qqbot 的運(yùn)行過程中動態(tài)的加載和卸載。將該文件保存在系統(tǒng)中可以 import 到的目錄下(如 python 的安裝目錄下的 Lib/site-packages 目錄),,之后,,運(yùn)行 qqbot ,待 QQBot 完全啟動后,,在另一個控制臺輸入 qq plug sample ,,則可以將此文件中的 onQQMessage 函數(shù)注冊到 QQBot 的相應(yīng)事件上去,。輸入 qq unplugin sample 可以卸載此插件??梢酝瑫r加載多個插件,,此時各插件中的相應(yīng)函數(shù)會依次被調(diào)用(但調(diào)用順序和加載次序無關(guān))。

如果按插件的形式加載 sample.py ,,則該文件的內(nèi)容可簡化為:

?
123456def 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()

插件本質(zhì)上是一個模塊,因此,,它可以是一個 py 文件,,也可以是一個 package ,只要它放在系統(tǒng)中可以 import 到的目錄即可(本文檔第七節(jié)介紹了指定插件目錄的方法),。建議盡量使用插件的形式來擴(kuò)展 QQBot ,。

原 2.1.10 版中的使用繼承 QQBot 類來進(jìn)行擴(kuò)展的方式可以繼續(xù)使用,但是,,若使用此方式,,則插件功能無法使用。

五,、 QQBot 對象的接口

QQBot 對象提供 List/SendTo/GroupSetAdmin/GroupSetCard/GroupShut/GroupKick/Stop/Restart 八個公開接口,,一般情況下,請勿 調(diào)用/存取 此對象的其他 方法/屬性 ,。以下介紹前 6 個接口,。

(1) bot.List(tinfo, [cinfo]) --> [contact0, contact1, ..., ]/[]/None

對應(yīng)上面的 list 命令。返回聯(lián)系人對象( QContact 對象)列表或者 None ,。

List 接口的第一個參數(shù) tinfo 可以為 'buddy'/'group'/'discuss' ,,第二個參數(shù)是可選的(和 list 命令的第三個參數(shù)格式一致)。示例:

?
12345# 返回所有好友的列表:>>> bot.List('buddy')# 返回名為 “機(jī)器人測試” 的群的列表:>>> bot.List('group', '機(jī)器人測試')

List 接口的第一個參數(shù) tinfo 也可以是一個 ctype 等于 'group'/'discuss' 的 QContact 對象,,此時,,返回的是該 群/討論組 的成員列表,如以下第二句和第三句分別返回 群“456班” 的成員列表和該群中名片為 “jack” 的成員列表:

?
123>>> g = bot.List('group', "456班")[0]>>> bot.List(g)>>> bot.List(g, 'card=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.SendTo(contact, content) --> '向 xx 發(fā)消息成功'/'錯誤:...'

向聯(lián)系人發(fā)送消息,。第一個參數(shù)為 QContact 對象,第二個參數(shù)為消息內(nèi)容,。再次提醒: 只可以向 好友/群/討論組 發(fā)消息,, 不允許向 群成員/討論組成員 發(fā)消息 。

可以在消息內(nèi)容中嵌入“/微笑”等表情關(guān)鍵詞來向?qū)Ψ桨l(fā)送表情,,詳見 facemap.py,。

若發(fā)送成功,返回字符串('向 xx 發(fā)消息成功'),。否則,,返回含錯誤原因的字符串('錯誤:...')。

(3) 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 中各成員的操作信息,。

注意: 1) 第二個參數(shù) membs 是一個 list 對象(如: [memb0,memb1,...] ),,而不是一個 QContact 對象; 2) 若 membs 中的某個成員是管理員,,則除 SetCard 外的其他接口可能對其無效,,盡管此時返回成功信息。 3) 使用這四個接口時,,請自行保證登錄的用戶是該群的管理員,,且 membs 中的各成員均屬于該群。

六,、 注冊回調(diào)函數(shù),、被他人 @ 的通知、定制定時任務(wù)

注冊回調(diào)函數(shù)

除了上面提到的 onQQMessage 響應(yīng)函數(shù),,還可以注冊 onNewContact/onLostContact/onInterval/onStartupComplete/onFetchComplete 五種事件的回調(diào)函數(shù),,所有事件以及函數(shù)參數(shù)格式、含義如下:

?
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647@qqbotslotdef onQQMessage(bot, contact, member, content):# 當(dāng)收到 QQ 消息時被調(diào)用# bot : QQBot 對象,,提供 List/SendTo/Stop/Restart 四個接口,,詳見文檔第五節(jié)# contact : QContact 對象,,消息的發(fā)送者,具有 ctype/qq/uin/name/nick/mark/card 屬性,,這些屬性都是 str 對象# member : QContact 對象,,僅當(dāng)本消息為 群或討論組 消息時有效,代表實(shí)際發(fā)消息的成員# content : str 對象,,消息內(nèi)容if content == '--version':bot.SendTo(contact, 'QQbot-' + bot.conf.version)@qqbotslotdef onNewContact(bot, contact, owner):# 當(dāng)新增 好友/群/討論組/群成員/討論組成員 時被調(diào)用# 一般情況下聯(lián)系人變動事件滯后 5 ~ 10 分鐘,,可以將關(guān)心的聯(lián)系人列表加入到配置文件的 monitorTables 中去# 若 monitorTables 中的列表數(shù)量較少,則被監(jiān)視的列表中的聯(lián)系人變動事件滯后時間將大幅縮短# bot : QQBot 對象# contact : QContact 對象,,代表新增的聯(lián)系人# owner : QContact 對象,,僅在新增 群成員/討論組成員 時有效,代表新增成員所在的 群/討論組pass@qqbotslotdef onLostContact(bot, contact, owner):# 當(dāng)失去 好友/群/討論組/群成員/討論組成員 時被調(diào)用# 一般情況下聯(lián)系人變動事件滯后 5 ~ 10 分鐘,,可以將關(guān)心的聯(lián)系人列表加入到配置文件的 monitorTables 中去# 若 monitorTables 中的列表數(shù)量較少,,則被監(jiān)視的列表中的聯(lián)系人變動事件滯后時間將大幅縮短# bot : QQBot 對象# contact : QContact 對象,代表失去的聯(lián)系人# owner : QContact 對象,,僅在失去 群成員/討論組成員 時有效,,代表失去成員所在的 群/討論組pass@qqbotslotdef onInterval(bot):# 每隔 5 分鐘被調(diào)用# bot : QQBot 對象pass@qqbotslotdef onStartupComplete(bot):# 啟動工作完成時被調(diào)用(本函數(shù)被調(diào)用后,開始監(jiān)聽 QQ 消息和 qq 命令行工具的命令)# bot : QQBot 對象pass@qqbotslotdef onFetchComplete(bot):# 完成一輪聯(lián)系人列表刷新時被調(diào)用# bot : QQBot 對象pass

再次提醒:注冊的響應(yīng)函數(shù)的函數(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ā)送者 @ 了。例如:

?
1234@qqbotslotdef onQQMessage(bot, contact, member, content):if '@ME' in content:bot.SendTo(contact, member.name+',,又在想我了吧')

定制定時任務(wù)

從 2.1.13 起,, qqbot 中提供一個功能強(qiáng)大的函數(shù)裝飾器 -- QQBotSched 來定制定時任務(wù),示例代碼:

?
1234567891011from qqbot import QQBotSched as qqbotsched, RunBot@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, '同志們:開飯啦啦啦啦啦啦?。,。?)if __name__ == '__main__':RunBot()

以上代碼運(yùn)行(或以插件形式加載)后,,每到 11:55 和 17:55 ,,都會自動向 群“456班” 發(fā)送消息:“同志們:開飯啦啦啦啦啦啦!??!” ,。

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:x0 或 xx:x5 執(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./tutorials/scheduling-tasks-with-cron-jobs--net-8800/
  • http://apscheduler./en/latest/userguide.html
  • https:///Python%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E7%9A%84%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F/
  • http:///apscheduler/

注冊回調(diào)函數(shù)和定制定時任務(wù)的注意事項(xiàng)

  • 回調(diào)函數(shù)的函數(shù)名,、參數(shù)名、參數(shù)數(shù)量,、參數(shù)順序都不得更改,,必須和以上 6 個函數(shù)完全一致。
  • 定時任務(wù)的函數(shù)名可以自己定義,,但參數(shù)有且只有一個,,參數(shù)名必須為 bot ,為一個 QQBot 對象,。
  • 如果采用插件的形式編寫,,則回調(diào)函數(shù)前面的 @qqbotslot 是可以省略的,定時任務(wù)前面的 @qqbotsched 不能省略,。
  • 所有回調(diào)函數(shù)和定時任務(wù)都將在主線程中被調(diào)用,,因此不必?fù)?dān)心數(shù)據(jù)的線程安全問題。
  • 所有回調(diào)函數(shù)和定時任務(wù)的運(yùn)行時間應(yīng)盡量短,,不應(yīng)在這些函數(shù)中進(jìn)行阻塞式的 IO 操作,,否則會阻塞整個程序的運(yùn)行。

七,、二維碼管理器,、QQBot 配置及命令行參數(shù)

二維碼的顯示模式

SmartQQ 登錄時需要用手機(jī) QQ 掃描二維碼圖片,在 QQBot 中,,二維碼圖片可以通過以下三種模式顯示:

  • GUI模式: 在 GUI 界面中自動彈出二維碼圖片
  • 郵箱模式: 將二維碼圖片發(fā)送到指定的郵箱
  • 服務(wù)器模式: 在一個 HTTP 服務(wù)器中顯示二維碼圖片
  • 文本模式: 在 Term 中以文本形式展示二維碼(需要自行安裝 pillow 庫)

GUI 模式是默認(rèn)的模式,,只適用于個人電腦。郵箱模式可以適用于個人電腦和遠(yuǎn)程服務(wù)器,。服務(wù)器模式一般只在有公網(wǎng)ip的系統(tǒng)中使用,。如果使用 QQ 郵箱來接收二維碼,則當(dāng)發(fā)送二維碼圖片后,,手機(jī) QQ 客戶端會立即收到通知,,在手機(jī) QQ 客戶端上打開郵件,再長按二維碼就可以掃描了,。文本模式方便在開發(fā)過程或者服務(wù)器部署時使用,,為開發(fā)者提供快捷方式登陸 QQ ,,注意:文本模式在某些 terminal 中(如 gnome-terminal , mate-terminal )的顯示效果不太好,。

注意:當(dāng)開啟了 郵箱模式/服務(wù)器模式/文本模式 時,, GUI 模式是關(guān)閉的,登陸時不會自動彈出二維碼圖片,。

每次登錄時會創(chuàng)建一個二維碼管理器 (QrcodeManager 對象) ,,二維碼管理器會根據(jù)配置文件及命令行參數(shù)來選擇二維碼圖片的顯示方式。

配置文件的使用方法

配置文件為 ~/.qqbot-tmp/v2.1.conf ,,第一次運(yùn)行 QQBot 后就會自動創(chuàng)建這個配置文件,,其中內(nèi)容如下:

?
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485{# QQBot 的配置文件# 使用 qqbot -u somebody 啟動程序時,依次加載:# 根配置 -> 默認(rèn)配置 -> 用戶 somebody 的配置 -> 命令行參數(shù)配置# 使用 qqbot 啟動程序時,,依次加載:# 根配置 -> 默認(rèn)配置 -> 命令行參數(shù)配置# 用戶 somebody 的配置"somebody" : {# QQBot-term 服務(wù)器端口號(HTTP-API也將使用這個端口)"termServerPort" : 8188,# 二維碼 http 服務(wù)器 ip,,請?jiān)O(shè)置為公網(wǎng) ip 或空字符串"httpServerIP" : "127.0.0.1",# 二維碼 http 服務(wù)器端口號"httpServerPort" : 8189,# 自動登錄的 QQ 號"qq" : "3497303033",# 接收二維碼圖片的郵箱賬號"mailAccount" : "[email protected]",# 該郵箱的 IMAP/SMTP 服務(wù)授權(quán)碼"mailAuthCode" : "feregfgftrasdsew",# 是否以文本模式顯示二維碼"cmdQrcode" : False,# 顯示/關(guān)閉調(diào)試信息"debug" : False,# QQBot 掉線后自動重啟"restartOnOffline" : False,# 完成一輪聯(lián)系人列表刷新后的間歇時間"fetchInterval" : 120,# 完成全部聯(lián)系人列表獲取之后才啟動 QQBot "startAfterFetch" : False,# 需要被特別監(jiān)視的聯(lián)系人列表# 'buddy'/'group'/'discuss' 表示需要特別監(jiān)視:# 好友列表/群列表/討論組列表 中的聯(lián)系人變動事件# 'group-member-456班'/'discuss-member-xx小組' 表示需要特別監(jiān)視:# 群”456班“成員列表/討論組”xx小組“成員列表 中的聯(lián)系人變動事件# 若此項(xiàng)中的列表的數(shù)量較少,則被特別監(jiān)視的列表中的聯(lián)系人變動事件滯后時間可大幅縮短"monitorTables" : ['buddy', 'group-member-456班'],# 插件目錄"pluginPath" : ".",# 啟動時需加載的插件"plugins" : ['sample1'],},# 可以在 默認(rèn)配置 中配置所有用戶都通用的設(shè)置"默認(rèn)配置" : {"qq" : "","pluginPath" : "","plugins" : [],},# # 注意:根配置是固定的,,用戶無法修改(在本文件中修改根配置不會生效)# "根配置" : {# "termServerPort" : 8188,# "httpServerIP" : "",# "httpServerPort" : 8189,# "qq" : "",# "mailAccount" : "",# "mailAuthCode" : "",# "cmdQrcode" : False,# "debug" : False,# "restartOnOffline" : False,# "fetchInterval" : 120, # "startAfterFetch" : False,# "monitorTables" : [],# "pluginPath" : "",# "plugins" : [],# },}

可以在配置文件中添加自己的用戶配置(即在該文件的字典中新增一個 item ,,此 item 的 key 就代表一個用戶),例如,,該文件中已有的 somebody 項(xiàng)目就代表名為 somebody 的用戶,,運(yùn)行 QQBot 時,輸入 qqbot -u somebody 或 python sample.py -u somebody ,,則會加載 somebody 項(xiàng)目下的各項(xiàng)配置,。

下面介紹配置文件中各項(xiàng)配置的功能,以下內(nèi)容均假定已修改了 somebody 下的配置,,且以 qqbot -u somebody 或 python sample.py -u somebody 的方式運(yùn)行,。

郵箱模式的配置( mailAccount 和 mailAuthCode )

如果需要使用郵箱模式顯示二維碼,可以將 mailAccount 和 mailAuthCode 項(xiàng)中分別設(shè)置為郵箱賬號和授權(quán)碼,,運(yùn)行后,,二維碼管理器會將二維碼圖片發(fā)送至該郵箱。

注意:授權(quán)碼不是郵箱的登錄密碼,,而是郵箱服務(wù)商提供的開通 IMAP/SMTP 服務(wù)的授權(quán)碼,, QQ 郵箱可以在網(wǎng)頁版的郵箱設(shè)置里面開通此項(xiàng)服務(wù),并得到授權(quán)碼,。如果只定義了 mailAccount 而沒定義 mailAuthCode ,,則程序運(yùn)行的開始時會要求手工輸入此授權(quán)碼。

由于網(wǎng)易的郵箱對 IMAP 協(xié)議的支持非常有限,,無法在 QQBot 中使用,。 QQ 的郵箱已通過測試,其他服務(wù)商的郵箱還未測試過,因此建議還是使用 QQ 郵箱,。

服務(wù)器模式的配置( httpServerIP 和 httpServerPort )

如果需要使用服務(wù)器模式,,可以配置 httpServerIP 和 httpServerPort 項(xiàng),一般來說應(yīng)該設(shè)置為公網(wǎng) ip ,。服務(wù)器模式開啟后,,可以通過 http://httpServerIP:httpServerPort/qqbot/qrcode 來訪問二維碼圖片。

當(dāng)郵箱模式和服務(wù)器模式同時開啟時,,發(fā)郵件時不會發(fā)送真正的圖片,,只會將圖片地址發(fā)到郵箱中去,而且只發(fā)送一次,,二維碼過期時刷新一下郵件就可以了。如果只開啟郵箱模式,,則發(fā)郵件時會發(fā)送真正的圖片,,當(dāng)二維碼過期時,需要將郵件設(shè)置為已讀(用手機(jī) QQ 打開郵件后該郵件就是已讀了),,之后才會發(fā)送最新的二維碼圖片,。

自動登錄的 QQ 號碼( qq )

配置文件中每個用戶都有 qq 這一項(xiàng),若此項(xiàng)已設(shè)置為某 QQ 號碼,,會先使用此 QQ 號上次登錄保存的登錄信息來自動登錄,。

掉線后自動重啟( restartOnOffline )

如果配置文件中將 restartOnOffline 項(xiàng)設(shè)置為 True ,則當(dāng) QQBot 掉線或出錯終止時,,會自動重新啟動 QQBot ,。

聯(lián)系人列表更新的間歇時間( fetchInterval )

QQBot 啟動后,會在后臺獲取并更新聯(lián)系人列表,,當(dāng)所有聯(lián)系人列表獲取完畢后,,會 sleep 兩分鐘然后開始下一輪獲取及更新??梢栽谂渲梦募袑?fetchInterval 項(xiàng)設(shè)置為其他值(單位:秒)來控制這個間歇時間,。如果此值設(shè)置為負(fù)數(shù),則只進(jìn)行一次聯(lián)系人列表獲?。ㄖ笤僖膊猾@取了),。

聯(lián)系人列表獲取完成后再啟動( startAfterFetch )

一般情況下,掃碼登錄完成就立即啟動 QQBot,,同時開始在后臺獲取并更新聯(lián)系人列表,。如果將配置文件中的 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ù)器端口號默認(rèn)為 8188 ,可以通過修改 termServerPort 的值來修改此端口號,。

如果配置的 QQBot-term 服務(wù)器端口號不是默認(rèn)的 8188 ,那么在運(yùn)行 qq 命令時,,需要在第一個參數(shù)中指定端口號,如:

?
12$ qq 8100 send buddy jack hello$ qq 8100 list group-member chatbot

同樣,,HTTP API 接口的端口號也需要改變,,如: http://127.0.0.1:8100/send/buddy/jack/hello 。

如果需要在同一臺機(jī)器上登錄多個 QQ 號碼,,則需要對不同的 QQ 號碼設(shè)置不同的 termServerPort 和 httpServerPort ,,以免端口號沖突,。

文本模式顯示二維碼(cmdQrcode)

若 cmdQrcode 項(xiàng)設(shè)置為 True ,,則會在 term 中以文本模式顯示二維碼。注意:要使用文本模式,,需要自行安裝 pillow 庫,可使用 pip 安裝,。

調(diào)試模式( debug )

若 debug 項(xiàng)設(shè)置為 True ,,則運(yùn)行過程中會打印調(diào)試信息,。

需要被監(jiān)視的聯(lián)系人列表( monitorTables )

一般情況下聯(lián)系人變動事件(onNewContact/onLostContact)滯后 5 ~ 10 分鐘,,可以將關(guān)心的聯(lián)系人列表加入到配置文件的 monitorTables 中去,,若 monitorTables 中的列表數(shù)量較少,,則被監(jiān)視的列表中的聯(lián)系人變動事件延后時間將大幅縮短,。例如,,如果關(guān)心 群”456班“ 的聯(lián)系人變動,,可以設(shè)置 monitorTables = ['group-member-456班'] ,則該群的成員變動事件僅滯后 1~3 秒,。

插件的配置( pluginPath 和 plugins )

一般情況下,插件需要存放在系統(tǒng)的 import 目錄下,,可以在 pluginPath 選項(xiàng)中配置插件的存放目錄,放在該選項(xiàng)指定的目錄下也可以被 QQBot 動態(tài)加載,。另外,,在 plugins 選項(xiàng)中可以指定 QQBot 啟動時需要加載的插件(注意:這些插件需要保存在系統(tǒng)的 import 目錄下或 pluginPath 所指定的目錄下)。

命令行參數(shù)及配置的優(yōu)先級

配置文件中的所有選項(xiàng)都有對應(yīng)的命令行參數(shù),,在命令行參數(shù)中輸入的選項(xiàng)優(yōu)先級比配置文件高,。輸入 qqbot -h 或 python sample.py -h 可查看所有命令行參數(shù)格式。

程序一共有四個級別的配置,,其優(yōu)先級如下:

?
12345使用 qqbot -u somebody 啟動程序時,依次加載:根配置 -> 默認(rèn)配置 -> 用戶 somebody 的配置 -> 命令行參數(shù)配置使用 qqbot 啟動程序時,,依次加載:根配置 -> 默認(rèn)配置 -> 命令行參數(shù)配置

其中:根配置 是固定的,,用戶無法修改; 默認(rèn)配置 和 用戶配置 可由用戶在 v2.1.conf 文件中進(jìn)行修改;最后,,還可以在 命令行參數(shù) 中輸入配置。

八,、 smartqq 協(xié)議支持及限制

本項(xiàng)目已實(shí)現(xiàn)絕大部分 smartqq 協(xié)議支持的功能,,如下:

  • 消息收/發(fā)
  • 聯(lián)系人(包括 好友/群/討論組/群成員/討論組成員)資料獲取和查詢(包括 QQ號/昵稱/名稱/備注名/群成員名片)
  • 聯(lián)系人資料動態(tài)更新,,新增和丟失 好友/群/討論組/群成員/討論組成員 事件的通知
  • 被群內(nèi)其他成員 @ 的通知
  • 群管理功能: 設(shè)置管理員 ,、 設(shè)置群名片 ,、 群成員禁言 以及 踢除群成員
  • 發(fā)送,、接收表情(詳見 facemap.py)

其他功能

  • 調(diào)用系統(tǒng)默認(rèn)圖片瀏覽器顯示登錄二維碼,、將登錄二維碼發(fā)送至郵箱,、開啟一個 http 服務(wù)器用來顯示登錄二維碼,、在命令行窗口使用文本模式顯示二維碼
  • 用 qq 命令行工具發(fā)消息和查詢聯(lián)系人
  • 掉線后自動重啟功能(有時需要手工掃碼)
  • 定時執(zhí)行任務(wù)(通過 QQBotSched 實(shí)現(xiàn))

因 smartqq 協(xié)議的限制,以下問題無解決辦法

  • 無法長時間保持在線狀態(tài),,每次登錄成功后的 cookie 會每在 1 ~ 2 天后失效,將被騰訊服務(wù)器強(qiáng)制下線,,此時 必須 手工掃碼重新登錄,。可以將二維碼顯示模式設(shè)置為郵箱模式并打開自動重啟模式,,在被下線時自動重啟并將二維碼發(fā)送到郵箱,,實(shí)現(xiàn)遠(yuǎn)程掃碼
  • 無法發(fā)送圖片,、文件、音頻,、 xml 卡片消息
  • 無法獲取到自己通過其他客戶端(手機(jī) QQ ,、PC-QQ)發(fā)送的消息
  • 無法在群內(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ì)致的分析。

原文地址:http://www./Windows_Phonejc/1214257.html

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多