qqbot是一个免费开源的基于smartqq的python插件,如果默认安装有pip,则可以直接在命令行下执行:pip install qqbot安装qqbot,安装成功后可以在命令行输入qqbot help查看帮助文档。如果直接输入qqbot会自动弹出一个二维码图片,用手机qq扫码即可启动成功,会自动保存本次的登陆信息到本地文件,下次可以输入qqbot -q qq号码启动,如果登陆信息没有过期就可以不用扫码登陆。qqbot启动后,可以再开一个终端来操作qqbot,输入:qq help|stop|restart,这三个命令分别是帮助文档,停机和重启。
下面实现自己的文字消息自动回复。qqbot提供了一个消息响应函数,我们只需要注册这个消息响应函数就可以收到qq消息了,这个消息响应函数的写法如下:
from qqbot import QQBotSlot as qqbotslot,RunBot
@qqbotslot
def onQQMessage(bot,contact,member,content):
if content == '-hello':
bot.SendTo(contact,'你好')
elif content=='-stop':
bot.SendTo(contact,'机器人已关闭')
bot.Stop()
if __name__=='__main__':
RunBot()
注意这个消息响应函数名必须是onQQMessage,函数参数也必须一致。
写好消息响应函数后,保存为xx.py,如果qqbot已经启动请关闭qqbot进程,然后在命令行输入python xx.py -q qq号码,这样就可以启动qqbot,并且会把xx.py自动注册到qqbot的消息响应函数上,当qq收到消息时会在命令行上看到。还有一种运行xx.py的方式,就是把此文件当作一个插件,在qqbot运行过程中动态加载卸载。首先要将此文件保存在系统中可以import到的目录下,如python的安装目录下的Lib/site-packages目录,在qqbot启动后,在另外一个控制台输入qq plug xx就可以将onQQMessage函数注册到qqbot中去,输入qq unplugin xx。如果以插件形式加载xx.py,文件内容可以简化,只保留def onMessage函数,其他的都可以删除。
下面简单介绍传入onQQMessage的四个参数,bot是qqbot对象,提供了List/Send/Stop/Restart四个接口,List接口是一个查询接口,可以主动查询联系人列表等信息,具体详情还需查阅相关文档,本案例没用到这个接口,Send是一个发送消息的接口,Stop是停止qqbot的接口,Restart是重启qqbot的接口。contact是消息的发送者对象,member仅本消息是群或者讨论组的消息时才有效,代表发送消息的成员。content是一个str对象,消息的内容。
qqbot提供了几种发送二维码登陆验证的方法,分别有GUI模式,邮箱模式,服务器模式,文本模式。默认是GUI模式,当开启了其他模式时,GUI模式是关闭的。一般常用的是GUI和邮箱模式。在第一次启动qqbot后,在电脑系统盘里的用户目录C:\Users\个人电脑账号名(有可能是C:\用户\电脑的账号名)目录下会有一个.qqbot-tmp文件夹,在这个文件夹里,有一个v2.3.conf文件,这个文件就是登陆验证的配置文件,打开配置文件,里面有介绍配置的作用,可以自己复制一份somebody更改为自己想要的登陆模式,假设我复制了一份somebody添加在somebody后面,并命名为some,修改定制some的内容,下次启动时可以输入qqbot -u some或者python xx.py -u some启动qqbot。
下面给出个人实现的qq上收到’笑话’消息时自动回复一条笑话,笑话是上篇博文抓取存储的,从mysql数据库里获取笑话的python代码也在上篇博文。具体代码如下。
from qqbot import QQBotSlot as qqbotslot,RunBot
import mysql
@qqbotslot
def onQQMessage(bot,contact,member,content):
if content == '笑话':
bot.SendTo(contact,mysql.get_one())
elif content=='-stop':
bot.SendTo(contact,'机器人已关闭')
bot.Stop()
if __name__=='__main__':
RunBot()
下面给出contact和member对象的简单说明。可以自己使用contact.__dict__获得对象的属性,注意,如果是一对一私聊则member对象将为NoneType。由于smartqq的限制,很多功能都缺失了,比如不能获取到真实的qq号。
contact对象__dict__大致如下:
#{'qq': '#NULL', 'uin': '3285709011', 'nick': 'mytest2', 'mark': '',
# 'name': 'mytest2', 'gcode': '3285709011', 'ctype': 'group'}
uin唯一标识,群聊天时标识群,一对一私聊时标识qq。nick是群名称,ctype说明本次消息是何种类型的,group表示是群,buddy表示是私聊。
member对象__dict__大致如下:
#{'qq': '#NULL', 'uin': '3012699167', 'nick': 'XX', 'mark': '#NULL',
# 'card': 'XXXX', 'name': 'XXXX', 'join_time': -1, 'last_speak_time': -1,
# 'role': '#NULL', 'role_id': -1, 'is_buddy': -1, 'level': -1, 'levelname': '#NULL',
# 'point': -1, 'ctype': 'group-member'}
当私聊时此对象为NoneType,uin唯一标识群成员,nick标识qq昵称,card表示群聊天里发消息的那个qq昵称备注。
其实通过onQQMessage我们已经可以做很多事情了,qqbot还提供了其他一些功能,可以参考百度相关资料得到。下一篇将介绍接入图灵机器人实现智能聊天。