子沐课堂——QQ聊天机器人
初识PyQQbot
QQBot 是一个用 python 实现的、基于腾讯 SmartQQ 协议的简单 QQ 机器人,可运行在 Linux 和 Windows 平台下,所有代码均集成在一个 [qqbot.py][code] 文件中,代码量仅 400 多行(不包括注释)。程序采用单线程的方式运行,且尽可能的减少了网络和登录错误(特别是所谓的 103 error )发生的概率。
PyQQbot的github项目地址为:https://github.com/pandolia/qqbot/
PyQQbot可以实现的功能:
1. 监控、收集QQ信息
2. 自动信息推送
3. 聊天机器人
4. 通过QQ远程控制电脑、智能家电
应用PyQQbot
1.安装
在 Python 2.7 下使用,用 pip 安装,安装命令:
$ pip install qqbot
验证是否安装成功,打开命令行输入qqbot -h
2.启动QQbot
在命令行输入: qqbot 。启动过程中会自动弹出二维码图片,需要用手机 QQ 客户端扫码并授权登录。
启动成功后,会将本次登录信息保存到本地文件中,下次启动时,可以输入:
qqbot -q qq号码
先尝试从本地文件中恢复登录信息(不需要手动扫码),只有恢复不成功或登录信息已过期时才会需要手动扫码登录。一般来说,保存的登录信息将在 2 ~ 3 天之后过期。
3.操作QQBot
找到.qqbot-tmp下的v2.0.conf文件,修改这个配置文件。
配置用户信息,如此我们可以使用命令:qqbot -u somebody,他直接调用的就是用户somebody的配置。如此,可以实现自动登录。
大家可以自己增加自己的用户配置信息
QQBot 启动后,会自动弹出一个控制台窗口( qterm 客户端)用来输入操作 QQBot 的命令,目前提供以下命令:
1) 帮助
help
2) 列出所有 好友/群/讨论组
list buddy|group|discuss
3) 向 好友/群/讨论组 发送消息
send buddy|group|discuss x|uin=x|qq=x|name=x|nick=x|mark=x message
4) 获取 好友/群/讨论组 的信息
get buddy|group|discuss x|uin=x|qq=x|name=x|nick=x|mark=x
5) 获取 群/讨论组 的成员
member group|discuss x|uin=x|qq=x|name=x|mark=x
6) 停止 QQBot
stop
7) 退出QQbot shell
quit
在 send/get/member 命令中,第三个参数可以是 好友/群/讨论组 的 名称/昵称/备注名/qq/uin 。
注意:如果系统中没有图形界面,则不会自动弹出控制台窗口,需要手动在另外的控制台中输入 “qterm [port]” 命令来打开 qterm 客户端。
QQBot 启动后,用另外一个 QQ 向本 QQ 发送 “qqbot --version” ,则 QQBot 会自动回复: “QQBot-v2.x.x” 。(注:2.0.3之前的版本中,通过 QQ 消息发送以上 6 个命令也可以操作 QQBot , 2.0.4 版之后,为安全起见,去掉此功能,只保留一个 “qqbot --version” 的命令用来远程测试 QQBot 是否正常运行)。
私人订制QQ机器人
实现自己的 QQ 机器人非常简单,只需要生成一个 QQBot 对象并为其注册一个消息响应函数。
以上代码运行后,用另外一个 QQ 向本 QQ 发送消息 “-hello”,则会自动回复 “你好,我是 QQ 机器人”,发送消息 “-stop” 则会关闭 QQ 机器人,发送信息”你好”,也会回复“你好,我是QQ机器人”。
QQBot 对象收到一条 QQ 消息时,会新建一个 QQMessage 对象,之后将这个 QQMessage 对象以及自身传递给消息响应函数。
消息响应函数中的第一个参数为传递来的 QQBot 对象,也就是 myqqbot ,第二个参数是传递来的 QQMessage 对象,该对象主要有以下四个属性:
l message.contact : QContact对象,消息发送者
l message.memberUin : str 对象,消息发送成员的 uin,仅在该消息为 群/讨论组 消息时有效
l message.memberName : str 对象,消息发送成员的昵称,仅在该消息为 群/讨论组 消息时有效
l message.content : str 对象,消息内容
QQMessage 对象还提供一个 Reply 接口,可以给消息发送者回复消息,如:
message.Reply('你好,我是QQ机器人') # 相当于 bot.SendTo(message.contact, '你好,我是QQ机器人')
message.contact 是一个 QContact 对象,该对象有以下属性:
l contact.ctype : str 对象,联系人类型,可以为 'buddy', 'group', 'discuss' ,代表 好友/群/讨论组
l contact.uin : str 对象,联系人的 uin ,底层发消息要使用本数值,每次登录本数值可能会改变
l contact.qq : str 对象,联系人的 qq
l contact.name : str 对象,联系人的名称
l contact.nick : str 对象,好友的昵称
l contact.mark : str 对象,好友或群的备注名
l contact.members : dict 对象,群或讨论组的成员字典
还提供一个 GetMemberName 接口,可以通过成员的 uin 查询成员的网名:
contact.GetMemberName(memberUin) --> memberName, str object
QQbot对象的接口
QQBot 对象调用其 Login 方法登录成功后,提供 List/Get/SendTo/Send/On 五个接口,一般来说,只需要调用这五个接口就可以了,不必关心 QQBot 的内部细节。
(1) bot.List(ctype) --> [contact0, contact1, ... ]
对应上面的 list 命令,示例:
>>> bot.List('buddy')
>>> bot.List('group')
>>> bot.List('discuss')
...
返回一个联系人对象(QContact对象)列表。
(2) bot.Get(ctype, *args, **kwargs) --> [contact0, contact1, ... ]
对应上面的 get 命令,示例:
>>> bot.Get('buddy', 'jack')
>>> bot.Get('group', '1234556')
>>> bot.Get('buddy', 'qq=1235778')
>>> bot.Get('buddy', uin='1234768')
>>> bot.Get('discuss', name='disc-name')
>>> bot.Get('buddy', mark='jack')
第二个参数可以为联系人的 名称/昵称/备注名/qq/uin ,注意,这里返回的是一个 QContact 对象的列表,而不是返回一个 QContact 对象。
(3) bot.SendTo(contact, content) --> '向 xx 发消息成功'
向联系人发送消息。第一个参数为 QContact 对象,一般通过 Get 接口得到,第二个参数为消息内容。
(4) bot.Send(ctype, *args, **kwargs) --> ['向 xx 发消息成功', '向 xx 发消息成功...', ... ]
对应上面的 send 命令,示例:
>>> bot.Send('buddy', 'jack', 'hello')
>>> bot.Send('group', '1234556', 'hello')
>>> bot.Send('buddy', 'qq=1235778', 'hello')
>>> bot.Send('buddy', uin='1234768', content='hello')
>>> bot.Send('discuss', name='disc-name', content='hello')
Send 接口的第一、二个参数和 Get 接口的一样,第三个参数为消息内容。上面的第一条语句相当于:
result = []
for contact in bot.Get('buddy', 'jack'):
result.append(bot.SendTo(contact, 'hello'))
return result
(5) bot.On(mtype, callback) --> callback
注册消息响应函数。第一个参数 mtype 为需要响应的消息的类型,一般来说,只需要响应 QQ 消息和 qterm 客户端消息, mtype 分别为 'qqmessage' 和 'termmessage' 。第二个参数 callback 为消息响应函数。
当 QQBot 收到这两种消息时,会新建一个 QQMessage 对象或 TermMessage 对象,连同 QQBot 对象本身一起传递给 callback 。这两种消息对象都有 content 属性和 Reply 接口,content 代表消息内容, Reply 接口可以向消息的发送者回复消息,对于 TermMessage 对象,消息发送者就是 qterm 客户端,注意,对于所有 TermMessage ,都必须调用一次 Reply ,否则 qterm 客户端会一直等待此回复消息。
图灵机器人
http://www.tuling123.com/
中文语境下智能度最高的机器人大脑图灵机器人
接下来解释大家自由发挥的时间了
在页面的最下面有个api接入,这是我们需要用到的内容。我们要使用这个api,来智能化我们之前私人订制的qq聊天机器人。
Python代码如下所示
请求方式
(1)接口地址
http://www.tuling123.com/openapi/api
(2)请求方式
HTTP POST
(3)请求参数
请求参数格式为 json
参数 | 是否必须 | 长度 | 示例 | 说明 |
key | 必须 | 32 | 1ca8089********736b8ce41591426(32 位) | 注册之后在机器人接入页面获得 |
Info | 必须 | 1-30 | 打招呼“你好”查天气“北京今天天气” | 请求内容,编码方式为utf-8 |
Userid | 上下文必须 | 1-32 | bc123(支持 0-9,a-z,A-Z组合,不能包含特殊字符) | 开发者给自己的用户分配的唯一标志(对应自己的每一个用户) |
Loc | 非必须 | 1-30 | 北京市中关村 | 位置信息,请求跟地理位置相关的内容时使用,编码方式 UTF-8 |
返回数据格式
Code | 说明 |
100000 | 文本类 |
200000 | 链接类 |
302000 | 新闻类 |
(1)文本类
字段 | 说明 |
Code | 文本类表示码 |
Text | 结果 |
(2)链接类
字段 | 说明 |
Code | 文本类表示码 |
Text | 提示语 |
url | 链接地址 |
(3)新闻类
字段 | 说明 |
Code | 文本类表示码 |
Text | 提示语 |
List | 信息列表 |
List>article | 列表中具体数据的新闻标题 |
List>source | 列表中具体数据的新闻来源 |
List>icon | 列表中具体数据的新闻图片 |
List>detailurl | 列表中具体数据的新闻详情链接 |
详细内容可以参考:http://www.tuling123.com/doc/download/API-Guide