1. NoneBot2 安装与使用
NoneBot2 是一个现代、跨平台、可扩展的 Python 聊天机器人框架(下称 NoneBot),它基于 Python 的类型注解和异步优先特性(兼容同步),能够为你的需求实现提供便捷灵活的支持。同时,NoneBot 拥有大量的开发者为其开发插件,用户无需编写任何代码,仅需完成环境配置及插件安装,就可以正常使用 NoneBot。
参考:
- ★★★ nonebot2聊天机器人插件9:定时提醒器timing
- NoneBot总结
- ★★ 爆肝将近 5 万字使用 Python 本地端、服务器端搭建 QQ 智能聊天机器人(新手教程)
1) NoneBot2的安装与配置
脚手架安装(官方推荐)
安装完成后可以用固定的机器人
pip install nb-cli
- 一键创建项目
nb create
根据快速上手进行一系列配置后可以让项目跑起来
nb run
这一步只要没有报错就行,暂时看不到图示里提到的机器人,直接看下一步手动创建项目,添加一个ConsoleAdapter后就可以在终端看到一个和机器人的交互界面
- 手动创建项目
- 安装 nonebot2 以及驱动器
pip install 'nonebot2[fastapi]'
- 安装适配器
pip install nonebot-adapter-console
可以在一键创建项目的目录下新建一个 bot.py 文件,写入
import nonebot
from nonebot.adapters.console import Adapter as ConsoleAdapter # 避免重复命名
# 初始化 NoneBot
nonebot.init()
# 注册适配器
driver = nonebot.get_driver()
driver.register_adapter(ConsoleAdapter)
# 在这里加载插件
nonebot.load_builtin_plugins("echo") # 内置插件
# nonebot.load_plugin("thirdparty_plugin") # 第三方插件
# nonebot.load_plugins("awesome_bot/plugins") # 本地插件
if __name__ == "__main__":
nonebot.run()
然后运行机器人
python bot.py
可以在终端中得到一个可交互的机器人接口
安装 NoneBot OneBot 适配器
使用 pip
pip install nonebot-adapter-onebot
2) 关键词触发命令
on_command
最简单的事件响应器,给机器人发送指定的消息,机器人回复指定的消息。
from nonebot import on_command
from nonebot.rule import to_me
from nonebot.adapters import Message
from nonebot.params import CommandArg
# 事件响应器
weather = on_command("天气", rule=to_me(), aliases={"weather", "查天气"}, priority=10, block=True)
# 事件处理
@weather.handle()
async def handle_function(args: Message = CommandArg()):
# 提取参数纯文本作为地名,并判断是否有效
if location := args.extract_plain_text():
await weather.finish(f"今天{location}的天气是...")
else:
await weather.finish("请输入地名")
3) 发送私聊消息/群消息
参考:nonebot2聊天机器人插件9:定时提醒器timing
from nonebot import get_bots
bot, = get_bots().values()
# 发送一条群聊信息
await bot.send_msg(
message_type="group",
# 群号
group_id=12345678,
message='这是一条群聊信息'
)
# 发送一条私聊信息
await bot.send_msg(
message_type="private",
# 私聊用户QQ号
user_id=12345678,
message='这是一条私聊信息'
)
4) 发送文本和图片
发送文本+本地图片(参考:nonebot2聊天机器人插件9:定时提醒器timing)
from nonebot import get_bots
from nonebot.adapters.onebot.v11 import MessageSegment
img_path = 'file:///' + os.path.split(os.path.realpath(__file__))[0] + '/img/' # 当前脚本目录下的 img 文件夹内
def send_img(img_name):
global img_path
return MessageSegment.image(img_path + img_name)
bot, = get_bots().values()
await bot.send_msg(
message_type="group",
# 群号
group_id=12345678,
message='这是一条群聊信息' + send_img('三点饮茶.gif')
)
5) APScheduler 定时任务
APScheduler (Advanced Python Scheduler) 是一个 Python 第三方库,其强大的定时任务功能被广泛应用于各个场景。在 NoneBot 中,定时任务作为一个额外功能,依赖于基于 APScheduler 开发的 nonebot-plugin-apscheduler 插件进行支持。
安装插件
nb plugin install nonebot-plugin-apscheduler
使用插件
nonebot-plugin-apscheduler 本质上是对 APScheduler 进行了封装以适用于 NoneBot 开发,因此其使用方式与 APScheduler 本身并无显著区别。
调度器
由于 nonebot_plugin_apscheduler 作为插件,因此需要在使用前对其进行加载并导入其中的 scheduler 调度器来创建定时任务。
from nonebot import require
require("nonebot_plugin_apscheduler")
from nonebot_plugin_apscheduler import scheduler
# cron 的意思是每天的 18:35:40 发消息
# interval 的意思是每隔多少时间,参数是 hours, minutes, seconds(带s)
@scheduler.scheduled_job("cron", hour=18, minute=35, second=40)
async def timer_task():
# 获取 bot 信息
(bot, ) = nonebot.get_bots().values()
msg = f"测试消息"
await bot.send_group_msg(group_id=642122283, message=msg)
安装后可能遇到报错,无法调用:
- 解决方案一:记录解决nonebot2中定时器报时区问题的错误
- 直接在源码的源码中进行修改
- 解决方案二:nonebot_plugin_apscheduler错误,无法加载插件
- 读取 env 环境变量,nonebot 项目目录有 .env 文件配置环境变量
APSCHEDULER_AUTOSTART=true APSCHEDULER_CONFIG={"apscheduler.timezone": "Asia/Shanghai"}
2. 配合LLOneBot
LiteLoaderQQNT 插件,实现 OneBot 11 协议,用以 QQ 机器人开发
评价:这个比较适合新手入门,因为是直接嵌入的插件,配置比较容易,如果可以完成这一步的配置,再去用 NapCatQQ这个无头的QQNT就会方便得多
- LLOneBot仓库
- LLOneBot快速开始
1) 安装 QQNT
去QQ官网下载最新版的QQ(现在都是QQNT的框架)
2) 安装 LiteLoaderQQNT
脚本一键安装
3) 安装 LLOneBot
下载 LLOneBot 最新版本 解压放到 plugins
目录下,然后重启 QQ 即可
目录结构如下:
├── plugins
│ ├── LLOneBot
│ │ └── main/main.cjs
│ │ └── preload/preload.cjs
│ │ └── renderer/index.js
│ │ └── manifest.json
│ │ └── node_modules/...
4) 对接配置 NoneBot
这个直接根据 对接配置 来就可以
1. 配置 NoneBot
这里假设你已经安装了 Onebot 适配器
默认情况 NoneBot 是启用了反向 ws 的,可能是默认配置问题,需要配置 token 才能正常连接
修改 NoneBot 下的 .env 配置文件,添加 ONEBOT_ACCESS_TOKEN=你的token
,token 需要和 LLOneBot 配置的 token 一致
然后启用 NoneBot,可以看到 NoneBot 输出的端口号,如 8080
2. 配置 LLOneBot
在 LLOneBot 配置页面添加反向 WS 地址,地址为 ws://127.0.0.1:8080/onebot/v11/ws
, 这里的 8080
是 NoneBot 输出的端口号,/onebot/v11/ws
是 NoneBot onebot 适配器默认的路径
能启动的两个关键:
- LLOneBot 配置的 token 需要和 NoneBot 配置的 一致
- 反向ws端口(
ws://127.0.0.1:8080/onebot/v11/ws
)和 NoneBot 输出的端口号一致
3. 配合 NapCatQQ
NapCatQQ 是基于 PC NTQQ 客户端本体实现的 QQ Bot 框架,稳定安全,快速部署。
1. 安装与配置
参考快速上手:
Linux 脚本一键安装
curl -o napcat.sh https://fastly.jsdelivr.net/gh/NapNeko/NapCat-Installer@master/script/install.sh && sudo bash napcat.sh
参考 napcat.sh 脚本
运行命令为
echo -e "\n安装完成,请输入 xvfb-run -a qq --no-sandbox 命令启动。"
echo "保持后台运行 请输入 screen -dmS napcat bash -c \"xvfb-run -a qq --no-sandbox\""
echo "后台快速登录 请输入 screen -dmS napcat bash -c \"xvfb-run -a qq --no-sandbox -q QQ号码\""
echo "注意,您可以随时使用screen -r napcat来进入后台进程并使用ctrl + a + d离开(离开不会关闭后台进程)。"
xvfb-run -a qq --no-sandbox # 启动qq,并在终端中显示,如果关闭则会退出登录(第一次登录可以先用这个命令熟悉一下)
screen -dmS napcat bash -c "xvfb-run -a qq --no-sandbox" # 登陆后切换到后台
screen -dmS napcat bash -c "xvfb-run -a qq --no-sandbox -q QQ号码" # 在第一次登录,信任并授权电脑后,可以快速登陆你的账号
screen -r napcat # 可以进入napcat的后台进程,按ctrl + a + d离开不会关闭进程,按别的键 (ctrl+z或者ctrl+c)会结束进程
2. 对接配置 NoneBot
接入框架
参考基础配置
参考 napcat.sh 脚本可以找到安装位置为:/opt/QQ/resources/app/app_launcher/napcat
打开 NapCat 的 config
目录,找到名为 onebot11_<你的QQ号>.json
的文件,如 onebot11_1234567.json
;如果没有此文件可以复制 onebot11.json
重命名为 onebot11_<你的QQ号>.json
。
这个配置文档和LLOneBot的很像了,下面是配置内容参数解释:
{
"http": {
// 是否启用http服务, true为启动,false为禁用
"enable": false,
// HTTP服务监听的 ip 地址,为空则监听所有地址
"host": "",
// http服务端口
"port": 3000,
// http上报密钥,可为空
"secret": "",
// 是否启用http心跳
"enableHeart": false,
// 是否启用http上报服务
"enablePost": false,
// http上报地址, 如["http://127.0.0.1:8080/onebot/v11/http"]
"postUrls": []
},
"ws": {
// 是否启用正向websocket服务
"enable": false,
// 正向websocket服务监听的 ip 地址,为空则监听所有地址
"host": "",
// 正向websocket服务端口
// 当port与http服务port一致时,host也需与http服务host保持一致,否则可能会导致启动失败
"port": 3001
},
"reverseWs": {
// 是否启用反向websocket服务
"enable": false,
// 反向websocket对接的地址, 如["ws://127.0.0.1:8080/onebot/v11/ws"]
"urls": []
},
"GroupLocalTime": {
"Record": false,//是否开启本地群聊时间记录
"RecordList": []//开启全部群 ["-1"] 单个群配置 ["11111"] 多个群 ["1","2","3"]
},
// 是否开启调试模式,开启后上报消息会携带一个raw字段,为原始消息内容
"debug": false,
// ws心跳间隔,单位毫秒
"heartInterval": 30000,
// 消息上报格式,array为消息组,string为cq码字符串
"messagePostFormat": "array",
// 是否将本地文件转换为URL,如果获取不到url则使用base64字段返回文件内容
"enableLocalFile2Url": true,
// 音乐签名URL,用于处理音乐相关请求
"musicSignUrl": "",
// 是否上报自己发送的消息
"reportSelfMessage": false,
// access_token,可以为空
"token": ""
}
主要配置 reverseWs 和 token 这两个,参考 LLOneBot - 对接配置NoneBot 这一步