首页 > Python资料 博客日记

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

2024-09-18 12:00:04Python资料围观118

Python资料网推荐Python聊天机器人-NoneBot2入门(2024新版)这篇文章给大家,欢迎收藏Python资料网享受知识的乐趣

1. NoneBot2 安装与使用

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

参考:

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

1) NoneBot2的安装与配置

脚手架安装(官方推荐)

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

pip install nb-cli
  1. 一键创建项目
nb create

根据快速上手进行一系列配置后可以让项目跑起来

nb run

这一步只要没有报错就行,暂时看不到图示里提到的机器人,直接看下一步手动创建项目,添加一个ConsoleAdapter后就可以在终端看到一个和机器人的交互界面

  1. 手动创建项目
  • 安装 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)

安装后可能遇到报错,无法调用:

2. 配合LLOneBot

LiteLoaderQQNT 插件,实现 OneBot 11 协议,用以 QQ 机器人开发

评价:这个比较适合新手入门,因为是直接嵌入的插件,配置比较容易,如果可以完成这一步的配置,再去用 NapCatQQ这个无头的QQNT就会方便得多

  1. LLOneBot仓库
  2. 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 适配器默认的路径

能启动的两个关键

  1. LLOneBot 配置的 token 需要和 NoneBot 配置的 一致
  2. 反向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 这一步


版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐