10BC0 GitHub - feisuweb/qqbot: QQBot: A conversation robot base on Tencent's SmartQQ
[go: up one dir, main page]

Skip to content

feisuweb/qqbot

 
 

Repository files navigation

一ã€ä»‹ç»

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 .

三ã€ä½¿ç”¨æ–¹æ³•

1. å¯åЍ QQBot

在命令行输入: qqbot 。å¯åŠ¨è¿‡ç¨‹ä¸­ä¼šè‡ªåŠ¨å¼¹å‡ºäºŒç»´ç å›¾ç‰‡ï¼Œéœ€è¦ç”¨æ‰‹æœº QQ 客户端扫ç å¹¶æŽˆæƒç™»å½•。å¯åЍæˆåŠŸåŽï¼Œä¼šå°†æœ¬æ¬¡ç™»å½•ä¿¡æ¯ä¿å­˜åˆ°æœ¬åœ°æ–‡ä»¶ä¸­ï¼Œä¸‹æ¬¡å¯åŠ¨æ—¶ï¼Œå¯ä»¥è¾“入: qqbot -q qqå·ç  ,先å°è¯•从本地文件中æ¢å¤ç™»å½•ä¿¡æ¯ï¼ˆä¸éœ€è¦æ‰‹åŠ¨æ‰«ç ï¼‰ï¼Œåªæœ‰æ¢å¤ä¸æˆåŠŸæˆ–ç™»å½•ä¿¡æ¯å·²è¿‡æœŸæ—¶æ‰ä¼šéœ€è¦æ‰‹åŠ¨æ‰«ç ç™»å½•。一般æ¥è¯´ï¼Œä¿å­˜çš„登录信æ¯å°†åœ¨ 2 天之åŽè¿‡æœŸã€‚

注æ„: Linux 下,需è¦ç³»ç»Ÿä¸­æœ‰ gvfs-open 或者 shotwell 命令æ‰èƒ½è‡ªåŠ¨å¼¹å‡ºäºŒç»´ç å›¾ç‰‡ï¼ˆä¸€èˆ¬å®‰è£…有 GNOME 虚拟文件系统 gvfs 的系统中都会å«è¿™ä¸¤ä¸ªå‘½ä»¤ä¹‹ä¸€ï¼‰ã€‚ Windows10 下,需è¦ç³»ç»Ÿä¸­å·²è®¾ç½®äº† png å›¾ç‰‡æ–‡ä»¶çš„é»˜è®¤æ‰“å¼€ç¨‹åºæ‰èƒ½è‡ªåŠ¨å¼¹å‡ºäºŒç»´ç å›¾ç‰‡ã€‚

若系统无法自动弹出二维ç å›¾ç‰‡ï¼Œå¯ä»¥æ‰‹åŠ¨æ‰“å¼€å›¾ç‰‡æ–‡ä»¶è¿›è¡Œæ‰«ç ï¼Œä¹Ÿå¯ä»¥å°†äºŒç»´ç æ˜¾ç¤ºæ¨¡å¼è®¾ç½®ä¸º 邮箱模å¼/æœåŠ¡å™¨æ¨¡å¼/æ–‡æœ¬æ¨¡å¼ è¿›è¡Œæ‰«ç ï¼Œè¯¦è§æœ¬æ–‡æ¡£çš„第七节。

2. æ“作 QQBot

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 命令采用表格的形å¼è¾“出è”系人列表,其输出样å¼ç¤ºä¾‹å¦‚下:

prettytable.png

为ä¿è¯è¡¨æ ¼åœ¨ç»ˆç«¯ä¸­çš„æ˜¾ç¤ºæ•ˆæžœï¼Œå»ºè®®å°†ç»ˆç«¯çš„输出字体设置为 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 机器人

实现自己的 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 对象的接å£

QQBot 对象æä¾› List/Update/SendTo/GroupSetAdmin/GroupSetCard/GroupShut/GroupKick/Stop/Restart/FreshRestart ä¹ä¸ªå…¬å¼€æŽ¥å£ï¼Œä¸€èˆ¬æƒ…况下,请勿 调用/å­˜å– æ­¤å¯¹è±¡çš„å…¶ä»– 方法/属性 。å¦å¤–, 请勿在å­çº¿ç¨‹ä¸­è°ƒç”¨è¿™äº›æŽ¥å£ 。 以下介ç»å‰ 7 个接å£ã€‚

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

对应上é¢çš„ 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 接å£åŽï¼Œ 务必 先根æ®ä»¥ä¸Šä¸‰ç§æƒ…况对返回值进行判断,然åŽå†æ‰§è¡ŒåŽç»­ä»£ç ã€‚

(2) bot.Update(tinfo) --> True/False

Update 接å£çš„傿•° tinfo å’Œ List 接å£ä¸­çš„傿•°å«ä¹‰ç›¸åŒï¼Œè°ƒç”¨æ­¤æŽ¥å£ä¼šç«‹å³å‘ QQ æœåŠ¡å™¨è¯·æ±‚ç›¸åº”çš„è”系人列表并更新è”系人数æ®åº“,并一直阻塞至更新æˆåŠŸã€‚æ›´æ–°æœ€æ…¢çš„æ˜¯å¥½å‹åˆ—表,若好å‹è¾ƒå¤šå¯èƒ½ä¼šé˜»å¡ž 5 ~ 10 秒。æˆå‘˜åˆ—表更新的较快,å³ä¾¿æ˜¯ 2000 人的大群,更新时间仅 1 ~ 2 秒。

若更新æˆåŠŸï¼Œè¿”å›ž True ,å¦åˆ™ï¼Œè¿”回 False 。

(3) bot.SendTo(contact, content, resendOn1202=True) --> 'å‘ xx 呿¶ˆæ¯æˆåŠŸ'/'错误:...'

å‘è”系人å‘逿¶ˆæ¯ã€‚ç¬¬ä¸€ä¸ªå‚æ•°ä¸º QContact å¯¹è±¡ï¼Œç¬¬äºŒä¸ªå‚æ•°ä¸ºæ¶ˆæ¯å†…å®¹ã€‚å†æ¬¡æé†’: åªå¯ä»¥å‘ 好å‹/群/讨论组 呿¶ˆæ¯ï¼Œ ä¸å…è®¸å‘ ç¾¤æˆå‘˜/讨论组æˆå‘˜ 呿¶ˆæ¯ 。

å¯ä»¥åœ¨æ¶ˆæ¯å†…容中嵌入“/微笑â€ç­‰è¡¨æƒ…å…³é”®è¯æ¥å‘对方å‘é€è¡¨æƒ…ï¼Œè¯¦è§ facemap.py。

è‹¥å‘逿ˆåŠŸï¼Œè¿”å›žå­—ç¬¦ä¸²ï¼ˆ'å‘ xx 呿¶ˆæ¯æˆåŠŸ')。å¦åˆ™ï¼Œè¿”回å«é”™è¯¯åŽŸå› çš„å­—ç¬¦ä¸²ï¼ˆ'错误:...')。

呿¶ˆæ¯æ—¶å¯èƒ½ä¼šé‡å¤å‘消æ¯ï¼Œè¿™æ˜¯å› ä¸º QQ æœåŠ¡å™¨è¿”å›žä»£ç  1202 的原因。v2.1.17版已针对此问题在 bot.SendTo 接å£ä¸­å¢žåŠ äº†ä¸€ä¸ªå‚æ•°ï¼š resendOn1202 ï¼Œè‹¥æ­¤å‚æ•°ä¸º True ï¼ˆé»˜è®¤å€¼ï¼‰ï¼Œåˆ™å‘æ¶ˆæ¯æ—¶å¦‚æžœ QQ æœåŠ¡å™¨è¿”å›žä»£ç  1202 ï¼ˆè¡¨æ˜Žå‘æ¶ˆæ¯å¯èƒ½å¤±è´¥ï¼‰ï¼Œè¿˜ä¼šç»§ç»­å‘é€ 3 æ¬¡ï¼Œç›´è‡³è¿”å›žä»£ç  0 , è‹¥æ­¤å‚æ•°ä¸º False ,则ä¸ä¼šå°è¯•é‡å‘。

设为 True 在ç»å¤§éƒ¨åˆ†æƒ…况下能ä¿è¯æ¶ˆæ¯ä¸€å®šèƒ½å‘å‡ºåŽ»ï¼Œä½†ç¼ºç‚¹æ˜¯æœ‰æ—¶ä¸€æ¡æ¶ˆæ¯ä¼šé‡å¤å‘é€ã€‚设为 False 则相å,消æ¯ä¸ä¼šé‡å¤å‘é€ï¼Œä½†æœ‰æ—¶æ¶ˆæ¯å‘é€ä¸å‡ºåŽ»ã€‚

总之因为这个 1202 代ç çš„ä¸ç¡®å®šæ€§ï¼Œæ²¡æœ‰å®Œç¾Žçš„解决办法。请根æ®å„自的实际情况选择 resendOn1202 的值。

(4) bot.GroupXXX(group, membs[, arg]) --> ['æˆåŠŸï¼š...', 'æˆåŠŸï¼š...', '错误:...']

对应第三节的群管ç†å‘½ä»¤ï¼Œå…±å››ä¸ªæŽ¥å£ï¼š

  • 设置/å–æ¶ˆç®¡ç†å‘˜ï¼š 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 的内容å¯å‚è§ä»¥ä¸‹å‚考资料:

注册回调函数和定制定时任务的注æ„事项

注册回调函数和定制定时任务是对 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 çš„è¿è¡Œè¿‡ç¨‹ä¸­åЍæ€çš„加载和å¸è½½ã€‚

七ã€äºŒç»´ç ç®¡ç†å™¨ã€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 )

如果需è¦ä½¿ç”¨é‚®ç®±æ¨¡å¼æ˜¾ç¤ºäºŒç»´ç ï¼Œå¯ä»¥å°† mailAccount å’Œ mailAuthCode 项中分别设置为邮箱å¸å·å’ŒæŽˆæƒç ï¼Œè¿è¡ŒåŽï¼ŒäºŒç»´ç ç®¡ç†å™¨ä¼šå°†äºŒç»´ç å›¾ç‰‡å‘é€è‡³è¯¥é‚®ç®±ã€‚

注æ„:授æƒç ä¸æ˜¯é‚®ç®±çš„登录密ç ï¼Œè€Œæ˜¯é‚®ç®±æœåС商æä¾›çš„开通 IMAP/SMTP æœåŠ¡çš„æŽˆæƒç ï¼Œ QQ 邮箱å¯ä»¥åœ¨ç½‘页版的邮箱设置里é¢å¼€é€šæ­¤é¡¹æœåŠ¡ï¼Œå¹¶å¾—åˆ°æŽˆæƒç ã€‚如果åªå®šä¹‰äº† mailAccount 而没定义 mailAuthCode ,则程åºè¿è¡Œçš„å¼€å§‹æ—¶ä¼šè¦æ±‚手工输入此授æƒç ã€‚

由于网易的邮箱对 IMAP å议的支æŒéžå¸¸æœ‰é™ï¼Œæ— æ³•在 QQBot 中使用。 QQ 的邮箱已通过测试,其他æœåŠ¡å•†çš„é‚®ç®±è¿˜æœªæµ‹è¯•è¿‡ï¼Œå› æ­¤å»ºè®®è¿˜æ˜¯ä½¿ç”¨ QQ 邮箱。

æœåŠ¡å™¨æ¨¡å¼çš„é…置( httpServerIP å’Œ httpServerPort )

如果需è¦ä½¿ç”¨æœåŠ¡å™¨æ¨¡å¼ï¼Œå¯ä»¥é…ç½® httpServerIP å’Œ httpServerPort 项,一般æ¥è¯´åº”该设置为公网 ip 。æœåŠ¡å™¨æ¨¡å¼å¼€å¯åŽï¼Œå¯ä»¥é€šè¿‡ http://{httpServerIP}:{httpServerPort}/{any} æ¥è®¿é—®äºŒç»´ç å›¾ç‰‡ã€‚其中 {any} å¯ä»¥æ˜¯ä»»ä½•éžç©ºçš„æ•°å­—或字æ¯ä¸²ã€‚

当邮箱模å¼å’ŒæœåŠ¡å™¨æ¨¡å¼åŒæ—¶å¼€å¯æ—¶ï¼Œå‘邮件时ä¸ä¼šå‘é€çœŸæ­£çš„图片,åªä¼šå°†å›¾ç‰‡åœ°å€å‘到邮箱中去,而且åªå‘é€ä¸€æ¬¡ï¼ŒäºŒç»´ç è¿‡æœŸæ—¶åˆ·æ–°ä¸€ä¸‹é‚®ä»¶å°±å¯ä»¥äº†ã€‚如果åªå¼€å¯é‚®ç®±æ¨¡å¼ï¼Œåˆ™å‘邮件时会å‘é€çœŸæ­£çš„图片,当二维ç è¿‡æœŸæ—¶ï¼Œéœ€è¦å°†é‚®ä»¶è®¾ç½®ä¸ºå·²è¯»ï¼ˆç”¨æ‰‹æœº QQ 打开邮件åŽè¯¥é‚®ä»¶å°±æ˜¯å·²è¯»äº†ï¼‰ï¼Œä¹‹åŽæ‰ä¼šå‘逿œ€æ–°çš„二维ç å›¾ç‰‡ã€‚

æ–‡æœ¬æ¨¡å¼æ˜¾ç¤ºäºŒç»´ç ï¼ˆcmdQrcode)

è‹¥ cmdQrcode 项设置为 True ,则会在 term ä¸­ä»¥æ–‡æœ¬æ¨¡å¼æ˜¾ç¤ºäºŒç»´ç ã€‚注æ„:è¦ä½¿ç”¨æ–‡æœ¬æ¨¡å¼ï¼Œéœ€è¦è‡ªè¡Œå®‰è£… pillow 库,å¯ä½¿ç”¨ pip 安装。

自动登录的 QQ å·ç ï¼ˆ qq )

é…置文件中æ¯ä¸ªç”¨æˆ·éƒ½æœ‰ qq è¿™ä¸€é¡¹ï¼Œè‹¥æ­¤é¡¹å·²è®¾ç½®ä¸ºæŸ QQ å·ç ï¼Œä¼šå…ˆä½¿ç”¨æ­¤ QQ å·ä¸Šæ¬¡ç™»å½•ä¿å­˜çš„ç™»å½•ä¿¡æ¯æ¥è‡ªåŠ¨ç™»å½•ã€‚

掉线åŽè‡ªåЍé‡å¯ï¼ˆ restartOnOffline )

如果é…置文件中将 restartOnOffline 项设置为 True ,则当 QQBot æŽ‰çº¿æˆ–å‡ºé”™ç»ˆæ­¢æ—¶ï¼Œä¼šè‡ªåŠ¨é‡æ–°å¯åЍ QQBot 。

è”系人列表获å–完æˆåŽå†å¯åŠ¨ï¼ˆ startAfterFetch )

一般情况下,扫ç ç™»å½•完æˆå°±ç«‹å³å¯åЍ QQBotï¼Œåªæœ‰åœ¨éœ€è¦çš„æ—¶å€™æ‰ä¼šåŽ»èŽ·å–è”系人列表并更新è”系人数æ®åº“。如果将é…置文件中的 startAfterFetch 设置为 True ,则 QQBot 会等待所有è”系人列表获å–完æˆåŽæ‰å¯åЍ ,注æ„,如果è”系人较多,会耗费较长的时间。

QQBot-term æœåŠ¡å™¨ç«¯å£å·ï¼ˆ termServerPort )

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 )

è‹¥ debug 项设置为 True ,则è¿è¡Œè¿‡ç¨‹ä¸­ä¼šæ‰“å°è°ƒè¯•ä¿¡æ¯ã€‚

æ’ä»¶çš„é…置( pluginPath å’Œ plugins )

一般情况下,æ’件需è¦å­˜æ”¾åœ¨ç³»ç»Ÿçš„ 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 ,如果指定的工作目录ä¸å­˜åœ¨ï¼Œä¼šè‡ªåŠ¨åˆ›å»ºè¯¥ç›®å½•ã€‚

八〠smartqq å议支æŒåŠé™åˆ¶

本项目已实现ç»å¤§éƒ¨åˆ† smartqq å议支æŒçš„功能,如下:

  • æ¶ˆæ¯æ”¶/å‘
  • è”系人(包括 好å‹/群/讨论组/群æˆå‘˜/讨论组æˆå‘˜ï¼‰èµ„料获å–和查询(包括 QQå·/昵称/åç§°/备注å/群æˆå‘˜å片)
  • è”系人资料根æ®éœ€è¦åŠ¨æ€æ›´æ–°
  • 被群内其他æˆå‘˜ @ 的通知
  • 群管ç†åŠŸèƒ½ï¼š 设置/å–æ¶ˆç®¡ç†å‘˜ 〠设置/删除群å片 〠群æˆå‘˜ç¦è¨€ ä»¥åŠ è¸¢é™¤ç¾¤æˆå‘˜
  • å‘é€ã€æŽ¥æ”¶è¡¨æƒ…ï¼ˆè¯¦è§ facemap.py)

其他功能

  • 调用系统默认图片æµè§ˆå™¨æ˜¾ç¤ºç™»å½•二维ç ã€å°†ç™»å½•二维ç å‘é€è‡³é‚®ç®±ã€å¼€å¯ä¸€ä¸ª http æœåŠ¡å™¨ç”¨æ¥æ˜¾ç¤ºç™»å½•二维ç ã€åœ¨å‘½ä»¤è¡Œçª—å£ä½¿ç”¨æ–‡æœ¬æ¨¡å¼æ˜¾ç¤ºäºŒç»´ç 
  • 用 qq å‘½ä»¤è¡Œå·¥å…·å‘æ¶ˆæ¯ã€æŸ¥è¯¢|æ›´æ–°è”系人ã€ç¾¤ç®¡ç†
  • æä¾› HTTP-API 接å£å‘消æ¯ã€æŸ¥è¯¢|æ›´æ–°è”系人ã€ç¾¤ç®¡ç†
  • 掉线åŽè‡ªåЍé‡å¯åŠŸèƒ½ï¼ˆæœ‰æ—¶éœ€è¦æ‰‹å·¥æ‰«ç ï¼‰
  • 定时执行任务(通过 QQBotSched 实现)

å›  smartqq å议的é™åˆ¶ï¼Œä»¥ä¸‹é—®é¢˜æ— è§£å†³åŠžæ³•

  • æ— æ³•é•¿æ—¶é—´ä¿æŒåœ¨çº¿çжæ€ï¼Œæ¯æ¬¡ç™»å½•æˆåŠŸåŽçš„ cookie 会æ¯åœ¨ 1 ~ 2 天åŽå¤±æ•ˆï¼Œå°†è¢«è…¾è®¯æœåŠ¡å™¨å¼ºåˆ¶ä¸‹çº¿ï¼Œæ­¤æ—¶ å¿…é¡» 手工扫ç é‡æ–°ç™»å½•。å¯ä»¥å°†äºŒç»´ç æ˜¾ç¤ºæ¨¡å¼è®¾ç½®ä¸ºé‚®ç®±æ¨¡å¼å¹¶æ‰“开自动é‡å¯æ¨¡å¼ï¼Œåœ¨è¢«ä¸‹çº¿æ—¶è‡ªåЍé‡å¯å¹¶å°†äºŒç»´ç å‘é€åˆ°é‚®ç®±ï¼Œå®žçŽ°è¿œç¨‹æ‰«ç 
  • 无法å‘é€å›¾ç‰‡ã€æ–‡ä»¶ã€éŸ³é¢‘〠xml å¡ç‰‡æ¶ˆæ¯
  • 无法获å–到自己通过其他客户端(手机 QQ ã€PC-QQ)å‘é€çš„æ¶ˆæ¯
  • 当 好å‹/群/群æˆå‘˜ 存在åŒå现象或å称中å«ç‰¹æ®Šå­—符时,无法绑定其实际 QQ
  • 无法在群内 @ å…¶ä»–æˆå‘˜ï¼Œå³ä¾¿ç”¨æœ¬ç¨‹åºåœ¨ç¾¤é‡Œå‘é€äº† “@jack xxx†这样的消æ¯ï¼Œ jack 也åªèƒ½æ”¶åˆ°è¿™ä¸ªçº¯æ–‡æœ¬ï¼Œæ”¶ä¸åˆ°â€œæœ‰äºº@我â€çš„æé†’。
  • æ— æ³•å‘ ç¾¤/讨论组 内的其他éžå¥½å‹æˆå‘˜å‘消æ¯ï¼Œä¹Ÿæ— æ³•收到éžå¥½å‹æˆå‘˜å‘过æ¥çš„ä¸´æ—¶ä¼šè¯æ¶ˆæ¯
  • 在éžå¸¸å°‘çš„æƒ…å†µä¸‹ï¼Œå‘æ¶ˆæ¯æ—¶ä¼šé‡å¤å‘é€å¤šæ¬¡ï¼Œä¹Ÿå¯èƒ½å¯¹æ–¹å·²æ”¶åˆ°æ¶ˆæ¯ä½†è¿”回å‘é€å¤±è´¥çš„结果

ä¹ã€å…¶ä»–

åã€å‚考资料

QQBot å‚考了以下开æºé¡¹ç›®ï¼š

在此感谢以上三ä½ä½œè€…的无ç§åˆ†äº«ï¼Œç‰¹åˆ«æ˜¯æ„Ÿè°¢ ScienJus 对 SmartQQ å议所åšå‡ºçš„æ·±å…¥ç»†è‡´çš„分æžã€‚

å一ã€å馈

有任何问题或建议å¯ä»¥å‘邮件给我 pandolia@yeah.net ,或者直接æ issue ,也å¯ä»¥åŠ  QQ 群: 577126408 。但还是希望您在æé—®ä¹‹å‰é€šè¯»ä¸€ä¸‹æœ¬æ–‡æ¡£ï¼Œå¾ˆæœ‰å¯èƒ½æ‚¨æƒ³è¦çš„答案已ç»åœ¨æ–‡æ¡£ä¸­äº†ã€‚

About

QQBot: A conversation robot base on Tencent's SmartQQ

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Python 94.2%
  • HTML 5.4%
  • Shell 0.4%
0