Python聊天机器人-NoneBot2入门(2024新版)

iteapoy 2024-10-02 12:35:01 阅读 94

1. NoneBot2 安装与使用

NoneBot2 是一个现代、跨平台、可扩展的 Python 聊天机器人框架(下称 NoneBot),它基于 Python 的类型注解和异步优先特性(兼容同步),能够为你的需求实现提供便捷灵活的支持。同时,NoneBot 拥有大量的开发者为其开发插件,用户无需编写任何代码,仅需完成环境配置及插件安装,就可以正常使用 NoneBot。

参考:

★★★ nonebot2聊天机器人插件9:定时提醒器timingNoneBot总结★★ 爆肝将近 5 万字使用 Python 本地端、服务器端搭建 QQ 智能聊天机器人(新手教程)

1) NoneBot2的安装与配置

脚手架安装(官方推荐)

安装完成后可以用固定的机器人

<code>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",code>

# 群号

group_id=12345678,

message='这是一条群聊信息'code>

)

# 发送一条私聊信息

await bot.send_msg(

message_type="private",code>

# 私聊用户QQ号

user_id=12345678,

message='这是一条私聊信息'code>

)

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",code>

# 群号

group_id=12345678,

message='这是一条群聊信息' + send_img('三点饮茶.gif')code>

)

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 即可

在这里插入图片描述

目录结构如下:

<code>├── 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 地址,地址为 <code>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 这一步



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。