初识PyQQbot
QQBot 是一个用 python 实现的、基于腾讯 SmartQQ 协议的简单 QQ 机器人,可运行在 Linux 和 Windows 平台下,所有代码均集成在一个 [qqbot.py][code] 文件中,代码量仅 400 多行(不包括注释)。程序采用单线程的方式运行,且尽可能的减少了网络和登录错误(特别是所谓的 103 error )发生的概率。
PyQQbot的github项目地址为:
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 会自动回复: “QQBo” 。(注: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 me : QContact对象,消息发送者
l me : str 对象,消息发送成员的 uin,仅在该消息为 群/讨论组 消息时有效
l me : str 对象,消息发送成员的昵称,仅在该消息为 群/讨论组 消息时有效
l me : str 对象,消息内容
QQMessage 对象还提供一个 Reply 接口,可以给消息发送者回复消息,如:
me('你好,我是QQ机器人') # 相当于 bot.SendTo(me, '你好,我是QQ机器人')
me 是一个 QContact 对象,该对象有以下属性:
l con : str 对象,联系人类型,可以为 'buddy', 'group', 'discuss' ,代表 好友/群/讨论组
l con : str 对象,联系人的 uin ,底层发消息要使用本数值,每次登录本数值可能会改变
l con : str 对象,联系人的 qq
l con : str 对象,联系人的名称
l con : str 对象,好友的昵称
l con : str 对象,好友或群的备注名
l con : dict 对象,群或讨论组的成员字典
还提供一个 GetMemberName 接口,可以通过成员的 uin 查询成员的网名:
con(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'):
re(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 客户端会一直等待此回复消息。
图灵机器人
中文语境下智能度最高的机器人大脑图灵机器人
接下来解释大家自由发挥的时间了
在页面的最下面有个api接入,这是我们需要用到的内容。我们要使用这个api,来智能化我们之前私人订制的qq聊天机器人。
Python代码如下所示
请求方式
(1)接口地址
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 | 列表中具体数据的新闻详情链接 |
详细内容可以参考:doc/download/API-Guide