今天一起来看看 NoneBot 这个工具,来编写 QQ 机器人。
”如果我们在人生中体验的每一次转变都让我们在生活中走得更远,那么,我们就真正的体验到了生活想让我们体验的东西。“
”If every unfolding we experience takes us further along in life, then, we are truly experiencing what life is offering.“
安装基础软件
一、安装 NoneBot 库
直接使用 pip 安装即可
1pip install nonebot
二、安装酷Q 软件和 HTTP API 插件
酷Q 软件可以直接到官网下载,https://cqp.cc/b/news,或者可以到网盘下载,链接: https://pan.baidu.com/s/19l4IdTLi9__BhkboOcYP-g 提取码: b6er
HTTP API 插件,同样可以到官网下载,https://cqhttp.cc/docs/4.8/,如果下载有问题,可以到这个网盘下载,链接: https://pan.baidu.com/s/1h4oROjCu88HSbDloKSUGSw 提取码: cccf
下载好酷Q 软件后,解压缩,目录如下图:
首先将下载好的 HTTP API 插件放到 app 目录下,然后双击 CQA.exe 文件,输入机器人对应的 QQ 号和密码,登陆之后,在应用管理中,启动 HTTP API 插件。
三、配置 HTTP API 插件
进入酷Q 的 data/app/io.github.richardchien.coolqhttpapi/config/ 目录,有一个.json 的文件,user-id 为刚刚登陆的 QQ 号。修改这个文件的如下配置
1{ 2 "ws_reverse_api_url": "ws://127.0.0.1:8080/ws/api/", 3 "ws_reverse_event_url": "ws://127.0.0.1:8080/ws/event/", 4 "use_ws_reverse": true 5}
开始历史性的对话
先给出 nonebot 的官方文档地址:https://none.rclab.tk/guide/getting-started.html,感兴趣的同学也可以去官网查看。
下面我们先跑一下官网上的基础例子,
1import nonebot 2 3 4if __name__ == "__main__": 5 nonebot.init() 6 nonebot.load_builtin_plugins() 7 nonebot.run(host='127.0.0.1', port=8080)
运行该程序,我们可以在控制台看到如下日志:
1[2019-04-05 19:31:18,281 nonebot] INFO: Succeeded to import "nonebot.plugins.base" 2[2019-04-05 19:31:18,281 nonebot] INFO: Running on 127.0.0.1:8080 3Running on https://127.0.0.1:8080 (CTRL + C to quit) 4[2019-04-05 19:31:18,282] ASGI Framework Lifespan error, continuing without Lifespan support 5[2019-04-05 19:31:18,283 nonebot] INFO: Scheduler started 6[2019-04-05 19:31:20,490] 127.0.0.1:6568 GET /ws/api/ 1.1 101 - 2987 7[2019-04-05 19:31:20,493] 127.0.0.1:6569 GET /ws/event/ 1.1 101 - 1154
可以看到现在程序运行在了本地的 8080 端口,而且本地的 6568 和 6569 端口也连接到了本服务,就是我们在 HTTP API 插件的配置文件中做的配置
1 "ws_reverse_api_url": "ws://127.0.0.1:8080/ws/api/", 2 "ws_reverse_event_url": "ws://127.0.0.1:8080/ws/event/",
现在我们向这个机器人账号发送下消息
1/echo 你好
在控制台可以看到日志如下:
1[2019-04-05 19:37:59,614 nonebot] INFO: Self: 3412355667, Message 56 from 736552883: /echo 你好 2[2019-04-05 19:37:59,614 nonebot] DEBUG: Parsing command: /echo 你好 3[2019-04-05 19:37:59,614 nonebot] DEBUG: Matched command start: / 4[2019-04-05 19:37:59,614 nonebot] DEBUG: Split command name: ('echo',) 5[2019-04-05 19:37:59,614 nonebot] DEBUG: Command ('echo',) found, function: <function echo at 0x040DB2B8> 6[2019-04-05 19:37:59,614 nonebot] DEBUG: New session of command ('echo',) created 7[2019-04-05 19:37:59,615 nonebot] DEBUG: Running command ('echo',) 8[2019-04-05 19:37:59,738 nonebot] DEBUG: Session of command ('echo',) finished 9[2019-04-05 19:37:59,739 nonebot] INFO: Message 56 is handled as a command
同时我们的机器人账号也自动回复了“你好”给我们。
真实“历史性”的时刻!!
增强机器人功能之配置文件
增加 config.py 文件,输入内容如下:
1from nonebot.default_config import * 2 3 4SUPERUSERS = {123456} 5COMMAND_START = {'', '/', '!', '/', '!'} 6HOST = '0.0.0.0' 7PORT = 8080
SUPERUSERS:是配置一个超级 QQ 用户,我们可以为这个超级用户配置一些特殊的操作;
COMMAND_START:是配置命令起始字符,我们增加了空字符串,所以不需要任何起始字符也能调用命令;
另外就是配置了 host 和 端口 port。
然后我们就可以修改原来的文件为:
1import nonebot 2import config 3 4 5if __name__ == "__main__": 6 nonebot.init(config) 7 nonebot.load_builtin_plugins() 8 nonebot.run()
下面我们就可以编写自己的命令了。
增强机器人功能之编写命令
这里要注意的是,所有的语法都是 asyncio 异步编程,需要了解简介的,可以查看这里。
获取每日一句
我们使用金山词霸的 API 获取每日一句内容,http://open.iciba.com/dsapi/
1def get_content(): 2 url = 'http://open.iciba.com/dsapi/' 3 res = requests.get(url) 4 content_e = res.json()['content'] 5 content_c = res.json()['note'] 6 return [content_c, content_e]
这样就获取到一个”每日一句“的列表了。
编写自己的插件
创建一个 plugins 文件夹,在里面创建 daily.py 文件,编写如下代码
1from nonebot import on_command, CommandSession 2from utils import getdata 3 4 5@on_command('daily', aliases=('每日一句',)) 6async def daily(session: CommandSession): 7 daily_send = await get_daily() 8 await session.send(daily_send[0]) 9 await session.send(daily_send[1]) 10 11 12async def get_daily(): 13 daily_sentence = getdata.get_content() 14 return daily_sentence
使用 on_command 装饰器声明一个命令处理器,声明两个命令,分别是 ”daily“ 和 ”每日一句“,当用户向本机器人发送这两个命令时,就会自动调用 daily 这个函数,并且发送对应的消息。
而 get_daily 函数,就是调用金山词霸的 API 函数,来获取内容。
最后修改主文件内容,加载自己编写的插件
1import nonebot 2import config 3from os import path 4 5 6if __name__ == "__main__": 7 nonebot.init(config) 8 nonebot.load_plugins(path.join(path.dirname(__file__), 'plugins'), 'plugins') 9 nonebot.run()
接下来我们测试一下这个简单的机器人效果如何
看起来效果还不错,哈哈哈,以后再慢慢增加更加强大的功能吧。