QQ机器人——基于python以及qqbot模块

 

由于腾讯停止了网页qq的支持,qqsmart协议不再有效,qqbot也无法运行,作者也停止维护,大家可以使用coolq或者自己研究基于安卓协议的qq机器人

 

一.介绍

 首先放上qqbot模块的github地址:https://github.com/pandolia/qqbot

 qqbot模块是基于smartqq协议的,用python完成的模块

 本文主要提供qq机器人的实现,以及引入图灵机器人,对于qqbot模块的安装以及基本应用不做说明。

二.开始配置(以下内容来自开发文档)       

实现自己的 QQ 机器人非常简单,只需要定义一个自己的消息响应函数并按插件加载。示例代码:

# -*- coding: utf-8 -*-

def onQQMessage(bot, contact, member, content):
    if content == '-hello':
        bot.SendTo(contact, '你好,我是QQ机器人')
    elif content == '-stop':
        bot.SendTo(contact, 'QQ机器人已关闭')
        bot.Stop()

注意,上面注册的响应函数的函数名必须为 “onQQMessage” ,函数参数也必须和上面的一致。

将以上代码另存为 sample.py (注意保存为 utf8 编码的文件)。放到 ~/.qqbot-tmp/plugins/ 目录下( ~ 代表用户主目录, win7 下为 C:\Users\xxx ),或系统中可以 import 到的目录下(如 python 的安装目录下的 Lib/site-packages 目录)。

之后,保持前面的 qqbot 进程运行,在另一个控制台输入 qq plug sample ,则可将此文件中的 onQQMessage 函数注册到 QQBot 的相应事件上去。此时,用另外一个 QQ 向本 QQ 发送消息 “-hello”,则会自动回复 “你好,我是 QQ 机器人”,发送消息 “-stop” 则会关闭 QQ 机器人。

在控制台输入 qq unplug sample 可以卸载此插件及相应的回调函数。可以同时加载多个插件,此时各插件中的相应函数会依次被调用(但调用顺序和加载次序无关)。

QQBot 开始运行后,每收到一条 QQ 消息,会将消息来源、消息内容以及一个 QQBot 对象传递给已注册的消息响应函数。其中:

bot     : QQBot 对象,提供 List/SendTo/Stop/Restart 等接口,详见本文档第五节
contact : QContact 对象,消息的发送者,具有 ctype/qq/uin/nick/mark/card/name 等属性
member  : QContact 对象,仅当本消息为 群消息或讨论组消息 时有效,代表实际发消息的成员
content : str 对象,消息内容

contact 代表消息发送者,其 ctype 属性可以为 buddy/group/discuss ,代表 好友/群/讨论组 对象,表示本消息是 好友消息/群消息/讨论组消息 。

member 仅当本消息为 群消息或讨论组消息 时有效,代表实际发消息的成员,它的 ctype 属性可以为 group-member/discuss-member ,代表 群成员/讨论组成员 对象。当本消息为 好友消息 时, member 等于 None 。

contact 和 member 都是 QContact 对象,不同类型的 QContact 对象所具有的属性含义见: qcontact-attr 。注意所有 QContact 对象都是 只读对象 ,只能读取它的属性,不能设置它的属性,也不能向它添加额外的属性。

可以调用 QQBot 对象的 SendTo 接口向 QContact 对象发送消息,但要注意:只可以向 好友/群/讨论组 发消息, 不可以向 群成员/讨论组成员 发送消息 。也就是说,只可以调用 bot.SendTo(contact, 'xxx') , 不可以调用 bot.SendTo(member, 'xxx') 。

三.升级机器人

1.我们可以按照上述范例添加回复,比如:

if content == 'hello':
    bot.SendTo(contact, 'hello')

2.或者针对某个对象:

if contact.name == "xxx":
    bot.SendTo(contact, 'hello')

3.同理,可以讲上述两种情况合并,利用and语句实现特定角色特定语句特定回复

4.设置一个时间阈值,用来确保机器人不会一直被触发,从而实现每间隔多少市场才可以触发

   这儿利用的是一个非常低效的方法,即记录当前时间并写入

# 打开文件,获取上次记录时间
    time_value = 60
    with open(file) as t1:
        last_time = float(t1.read())
    # 用当前时间减去记录时间得出间隔时间
    interval_time = time.time() - last_time

    if bot.isMe(contact, member):
        print('自己人,别开枪')
    else:
        # 如果间隔时间超过阈值则输出,没超过则不进行操作
        if content == '你好' and interval_time > time_value:
            bot.SendTo(contact, '你好')
            with open(file, "w") as t2:
                t2.write(str(time.time()))

此处将时间写入txt文件中储存,并调用了bot.isMe方法来确认是否是机器人自己说的话

5.接入图灵机器人,至于如何开通图灵机器人并设置在此就不赘述了

def tuling(infomation):
    url_api = "http://www.tuling123.com/openapi/api"
    data = {
        'key': '你的机器人的key',
        'info': infomation,
    }
    m = requests.post(url_api, data=data).json()
    if m.get('code') == 100000:
        return m.get('text')

其中字典中key的内容用你配置好的图灵机器人的apikey,information则是你传进去的content

切记此处的url_api,我使用的是api1,现在图灵机器人推出了api2,但是它传输的数据很多,就放弃了api2

 

 

发布了26 篇原创文章 · 获赞 26 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/IOT_player/article/details/81330549