QQBot 是一个用 python 实现的ã€åŸºäºŽè…¾è®¯ SmartQQ åè®®çš„ç®€å• QQ 机器人,å¯è¿è¡Œåœ¨ Linux 〠Windows å’Œ Mac OSX å¹³å°ä¸‹ã€‚
本项目 github 地å€ï¼š https://github.com/pandolia/qqbot
ä½ å¯ä»¥é€šè¿‡æ‰©å±• QQBot æ¥å®žçŽ°ï¼š
- ç›‘æŽ§ã€æ”¶é›† QQ 消æ¯
- è‡ªåŠ¨æ¶ˆæ¯æŽ¨é€
- èŠå¤©æœºå™¨äºº
- 通过 QQ è¿œç¨‹æŽ§åˆ¶ä½ çš„è®¾å¤‡
在 Python 2.7/3.4+ 下使用,用 pip 安装:
pip install qqbot
或者下载 æºç è§£åŽ‹åŽ cd 到该目录并è¿è¡Œï¼š pip install .
在命令行输入: qqbot 。å¯åŠ¨è¿‡ç¨‹ä¸ä¼šè‡ªåŠ¨å¼¹å‡ºäºŒç»´ç 图片,需è¦ç”¨æ‰‹æœº QQ 客户端扫ç 并授æƒç™»å½•。å¯åЍæˆåŠŸåŽï¼Œä¼šå°†æœ¬æ¬¡ç™»å½•ä¿¡æ¯ä¿å˜åˆ°æœ¬åœ°æ–‡ä»¶ä¸ï¼Œä¸‹æ¬¡å¯åŠ¨æ—¶ï¼Œå¯ä»¥è¾“入: qqbot -q qqå·ç ,先å°è¯•ä»Žæœ¬åœ°æ–‡ä»¶ä¸æ¢å¤ç™»å½•ä¿¡æ¯ï¼ˆä¸éœ€è¦æ‰‹åŠ¨æ‰«ç ï¼‰ï¼Œåªæœ‰æ¢å¤ä¸æˆåŠŸæˆ–ç™»å½•ä¿¡æ¯å·²è¿‡æœŸæ—¶æ‰ä¼šéœ€è¦æ‰‹åŠ¨æ‰«ç 登录。一般æ¥è¯´ï¼Œä¿å˜çš„登录信æ¯å°†åœ¨ 2 天之åŽè¿‡æœŸã€‚
注æ„: Linux 下,需è¦ç³»ç»Ÿä¸æœ‰ gvfs-open 或者 shotwell 命令æ‰èƒ½è‡ªåŠ¨å¼¹å‡ºäºŒç»´ç 图片(一般安装有 GNOME 虚拟文件系统 gvfs 的系统ä¸éƒ½ä¼šå«è¿™ä¸¤ä¸ªå‘½ä»¤ä¹‹ä¸€ï¼‰ã€‚ Windows10 下,需è¦ç³»ç»Ÿä¸å·²è®¾ç½®äº† png å›¾ç‰‡æ–‡ä»¶çš„é»˜è®¤æ‰“å¼€ç¨‹åºæ‰èƒ½è‡ªåŠ¨å¼¹å‡ºäºŒç»´ç 图片。
è‹¥ç³»ç»Ÿæ— æ³•è‡ªåŠ¨å¼¹å‡ºäºŒç»´ç 图片,å¯ä»¥æ‰‹åŠ¨æ‰“å¼€å›¾ç‰‡æ–‡ä»¶è¿›è¡Œæ‰«ç ,也å¯ä»¥å°†äºŒç»´ç 显示模å¼è®¾ç½®ä¸º 邮箱模å¼/æœåŠ¡å™¨æ¨¡å¼/æ–‡æœ¬æ¨¡å¼ è¿›è¡Œæ‰«ç ï¼Œè¯¦è§æœ¬æ–‡æ¡£çš„第七节。
QQBot å¯åЍåŽï¼Œåœ¨å¦ä¸€ä¸ªæŽ§åˆ 10000 ¶å°çª—å£ä½¿ç”¨ 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 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 命令æä¾›å¼ºå¤§çš„è”系人查询和æœç´¢åŠŸèƒ½ï¼Œç”¨æ³•ç¤ºä¾‹å¦‚ä¸‹ï¼š
# 列出所有好å‹
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
å…¶ä¸ç¬¬ä¸‰ã€å››ä¸ªå‚数如果是 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 。
å¯ä»¥åœ¨æ¶ˆæ¯å†…容ä¸åµŒå…¥â€œ/微笑â€ç‰è¡¨æƒ…å…³é”®è¯æ¥å‘对方å‘é€è¡¨æƒ…ï¼Œè¯¦è§ facemap.py。还å¯ä»¥åœ¨æ¶ˆæ¯å†…容ä¸ä½¿ç”¨ \n,\t 这两个转义å—符(如: send buddy jack 第一行\n第二行)。
群管ç†å‘½ä»¤ä¸çš„ $ginfo å’Œ $minfo å’Œ list 命令ä¸çš„第三ã€å››ä¸ªå‚æ•°æ ¼å¼ä¸€è‡´ã€‚例如:
# ç¦æ¢ 群“456ç†ä¸çš„ jack,mike,jim å‘言( 2 分钟)
qq group-shut 456ç jack,mike,jm 120
以上所有命令都æä¾›å¯¹åº”çš„ 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.x.x†。
实现自己的 QQ 机器人éžå¸¸ç®€å•,åªéœ€è¦æ³¨å†Œä¸€ä¸ªè‡ªå·±çš„æ¶ˆæ¯å“应函数。示例代ç :
from qqbot import QQBotSlot as qqbotslot, RunBot
@qqbotslot
def onQQMessage(bot, contact, member, content):
if content == '-hello':
bot.SendTo(contact, 'ä½ å¥½ï¼Œæˆ‘æ˜¯QQ机器人')
elif content == '-stop':
bot.SendTo(contact, 'QQ机器人已关é—')
bot.Stop()
if __name__ == '__main__':
RunBot()
注æ„ï¼Œä¸Šé¢æ³¨å†Œçš„å“应函数的函数å必须为 “onQQMessageâ€ ï¼Œå‡½æ•°å‚æ•°ä¹Ÿå¿…须和上é¢çš„一致。
将以上代ç å¦å˜ä¸º sample.py ,关掉å‰é¢çš„ qqbot 进程,å†åœ¨å‘½ä»¤è¡Œè¾“å…¥ “python sample.py -q QQå·ç †,就å¯ä»¥å¯åŠ¨è‡ªå·±çš„ QQ æœºå™¨äººã€‚æ¤æ—¶ï¼Œç”¨å¦å¤–一个 QQ 呿œ¬ QQ å‘逿¶ˆæ¯ “-helloâ€ï¼Œåˆ™ä¼šè‡ªåŠ¨å›žå¤ â€œä½ å¥½ï¼Œæˆ‘æ˜¯ QQ 机器人â€ï¼Œå‘逿¶ˆæ¯ “-stopâ€ åˆ™ä¼šå…³é— QQ 机器人。
QQBot 开始è¿è¡ŒåŽï¼Œæ¯æ”¶åˆ°ä¸€æ¡ QQ 消æ¯ï¼Œä¼šå°†æ¶ˆæ¯æ¥æºã€æ¶ˆæ¯å†…容以åŠä¸€ä¸ª QQBot å¯¹è±¡ä¼ é€’ç»™ä¸Šé¢æ³¨å†Œçš„æ¶ˆæ¯å“应函数。其ä¸ï¼š
bot : QQBot 对象,æä¾› List/SendTo/Stop/Restart 四个接å£ï¼Œè¯¦è§æœ¬æ–‡æ¡£ç¬¬äº”节
contact : QContact 对象,消æ¯çš„å‘é€è€…,具有 ctype/qq/uin/nick/mark/card/name ç‰å±žæ€§
member : QContact 对象,仅当本消æ¯ä¸º 群或讨论组 æ¶ˆæ¯æ—¶æœ‰æ•ˆï¼Œä»£è¡¨å®žé™…呿¶ˆæ¯çš„æˆå‘˜
content : str 对象,消æ¯å†…容
一个 QContact 对象代表一个è”系人,它的 ctype 属性å¯ä»¥ä¸º 'buddy'/'group'/'discuss'/'group-member'/'discuss-member' ,代表 好å‹/群/讨论组/群æˆå‘˜/讨论组æˆå‘˜ ã€‚æ³¨æ„æ‰€æœ‰ QContact 对象都是 åªè¯»å¯¹è±¡ ,åªèƒ½è¯»å–它的属性,ä¸èƒ½è®¾ç½®å®ƒçš„属性,也ä¸èƒ½å‘å®ƒæ·»åŠ é¢å¤–的属性。 ä¸åŒç±»åž‹çš„ QContact 对象所具有的属性å«ä¹‰è§ï¼š qcontact-attr 。
å¯ä»¥è°ƒç”¨ QQBot 对象的 SendTo 接å£å‘ QContact 对象å‘逿¶ˆæ¯ï¼Œä½†è¦æ³¨æ„:åªå¯ä»¥å‘ 好å‹/群/讨论组 呿¶ˆæ¯ï¼Œ ä¸å¯ä»¥å‘ 群æˆå‘˜/讨论组æˆå‘˜ å‘逿¶ˆæ¯ 。
除了直接è¿è¡Œ sample.py 文件,还å¯ä»¥å°†æ¤æ–‡ä»¶å½“åšä¸€ä¸ªæ’件,在 qqbot çš„è¿è¡Œè¿‡ç¨‹ä¸åЍæ€çš„åŠ è½½å’Œå¸è½½ã€‚将该文件ä¿å˜åœ¨ ~/.qqbot-tmp/plugins/ 目录下( ~ 代表用户主目录, win7 下为 C:\Users\xxx ),或系统ä¸å¯ä»¥ import 到的目录下(如 python 的安装目录下的 Lib/site-packages 目录),之åŽï¼Œè¿è¡Œ qqbot ,待 QQBot 完全å¯åЍåŽï¼Œåœ¨å¦ä¸€ä¸ªæŽ§åˆ¶å°è¾“å…¥ qq plug sample ,则å¯ä»¥å°†æ¤æ–‡ä»¶ä¸çš„ onQQMessage 函数注册到 QQBot 的相应事件上去。输入 qq unplug sample å¯ä»¥å¸è½½æ¤æ’件。å¯ä»¥åŒæ—¶åŠ è½½å¤šä¸ªæ’ä»¶ï¼Œæ¤æ—¶å„æ’ä»¶ä¸çš„ç›¸åº”å‡½æ•°ä¼šä¾æ¬¡è¢«è°ƒç”¨ï¼ˆä½†è°ƒç”¨é¡ºåºå’ŒåŠ è½½æ¬¡åºæ— 关)。
如果按æ’件的形å¼åŠ è½½ sample.py ,则该文件的内容å¯ç®€åŒ–为:
def onQQMessage(bot, contact, member, content):
if content == '-hello':
bot.SendTo(contact, 'ä½ å¥½ï¼Œæˆ‘æ˜¯QQ机器人')
elif content == '-stop':
bot.SendTo(contact, 'QQ机器人已关é—')
bot.Stop()
æ’件本质上是一个模å—ï¼Œå› æ¤ï¼Œå®ƒå¯ä»¥æ˜¯ä¸€ä¸ª py 文件,也å¯ä»¥æ˜¯ä¸€ä¸ª package ,åªè¦å®ƒæ”¾åœ¨ç³»ç»Ÿä¸å¯ä»¥ import 到的目录å³å¯ï¼ˆæœ¬æ–‡æ¡£ç¬¬ä¸ƒèЂ介ç»äº†æŒ‡å®šæ’件目录的方法)。建议尽é‡ä½¿ç”¨æ’ä»¶çš„å½¢å¼æ¥æ‰©å±• QQBot 。
æç¤ºï¼šå½“执行 qq plug sample 时,其实是在 qqbot 的主线程内部执行了 reload('sample') 以åŠä¸€äº›å…¶ä»–å·¥ä½œï¼Œå› æ¤ sample.py 里é¢çš„æ‰€æœ‰ä»£ç 都会被执行一次。å¯ä»¥å°†æ’ä»¶åˆå§‹åŒ–ä»£ç æ”¾åœ¨è¯¥æ–‡ä»¶çš„æœ€å¤–层,这些代ç 在æ’ä»¶è¢«åŠ è½½çš„æ—¶å€™ä¼šè¢«æ‰§è¡Œã€‚
QQBot 对象æä¾› List/Update/SendTo/GroupSetAdmin/GroupSetCard/GroupShut/GroupKick/Stop/Restart/FreshRestart ä¹ä¸ªå…¬å¼€æŽ¥å£ï¼Œä¸€èˆ¬æƒ…况下,请勿 调用/å˜å– æ¤å¯¹è±¡çš„å…¶ä»– 方法/属性 。å¦å¤–, 请勿在å线程ä¸è°ƒç”¨è¿™äº›æŽ¥å£ 。 以下介ç»å‰ 7 个接å£ã€‚
对应上é¢çš„ list 命令。返回è”系人对象( QContact 对象)列表或者 None 。
List 接å£çš„ç¬¬ä¸€ä¸ªå‚æ•° tinfo å¯ä»¥ä¸º 'buddy'/'group'/'discuss' ï¼Œç¬¬äºŒä¸ªå‚æ•°æ˜¯å¯é€‰çš„(和 list å‘½ä»¤çš„ç¬¬ä¸‰ä¸ªå‚æ•°æ ¼å¼ä¸€è‡´ï¼‰ã€‚示例:
# 返回所有好å‹çš„列表:
>>> bot.List('buddy')
# 返回å为 “机器人测试†的群的列表:
>>> bot.List('group', '机器人测试')
List 接å£çš„ç¬¬ä¸€ä¸ªå‚æ•° tinfo 也å¯ä»¥æ˜¯ä¸€ä¸ª ctype ç‰äºŽ 'group'/'discuss' çš„ QContact å¯¹è±¡ï¼Œæ¤æ—¶ï¼Œè¿”回的是该 群/讨论组 çš„æˆå‘˜åˆ—表,如以下第二å¥å’Œç¬¬ä¸‰å¥åˆ†åˆ«è¿”回 群“456ç†的æˆå‘˜åˆ—表和该群ä¸å片为 “jack†的æˆå‘˜åˆ—表:
>>> g = bot.List('group', "456ç")[0]
>>> bot.List(g)
>>> bot.List(g, 'card=jack')
注æ„上é¢ç¬¬ä¸‰å¥ä¸å…许是 bot.List(g, card='jack') çš„æ ¼å¼ã€‚
List 接å£çš„内部执行顺åºï¼š 首先在 QQBot çš„è”系人数æ®åº“内查找 tinfo 所代表的è”系人列表;若数æ®åº“内已有æ¤åˆ—表,则在æ¤åˆ—表内进行æœç´¢ï¼Œå¹¶è¿”å›žä¸€ä¸ªåŒ…å« â€œæ¤åˆ—è¡¨ä¸æ‰€æœ‰å’Œ cinfo 匹é…çš„è”系人†的列表;若数æ®åº“内没有æ¤åˆ—è¡¨ï¼Œåˆ™å‘ QQ æœåŠ¡å™¨è¯·æ±‚æ•°æ®èŽ·å–è”ç³»äººåˆ—è¡¨ï¼ŒèŽ·å–æˆåŠŸåŽå°†è”系人列表ä¿å˜åˆ°æ•°æ®åº“内,然åŽå†è¿›è¡Œæœç´¢å¹¶è¿”å›žä¸€ä¸ªåŒ…å« â€œæ¤åˆ—è¡¨ä¸æ‰€æœ‰å’Œ cinfo 匹é…çš„è”ç³»äººâ€ çš„åˆ—è¡¨ï¼›å¦‚æžœåœ¨å‘ QQ æœåŠ¡å™¨è¯·æ±‚æ•°æ®çš„过程ä¸å‡ºé”™äº†ï¼Œåˆ™æ‰“å°ç›¸å…³çš„失败信æ¯ï¼Œå¹¶è¿”回 None 。
List 接å£è¿”回值的å«ä¹‰ï¼š 返回一个éžç©ºåˆ—表表示 tinfo 所指定的è”系人列表内所有和 cinfo 匹é…çš„è”系人;返回一个空列表表示该è”系人列表内没有和 cinfo 匹é…çš„è”系人;返回 None è¡¨ç¤ºå‘ QQ æœåŠ¡å™¨è¯·æ±‚è”系人列表和资料失败,ä¸çŸ¥é“æ˜¯å¦æœ‰ç›¸åŒ¹é…çš„è”系人。
调用 List 接å£åŽï¼Œ 务必 å…ˆæ ¹æ®ä»¥ä¸Šä¸‰ç§æƒ…况对返回值进行判æ–,然åŽå†æ‰§è¡ŒåŽç»ä»£ç 。
Update 接å£çš„傿•° tinfo å’Œ List 接å£ä¸çš„傿•°å«ä¹‰ç›¸åŒï¼Œè°ƒç”¨æ¤æŽ¥å£ä¼šç«‹å³å‘ QQ æœåŠ¡å™¨è¯·æ±‚ç›¸åº”çš„è”系人列表并更新è”系人数æ®åº“,并一直阻塞至更新æˆåŠŸã€‚æ›´æ–°æœ€æ…¢çš„æ˜¯å¥½å‹åˆ—表,若好å‹è¾ƒå¤šå¯èƒ½ä¼šé˜»å¡ž 5 ~ 10 秒。æˆå‘˜åˆ—表更新的较快,å³ä¾¿æ˜¯ 2000 人的大群,更新时间仅 1 ~ 2 秒。
若更新æˆåŠŸï¼Œè¿”å›ž True ,å¦åˆ™ï¼Œè¿”回 False 。
å‘è”系人å‘逿¶ˆæ¯ã€‚ç¬¬ä¸€ä¸ªå‚æ•°ä¸º QContact å¯¹è±¡ï¼Œç¬¬äºŒä¸ªå‚æ•°ä¸ºæ¶ˆæ¯å†…å®¹ã€‚å†æ¬¡æé†’: åªå¯ä»¥å‘ 好å‹/群/讨论组 呿¶ˆæ¯ï¼Œ ä¸å…è®¸å‘ ç¾¤æˆå‘˜/讨论组æˆå‘˜ 呿¶ˆæ¯ 。
å¯ä»¥åœ¨æ¶ˆæ¯å†…容ä¸åµŒå…¥â€œ/微笑â€ç‰è¡¨æƒ…å…³é”®è¯æ¥å‘对方å‘é€è¡¨æƒ…ï¼Œè¯¦è§ facemap.py。
è‹¥å‘逿ˆåŠŸï¼Œè¿”å›žå—符串('å‘ xx 呿¶ˆæ¯æˆåŠŸ')。å¦åˆ™ï¼Œè¿”回å«é”™è¯¯åŽŸå› çš„å—符串('错误:...')。
呿¶ˆæ¯æ—¶å¯èƒ½ä¼šé‡å¤å‘消æ¯ï¼Œè¿™æ˜¯å› 为 QQ æœåŠ¡å™¨è¿”å›žä»£ç 1202 çš„åŽŸå› ã€‚v2.1.17版已针对æ¤é—®é¢˜åœ¨ bot.SendTo 接å£ä¸å¢žåŠ äº†ä¸€ä¸ªå‚æ•°ï¼š resendOn1202 ,若æ¤å‚数为 True ï¼ˆé»˜è®¤å€¼ï¼‰ï¼Œåˆ™å‘æ¶ˆæ¯æ—¶å¦‚æžœ QQ æœåŠ¡å™¨è¿”å›žä»£ç 1202 ï¼ˆè¡¨æ˜Žå‘æ¶ˆæ¯å¯èƒ½å¤±è´¥ï¼‰ï¼Œè¿˜ä¼šç»§ç»å‘é€ 3 次,直至返回代ç 0 , è‹¥æ¤å‚数为 False ,则ä¸ä¼šå°è¯•é‡å‘。
设为 True 在ç»å¤§éƒ¨åˆ†æƒ…况下能ä¿è¯æ¶ˆæ¯ä¸€å®šèƒ½å‘å‡ºåŽ»ï¼Œä½†ç¼ºç‚¹æ˜¯æœ‰æ—¶ä¸€æ¡æ¶ˆæ¯ä¼šé‡å¤å‘é€ã€‚设为 False 则相å,消æ¯ä¸ä¼šé‡å¤å‘é€ï¼Œä½†æœ‰æ—¶æ¶ˆæ¯å‘é€ä¸å‡ºåŽ»ã€‚
æ€»ä¹‹å› ä¸ºè¿™ä¸ª 1202 代ç çš„ä¸ç¡®å®šæ€§ï¼Œæ²¡æœ‰å®Œç¾Žçš„è§£å†³åŠžæ³•ã€‚è¯·æ ¹æ®å„自的实际情况选择 resendOn1202 的值。
对应第三节的群管ç†å‘½ä»¤ï¼Œå…±å››ä¸ªæŽ¥å£ï¼š
- 设置/å–æ¶ˆç®¡ç†å‘˜ï¼š bot.GroupSetAdmin(group, membs, admin=True)
- 设置/å–æ¶ˆç¾¤æˆå‘˜å片: bot.GroupSetCard(group, membs, card)
- ç¦æ¢ç¾¤æˆå‘˜å‘言: bot.GroupShut(group, membs, t=60)
- 踢除群æˆå‘˜ï¼š bot.GroupKick(group, membs)
å…¶ä¸ç¬¬ä¸€ä¸ªå‚æ•° group 为 群对象( ctype ç‰äºŽ 'group' çš„ QContact å¯¹è±¡ï¼‰ï¼Œç¬¬äºŒä¸ªå‚æ•° membs 为被æ“作的æˆå‘˜åˆ—表。返回值为 membs ä¸å„æˆå‘˜çš„æ“ä½œä¿¡æ¯ã€‚示例代ç :
# ç¦æ¢ 群“456ç†ä¸å称为 jack çš„æˆå‘˜å‘言(120秒)
gl = bot.List('group', '456ç')
if gl:
group = gl[0]
membs = bot.List(group, 'jack')
if membs:
bot.GroupShut(group, membs, 120)
注æ„: 1) ç¬¬äºŒä¸ªå‚æ•° membs 是一个 list 对象(如: [memb0,memb1,...] ï¼‰ï¼Œè€Œä¸æ˜¯ä¸€ä¸ª QContact 对象; 2) è‹¥ membs ä¸çš„æŸä¸ªæˆå‘˜æ˜¯ç®¡ç†å‘˜ï¼Œåˆ™é™¤ SetCard 外的其他接å£å¯èƒ½å¯¹å…¶æ— æ•ˆï¼Œå°½ç®¡æ¤æ—¶è¿”回æˆåŠŸä¿¡æ¯ã€‚ 3) ä½¿ç”¨è¿™å››ä¸ªæŽ¥å£æ—¶ï¼Œè¯·è‡ªè¡Œä¿è¯ç™»å½•的用户是该群的管ç†å‘˜ï¼Œä¸” membs ä¸çš„儿ˆå‘˜å‡å±žäºŽè¯¥ç¾¤ã€‚
é™¤äº†ä¸Šé¢æåˆ°çš„ onQQMessage å“应函数,还å¯ä»¥æ³¨å†Œ onInterval/onStartupComplete 三ç§äº‹ä»¶çš„回调函数,所有事件以åŠå‡½æ•°å‚æ•°æ ¼å¼ã€å«ä¹‰å¦‚下:
@qqbotslot
def onQQMessage(bot, contact, member, content):
# 当收到 QQ æ¶ˆæ¯æ—¶è¢«è°ƒç”¨
# bot : QQBot 对象,æä¾› List/SendTo/Stop/Restart 四个接å£ï¼Œè¯¦è§æ–‡æ¡£ç¬¬äº”节
# contact : QContact 对象,消æ¯çš„å‘é€è€…,具有 ctype/qq/uin/name/nick/mark/card/role ç‰å±žæ€§
# member : QContact 对象,仅当本消æ¯ä¸º 群或讨论组 æ¶ˆæ¯æ—¶æœ‰æ•ˆï¼Œä»£è¡¨å®žé™…呿¶ˆæ¯çš„æˆå‘˜
# content : str 对象,消æ¯å†…容
if content == '--version':
bot.SendTo(contact, 'QQbot-' + bot.conf.version)
@qqbotslot
def onInterval(bot):
# æ¯éš” 5 分钟被调用
# bot : QQBot 对象
pass
@qqbotslot
def onStartupComplete(bot):
# å¯åŠ¨å·¥ä½œå®Œæˆæ—¶è¢«è°ƒç”¨ï¼ˆæœ¬å‡½æ•°è¢«è°ƒç”¨åŽï¼Œå¼€å§‹ç›‘å¬ QQ 消æ¯å’Œ qq 命令行工具的命令)
# bot : QQBot 对象
pass
冿¬¡æé†’:注册的å“应函数的函数å以åŠå‡½æ•°å‚数(数é‡å’Œå称)必须和上é¢ä¸€è‡´ï¼Œä¸å…许注册其他å称的函数 。
QQBot æ”¶åˆ°ç¾¤æ¶ˆæ¯æ—¶ï¼Œä¼šå…ˆæ ¹æ®æ¶ˆæ¯å†…å®¹åˆ¤æ–æ˜¯å¦æœ‰äºº @ 自己。如果是,则在消æ¯å†…å®¹çš„å¼€å¤´åŠ ä¸€ä¸ª '[@ME] ' çš„æ ‡è®°ï¼Œå†ä¼ 递给 onQQMessage 函数;å¦åˆ™ï¼Œå°†æ¶ˆæ¯å†…容ä¸çš„æ‰€æœ‰ '@ME' æ›¿æ¢æˆ '@Me' å†ä¼ ç»™ onQQMessage ã€‚å› æ¤ï¼Œåœ¨ onQQMessage 函数内,åªéœ€è¦åˆ¤æ– content 内是å¦å«æœ‰ '@ME' 就知é“自己是å¦è¢«æ¶ˆæ¯å‘é€è€… @ 了。例如:
@qqbotslot
def onQQMessage(bot, contact, member, content):
if '@ME' in content:
bot.SendTo(contact, member.name+',åˆåœ¨æƒ³æˆ‘了å§')
请注æ„,若群内有å¦ä¸€ä¸ªæˆå‘˜çš„åå—和自己的åå—的开头部分相åŒï¼ˆå¦‚:自己的åå—æ˜¯ ab ,å¦ä¸€ä¸ªæˆå‘˜çš„åå—æ˜¯ abc ),那么当有人 @abc æ—¶ï¼Œä¹Ÿä¼šè¯¯æŠ¥æˆ @ME ï¼Œåœ¨è¿™ç§æƒ…况下,需è¦ä¿®æ”¹è‡ªå·±çš„群å片,以å…误报。
从 2.1.13 起, qqbot ä¸æä¾›ä¸€ä¸ªåŠŸèƒ½å¼ºå¤§çš„å‡½æ•°è£…é¥°å™¨ -- QQBotSched æ¥å®šåˆ¶å®šæ—¶ä»»åŠ¡ï¼Œç¤ºä¾‹ä»£ç :
from 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()
以上代ç è¿è¡Œï¼ˆæˆ–以æ’ä»¶å½¢å¼åŠ è½½ï¼‰åŽï¼Œæ¯åˆ° 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='1-5' 表示应在 星期一 ~ 星期五 执行任务。
QQBotSched 是对 Python 的定时任务框架 apscheduler 的简å•å°è£…,其å„项傿•°åº”采用 Unix 系统ä¸çš„ crontab æ ¼å¼è¾“入。有关 crontab ä»¥åŠ Python 的定时任务框架 apscheduler 的内容å¯å‚è§ä»¥ä¸‹å‚考资料:
- https://code.tutsplus.com/tutorials/scheduling-tasks-with-cron-jobs--net-8800/
- http://apscheduler.readthedocs.io/en/latest/userguide.html
- https://lz5z.com/Python定时任务的实现方å¼/
- http://debugo.com/apscheduler/
注册回调函数和定制定时任务是对 QQBot 进行扩展的唯一方å¼ï¼Œåœ¨ç¼–写这些函数时,请注æ„以下事项:
- 回调函数的函数åã€å‚æ•°åã€å‚æ•°æ•°é‡ã€å‚数顺åºéƒ½ä¸å¾—更改,必须和以上 3 个函数完全一致。
- 定时任务的函数åå¯ä»¥è‡ªå·±å®šä¹‰ï¼Œä½†å‚æ•°æœ‰ä¸”åªæœ‰ä¸€ä¸ªï¼Œå‚æ•°å必须为 bot ,为一个 QQBot 对象。
- 如果采用æ’件的形å¼ç¼–写,则回调函数å‰é¢çš„ @qqbotslot 是å¯ä»¥çœç•¥çš„,但定时任务å‰é¢çš„ @qqbotsched ä¸èƒ½çœç•¥ã€‚
- 如果采用æ’件的形å¼ç¼–写,则 RunBot() 也å¯ä»¥çœç•¥ï¼Œå¦‚æžœä¸çœç•¥ï¼Œåˆ™å¿…须放在 “if __name__ == '__main__'†的下é¢ã€‚
- 所有回调函数和定时任务都将在主线程ä¸è¢«è°ƒç”¨ï¼Œå› æ¤ä¸å¿…担心数æ®çš„线程安全问题。
- 回调函数和定时任务的è¿è¡Œæ—¶é—´åº”å°½é‡çŸï¼Œå°½é‡ä¸è¦å†è¿™äº›å‡½æ•°ä¸è¿›è¡Œé˜»å¡žå¼çš„æ“ä½œï¼Œå¦åˆ™ä¼šé˜»å¡žæ•´ä¸ªç¨‹åºçš„è¿è¡Œã€‚一般æ¥è¯´ï¼Œæ¯ä¸ªå‡½æ•°çš„è¿è¡Œæ—¶é—´åœ¨ 5 秒以内是å¯ä»¥æŽ¥å—的。
- ç»å¯¹ä¸è¦ 在回调函数ã€å®šæ—¶ä»»åŠ¡æˆ– qqbot 主线程的内部调用 os.system 执行 本 QQ å·å¯¹åº”çš„ qq 命令 ( 如 os.system('qq send buddy jack hello') )或请求 本 QQ å·å¯¹åº”çš„ HTTP-API æŽ¥å£ ï¼Œå¦åˆ™æ•´ä¸ªç¨‹åºä¼šå½¢æˆæ»é”ï¼ˆå› ä¸º os.system è¦ç‰ qq 命令执行完æˆåŽæ‰è¿”回ã€è€Œ qq 命令è¦ç‰ os.system è¿”å›žåŽæ‰ä¼šè¢«æ‰§è¡Œï¼‰ã€‚请使用 bot çš„ SendTo/List/GroupXXX 接å£ã€‚
- 建议采用æ’件的形å¼ç¼–写,ä¸å¿…修改 qqbot çš„æºä»£ç ,且å¯åœ¨ qqbot çš„è¿è¡Œè¿‡ç¨‹ä¸åЍæ€çš„åŠ è½½å’Œå¸è½½ã€‚
SmartQQ 登录时需è¦ç”¨æ‰‹æœº QQ 扫æäºŒç»´ç 图片,在 QQBot ä¸ï¼ŒäºŒç»´ç 图片å¯ä»¥é€šè¿‡ä»¥ä¸‹å››ç§æ¨¡å¼æ˜¾ç¤ºï¼š
- GUI模å¼ï¼š 在 GUI 界é¢ä¸è‡ªåŠ¨å¼¹å‡ºäºŒç»´ç 图片
- 邮箱模å¼ï¼š 将二维ç 图片å‘é€åˆ°æŒ‡å®šçš„邮箱
- æœåŠ¡å™¨æ¨¡å¼ï¼š 在一个 HTTP æœåС噍䏿˜¾ç¤ºäºŒç»´ç 图片
- 文本模å¼ï¼š 在 Term ä¸ä»¥æ–‡æœ¬å½¢å¼å±•示二维ç (需è¦è‡ªè¡Œå®‰è£… pillow 库)
GUI æ¨¡å¼æ˜¯é»˜è®¤çš„æ¨¡å¼ï¼Œåªé€‚用于个人电脑。邮箱模å¼å¯ä»¥é€‚用于个人电脑和远程æœåŠ¡å™¨ã€‚æœåŠ¡å™¨æ¨¡å¼ä¸€èˆ¬åªåœ¨æœ‰å…¬ç½‘ ip 的系统ä¸ä½¿ç”¨ã€‚如果使用 QQ é‚®ç®±æ¥æŽ¥æ”¶äºŒç»´ç ,则当å‘é€äºŒç»´ç 图片åŽï¼Œæ‰‹æœº QQ å®¢æˆ·ç«¯ä¼šç«‹å³æ”¶åˆ°é€šçŸ¥ï¼Œåœ¨æ‰‹æœº QQ 客户端上打开邮件,å†é•¿æŒ‰äºŒç»´ç å°±å¯ä»¥æ‰«æäº†ã€‚æ–‡æœ¬æ¨¡å¼æ–¹ä¾¿åœ¨å¼€å‘过程或者æœåŠ¡å™¨éƒ¨ç½²æ—¶ä½¿ç”¨ï¼Œä¸ºå¼€å‘者æä¾›å¿«æ·æ–¹å¼ç™»é™† QQ 。
注æ„:当开å¯äº† 邮箱模å¼/æœåŠ¡å™¨æ¨¡å¼/æ–‡æœ¬æ¨¡å¼ æ—¶ï¼Œ GUI æ¨¡å¼æ˜¯å…³é—的,登陆时ä¸ä¼šè‡ªåŠ¨å¼¹å‡ºäºŒç»´ç 图片。
æ¯æ¬¡ç™»å½•时会创建一个二维ç 管ç†å™¨ ( QrcodeManager 对象) ,二维ç 管ç†å™¨ä¼šæ ¹æ®é…置文件åŠå‘½ä»¤è¡Œå‚æ•°æ¥é€‰æ‹©äºŒç»´ç 图片的显示方å¼ã€‚
é…置文件为 ~/.qqbot-tmp/v2.x.conf ,第一次è¿è¡Œ QQBot åŽå°±ä¼šè‡ªåŠ¨åˆ›å»ºè¿™ä¸ªé…置文件,其ä¸å†…容如下:
{
# QQBot çš„é…置文件
# 使用 qqbot -u somebody å¯åŠ¨ç¨‹åºæ—¶ï¼Œä¾æ¬¡åŠ è½½ï¼š
# æ ¹é…ç½® -> 默认é…ç½® -> 用户 somebody çš„é…ç½® -> å‘½ä»¤è¡Œå‚æ•°é…ç½®
# 使用 qqbot å¯åŠ¨ç¨‹åºæ—¶ï¼Œä¾æ¬¡åŠ è½½ï¼š
# æ ¹é…ç½® -> 默认é…ç½® -> å‘½ä»¤è¡Œå‚æ•°é…ç½®
# 用户 somebody çš„é…ç½®
"somebody" : {
# QQBot-term (HTTP-API) æœåŠ¡å™¨ç«¯å£å·ï¼ˆè¯¥æœåŠ¡å™¨ç›‘å¬ IP 为 127.0.0.1 )
"termServerPort" : 8188,
# 二维ç http æœåС噍 ip,请设置为公网 ip 或空å—符串
"httpServerIP" : "",
# 二维ç http æœåŠ¡å™¨ç«¯å£å·
"httpServerPort" : 8189,
# 自动登录的 QQ å·
"qq" : "3497303033",
# 接收二维ç 图片的邮箱账å·
"mailAccount" : "3497303033@qq.com",
# 该邮箱的 IMAP/SMTP æœåŠ¡æŽˆæƒç
"mailAuthCode" : "feregfgftrasdsew",
# 是å¦ä»¥æ–‡æœ¬æ¨¡å¼æ˜¾ç¤ºäºŒç»´ç
"cmdQrcode" : False,
# 显示/å…³é—调试信æ¯
"debug" : False,
# QQBot 掉线åŽè‡ªåЍé‡å¯
"restartOnOffline" : False,
# 完æˆå…¨éƒ¨è”系人列表获å–ä¹‹åŽæ‰å¯åЍ QQBot
"startAfterFetch" : False,
# æ’件目录
"pluginPath" : ".",
# å¯åŠ¨æ—¶éœ€åŠ è½½çš„æ’ä»¶
"plugins" : ['sample1'],
# æ’ä»¶çš„é…置(由用户自定义)
"pluginsConf" : {},
},
# å¯ä»¥åœ¨ 默认é…ç½® ä¸é…置所有用户都通用的设置
"默认é…ç½®" : {
"qq" : "",
"pluginPath" : "",
"plugins" : [],
},
# # 注æ„ï¼šæ ¹é…ç½®æ˜¯å›ºå®šçš„ï¼Œç”¨æˆ·æ— æ³•ä¿®æ”¹ï¼ˆåœ¨æœ¬æ–‡ä»¶ä¸ä¿®æ”¹æ ¹é…ç½®ä¸ä¼šç”Ÿæ•ˆï¼‰
# "æ ¹é…ç½®" : {
# "termServerPort" : 8188,
# "httpServerIP" : "",
# "httpServerPort" : 8189,
# "qq" : "",
# "mailAccount" : "",
# "mailAuthCode" : "",
# "cmdQrcode" : False,
# "debug" : False,
# "restartOnOffline" : False,
# "startAfterFetch" : False,
# "pluginPath" : "",
# "plugins" : [],
# "pluginsConf" : {},
# },
}
å¯ä»¥åœ¨é…ç½®æ–‡ä»¶ä¸æ·»åŠ è‡ªå·±çš„ç”¨æˆ·é…置(å³åœ¨è¯¥æ–‡ä»¶çš„å—兏䏿–°å¢žä¸€ä¸ª item ï¼Œæ¤ item çš„ key 就代表一个用户),例如,该文件ä¸å·²æœ‰çš„ somebody 项目就代表å为 somebody 的用户,è¿è¡Œ QQBot 时,输入 qqbot -u somebody 或 python sample.py -u somebody ï¼Œåˆ™ä¼šåŠ è½½ somebody 项目下的å„项é…置。
下é¢ä»‹ç»é…置文件ä¸å„项é…置的功能,以下内容å‡å‡å®šå·²ä¿®æ”¹äº† somebody 下的é…置,且以 qqbot -u somebody 或 python sample.py -u somebody 的方å¼è¿è¡Œã€‚
如果需è¦ä½¿ç”¨é‚®ç®±æ¨¡å¼æ˜¾ç¤ºäºŒç»´ç ,å¯ä»¥å°† mailAccount å’Œ mailAuthCode 项ä¸åˆ†åˆ«è®¾ç½®ä¸ºé‚®ç®±å¸å·å’ŒæŽˆæƒç ,è¿è¡ŒåŽï¼ŒäºŒç»´ç 管ç†å™¨ä¼šå°†äºŒç»´ç 图片å‘é€è‡³è¯¥é‚®ç®±ã€‚
注æ„:授æƒç 䏿˜¯é‚®ç®±çš„登录密ç ,而是邮箱æœåС商æä¾›çš„开通 IMAP/SMTP æœåŠ¡çš„æŽˆæƒç , QQ 邮箱å¯ä»¥åœ¨ç½‘页版的邮箱设置里é¢å¼€é€šæ¤é¡¹æœåŠ¡ï¼Œå¹¶å¾—åˆ°æŽˆæƒç 。如果åªå®šä¹‰äº† mailAccount 而没定义 mailAuthCode ,则程åºè¿è¡Œçš„å¼€å§‹æ—¶ä¼šè¦æ±‚æ‰‹å·¥è¾“å…¥æ¤æŽˆæƒç 。
由于网易的邮箱对 IMAP å议的支æŒéžå¸¸æœ‰é™ï¼Œæ— 法在 QQBot ä¸ä½¿ç”¨ã€‚ QQ 的邮箱已通过测试,其他æœåŠ¡å•†çš„é‚®ç®±è¿˜æœªæµ‹è¯•è¿‡ï¼Œå› æ¤å»ºè®®è¿˜æ˜¯ä½¿ç”¨ QQ 邮箱。
如果需è¦ä½¿ç”¨æœåŠ¡å™¨æ¨¡å¼ï¼Œå¯ä»¥é…ç½® httpServerIP å’Œ httpServerPort 项,一般æ¥è¯´åº”该设置为公网 ip 。æœåŠ¡å™¨æ¨¡å¼å¼€å¯åŽï¼Œå¯ä»¥é€šè¿‡ http://{httpServerIP}:{httpServerPort}/{any} æ¥è®¿é—®äºŒç»´ç å›¾ç‰‡ã€‚å…¶ä¸ {any} å¯ä»¥æ˜¯ä»»ä½•éžç©ºçš„æ•°å—æˆ–å—æ¯ä¸²ã€‚
当邮箱模å¼å’ŒæœåŠ¡å™¨æ¨¡å¼åŒæ—¶å¼€å¯æ—¶ï¼Œå‘邮件时ä¸ä¼šå‘é€çœŸæ£çš„图片,åªä¼šå°†å›¾ç‰‡åœ°å€å‘到邮箱ä¸åŽ»ï¼Œè€Œä¸”åªå‘é€ä¸€æ¬¡ï¼ŒäºŒç»´ç 过期时刷新一下邮件就å¯ä»¥äº†ã€‚如果åªå¼€å¯é‚®ç®±æ¨¡å¼ï¼Œåˆ™å‘邮件时会å‘é€çœŸæ£çš„图片,当二维ç 过期时,需è¦å°†é‚®ä»¶è®¾ç½®ä¸ºå·²è¯»ï¼ˆç”¨æ‰‹æœº QQ 打开邮件åŽè¯¥é‚®ä»¶å°±æ˜¯å·²è¯»äº†ï¼‰ï¼Œä¹‹åŽæ‰ä¼šå‘逿œ€æ–°çš„二维ç 图片。
è‹¥ cmdQrcode 项设置为 True ,则会在 term ä¸ä»¥æ–‡æœ¬æ¨¡å¼æ˜¾ç¤ºäºŒç»´ç 。注æ„:è¦ä½¿ç”¨æ–‡æœ¬æ¨¡å¼ï¼Œéœ€è¦è‡ªè¡Œå®‰è£… pillow 库,å¯ä½¿ç”¨ pip 安装。
é…ç½®æ–‡ä»¶ä¸æ¯ä¸ªç”¨æˆ·éƒ½æœ‰ qq 这一项,若æ¤é¡¹å·²è®¾ç½®ä¸ºæŸ QQ å·ç ï¼Œä¼šå…ˆä½¿ç”¨æ¤ QQ å·ä¸Šæ¬¡ç™»å½•ä¿å˜çš„ç™»å½•ä¿¡æ¯æ¥è‡ªåŠ¨ç™»å½•ã€‚
如果é…置文件ä¸å°† restartOnOffline 项设置为 True ,则当 QQBot æŽ‰çº¿æˆ–å‡ºé”™ç»ˆæ¢æ—¶ï¼Œä¼šè‡ªåЍ釿–°å¯åЍ QQBot 。
一般情况下,扫ç 登录完æˆå°±ç«‹å³å¯åЍ 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 å·ç ,则需è¦å¯¹ä¸åŒçš„ QQ å·ç 设置ä¸åŒçš„ termServerPort å’Œ httpServerPort ,以å…端å£å·å†²çªã€‚
è‹¥ debug 项设置为 True ,则è¿è¡Œè¿‡ç¨‹ä¸ä¼šæ‰“å°è°ƒè¯•ä¿¡æ¯ã€‚
一般情况下,æ’件需è¦å˜æ”¾åœ¨ç³»ç»Ÿçš„ import 目录下,å¯ä»¥åœ¨ pluginPath 选项ä¸é…ç½®æ’ä»¶çš„å˜æ”¾ç›®å½•,放在该选项指定的目录下也å¯ä»¥è¢« QQBot 动æ€åŠ è½½ã€‚å¦å¤–,在 plugins 选项ä¸å¯ä»¥æŒ‡å®š QQBot å¯åŠ¨æ—¶éœ€è¦åŠ è½½çš„æ’件(注æ„:这些æ’件需è¦ä¿å˜åœ¨ç³»ç»Ÿçš„ import 目录下或 pluginPath 所指定的目录下)。
é…置文件ä¸çš„æ‰€æœ‰é€‰é¡¹éƒ½æœ‰å¯¹åº”çš„å‘½ä»¤è¡Œå‚æ•°ï¼Œåœ¨å‘½ä»¤è¡Œå‚æ•°ä¸è¾“入的选项优先级比é…置文件高。输入 qqbot -h 或 python sample.py -h 坿Ÿ¥çœ‹æ‰€æœ‰å‘½ä»¤è¡Œå‚æ•°æ ¼å¼ã€‚
程åºä¸€å…±æœ‰å››ä¸ªçº§åˆ«çš„é…置,其优先级如下:
使用 qqbot -u somebody å¯åŠ¨ç¨‹åºæ—¶ï¼Œä¾æ¬¡åŠ è½½ï¼š
æ ¹é…ç½® -> 默认é…ç½® -> 用户 somebody çš„é…ç½® -> å‘½ä»¤è¡Œå‚æ•°é…ç½®
使用 qqbot å¯åŠ¨ç¨‹åºæ—¶ï¼Œä¾æ¬¡åŠ è½½ï¼š
æ ¹é…ç½® -> 默认é…ç½® -> å‘½ä»¤è¡Œå‚æ•°é…ç½®
å…¶ä¸ï¼šæ ¹é…ç½® æ˜¯å›ºå®šçš„ï¼Œç”¨æˆ·æ— æ³•ä¿®æ”¹ï¼› 默认é…ç½® å’Œ 用户é…ç½® å¯ç”±ç”¨æˆ·åœ¨ v2.1.conf 文件ä¸è¿›è¡Œä¿®æ”¹ï¼›æœ€åŽï¼Œè¿˜å¯ä»¥åœ¨ å‘½ä»¤è¡Œå‚æ•° ä¸è¾“å…¥é…置。
qqbot è¿è¡Œæ—¶ï¼Œä¼šåœ¨ 工作目录 下 æœç´¢/创建 以下 文件/目录 :
- é…置文件: v2.2.conf
- æ’件目录: plugins\
- 登录文件: v2.2-py2.7.10-xxxx.pickle
- è”系人数æ®åº“文件: 2017-05-06-20-03-12-xxxx-contact.db
- 临时二维ç 图片: xxxx.png
- ä¿å˜QQ的文件: qq(pid9816)
默认的工作目录为 ~/.qqbot-tmp/ ,å¯ä»¥åœ¨å¯åЍ qqbot æ—¶é€šè¿‡å‘½ä»¤è¡Œå‚æ•° -b|--bench 指定其他工作目录,例如: qqbot -b bench ,如果指定的工作目录ä¸å˜åœ¨ï¼Œä¼šè‡ªåŠ¨åˆ›å»ºè¯¥ç›®å½•ã€‚
- æ¶ˆæ¯æ”¶/å‘
- è”系人(包括 好å‹/群/讨论组/群æˆå‘˜/讨论组æˆå‘˜ï¼‰èµ„料获å–和查询(包括 QQå·/昵称/åç§°/备注å/群æˆå‘˜å片)
- è”ç³»äººèµ„æ–™æ ¹æ®éœ€è¦åŠ¨æ€æ›´æ–°
- 被群内其他æˆå‘˜ @ 的通知
- 群管ç†åŠŸèƒ½ï¼š 设置/å–æ¶ˆç®¡ç†å‘˜ 〠设置/åˆ é™¤ç¾¤å片 〠群æˆå‘˜ç¦è¨€ ä»¥åŠ è¸¢é™¤ç¾¤æˆå‘˜
- å‘é€ã€æŽ¥æ”¶è¡¨æƒ…ï¼ˆè¯¦è§ facemap.py)
- 调用系统默认图片æµè§ˆå™¨æ˜¾ç¤ºç™»å½•二维ç ã€å°†ç™»å½•二维ç å‘é€è‡³é‚®ç®±ã€å¼€å¯ä¸€ä¸ª http æœåŠ¡å™¨ç”¨æ¥æ˜¾ç¤ºç™»å½•二维ç ã€åœ¨å‘½ä»¤è¡Œçª—å£ä½¿ç”¨æ–‡æœ¬æ¨¡å¼æ˜¾ç¤ºäºŒç»´ç
- 用 qq å‘½ä»¤è¡Œå·¥å…·å‘æ¶ˆæ¯ã€æŸ¥è¯¢|æ›´æ–°è”系人ã€ç¾¤ç®¡ç†
- æä¾› HTTP-API 接å£å‘消æ¯ã€æŸ¥è¯¢|æ›´æ–°è”系人ã€ç¾¤ç®¡ç†
- 掉线åŽè‡ªåЍé‡å¯åŠŸèƒ½ï¼ˆæœ‰æ—¶éœ€è¦æ‰‹å·¥æ‰«ç )
- 定时执行任务(通过 QQBotSched 实现)
- æ— æ³•é•¿æ—¶é—´ä¿æŒåœ¨çº¿çжæ€ï¼Œæ¯æ¬¡ç™»å½•æˆåŠŸåŽçš„ cookie 会æ¯åœ¨ 1 ~ 2 天åŽå¤±æ•ˆï¼Œå°†è¢«è…¾è®¯æœåŠ¡å™¨å¼ºåˆ¶ä¸‹çº¿ï¼Œæ¤æ—¶ å¿…é¡» 手工扫ç 釿–°ç™»å½•。å¯ä»¥å°†äºŒç»´ç 显示模å¼è®¾ç½®ä¸ºé‚®ç®±æ¨¡å¼å¹¶æ‰“开自动é‡å¯æ¨¡å¼ï¼Œåœ¨è¢«ä¸‹çº¿æ—¶è‡ªåЍé‡å¯å¹¶å°†äºŒç»´ç å‘é€åˆ°é‚®ç®±ï¼Œå®žçŽ°è¿œç¨‹æ‰«ç
- æ— æ³•å‘é€å›¾ç‰‡ã€æ–‡ä»¶ã€éŸ³é¢‘〠xml å¡ç‰‡æ¶ˆæ¯
- æ— æ³•èŽ·å–到自己通过其他客户端(手机 QQ ã€PC-QQ)å‘é€çš„æ¶ˆæ¯
- 当 好å‹/群/群æˆå‘˜ å˜åœ¨åŒå现象或åç§°ä¸å«ç‰¹æ®Šå—ç¬¦æ—¶ï¼Œæ— æ³•ç»‘å®šå…¶å®žé™… QQ
- æ— æ³•åœ¨ç¾¤å†… @ å…¶ä»–æˆå‘˜ï¼Œå³ä¾¿ç”¨æœ¬ç¨‹åºåœ¨ç¾¤é‡Œå‘é€äº† “@jack xxxâ€ è¿™æ ·çš„æ¶ˆæ¯ï¼Œ jack 也åªèƒ½æ”¶åˆ°è¿™ä¸ªçº¯æ–‡æœ¬ï¼Œæ”¶ä¸åˆ°â€œæœ‰äºº@我â€çš„æé†’。
- æ— æ³•å‘ ç¾¤/讨论组 内的其他éžå¥½å‹æˆå‘˜å‘消æ¯ï¼Œä¹Ÿæ— 法收到éžå¥½å‹æˆå‘˜å‘过æ¥çš„ä¸´æ—¶ä¼šè¯æ¶ˆæ¯
- 在éžå¸¸å°‘çš„æƒ…å†µä¸‹ï¼Œå‘æ¶ˆæ¯æ—¶ä¼šé‡å¤å‘é€å¤šæ¬¡ï¼Œä¹Ÿå¯èƒ½å¯¹æ–¹å·²æ”¶åˆ°æ¶ˆæ¯ä½†è¿”回å‘é€å¤±è´¥çš„结果
QQBot å‚考了以下开æºé¡¹ç›®ï¼š
- ScienJus/qqbot (ruby)
- floatinghotpot/qqbot (node.js)
- sjdy521/Mojo-Webqq (perl)
åœ¨æ¤æ„Ÿè°¢ä»¥ä¸Šä¸‰ä½ä½œè€…çš„æ— ç§åˆ†äº«ï¼Œç‰¹åˆ«æ˜¯æ„Ÿè°¢ ScienJus 对 SmartQQ å议所åšå‡ºçš„æ·±å…¥ç»†è‡´çš„分æžã€‚
有任何问题或建议å¯ä»¥å‘邮件给我 pandolia@yeah.net ,或者直接æ issue ,也å¯ä»¥åŠ QQ 群: 577126408 。但还是希望您在æé—®ä¹‹å‰é€šè¯»ä¸€ä¸‹æœ¬æ–‡æ¡£ï¼Œå¾ˆæœ‰å¯èƒ½æ‚¨æƒ³è¦çš„ç”æ¡ˆå·²ç»åœ¨æ–‡æ¡£ä¸äº†ã€‚
