侧边栏壁纸
博主头像
Xrala的窝 博主等级

土豆和玉米真是世间珍宝...

  • 累计撰写 1 篇文章
  • 累计创建 3 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

v1.0(旧版)堆堆的组成部分

拉拉
2024-12-27 / 0 评论 / 2 点赞 / 102 阅读 / 0 字

Nonebot-DuiDui

项目地址跳转👉Xrala/Nonebot-DuiDui: 堆堆的配置组成

基于python语言开发的机器人框架Nonebot2开发修改

直达nonebot2项目👉GitHub - nonebot/nonebot2: 跨平台 Python 异步聊天机器人框架 / Asynchronous multi-platform chatbot framework written in Python

参考nonebot文档👉NoneBot

推荐Linux桌面环境配置

算是Nonebot2的插件,所以仅针对NTQQ的LLOnebot使用反向ws连接适配我个人的使用环境是Linux Mint桌面版(基于Ubuntu的发行版)+Linux桌面版NTQQ+LLOnebot

实际写的和史一样,运行起来估计也会遇到较多问题,所以更大的作用还是留档和功能思路参考纯看看(~o ̄口 ̄)~

功能概览

1、配置集中管理

所有配置项从 .env 文件中读取,并集中在 config.py 文件中管理。各模块从 config.py 中获取配置项,优化了配置的管理和使用逻辑。

反向websocket地址是 ws://localhost:8080/onebot/v11/ws

2、AI聊天

使用触发词 "堆堆" 调用 ChatGPT 进行对话。当在群聊中输入 "堆堆+消息内容" 时,触发 ChatGPT 的角色扮演功能,并根据历史对话生成上下文。

通过命令 oachat 实现 AI 对话功能,能根据群聊历史记录和用户输入生成上下文,调用 OpenAI API 获取回复。

Ai对话效果

3、消息队列(非真异步)

严格区分私聊和群聊的功能,确保消息队列和数据库分别处理私聊和群聊的消息。

私聊和群聊分别创建独立的数据库文件夹,私聊使用用户ID命名数据库文件,群聊使用群聊ID命名数据库文件。

为每个私聊和群聊创建独立的异步(携程)安全消息队列。使用环形缓冲区实现消息队列,支持高效的消息存取操作。

新消息加入队列时,可设置最大容量 max_size(默认为30条)后自动移除最旧的消息,接受的新消息收入消息队列的同时也更新至数据库内。

私聊存储表单包含:时间戳、BOT自身的ID+用户名、聊天类型与走向+群聊ID(如果有)、用户号码+用户名、消息内容。

群聊存储表单包含:时间戳、BOT自身的ID+用户名、聊天类型与走向+群聊ID、用户号码+用户名、消息内容。

4、聊天记录数据库

每个群组的聊天记录内容通过消息队列进行读写,将聊天记录内容整合为时间戳+字符串的形式,存储在 aiosqlite 异步数据库中,并且使用较为标准的规范(群号+数值)就可以调用对应群组记录在内的聊天记录内容,并以最新时间为准往后获取,并且还存有其他接口,以便更多的读写删改等扩展。

5、记录 bot 发送的消息

在 AI 回复消息后,将 bot 自身发送的消息记录到队列和数据库。确保记录的信息包括时间戳、bot 的 QQ 号以及昵称。

6、识图功能

接收到群聊中的图片消息后,下载图片并以时间命名到本地缓存,并上传到Cloudflare的识图模型 API 进行识图。

识图完成后,将图片描述替换原消息的图片 URL 数据,格式化为 [image: 描述内容] 并加入消息队列,并由消息队列存入数据库。

定期清理缓存图片,每隔600秒自动清理过期缓存。

7、对话冷却

设定了一个针对群组或用户为单位的冷却系统,在某个人/某个群触发 AI 对话之后,在 AI 请求期间无法再次被群/用户触发,只有在得到 AI 返回结果后解除冷却,同时设定了 bot 主人 2246727592 不受影响。

8、时间戳格式化

将时间戳格式化为可读的日期时间格式(例如 2024-06-22 23:46:58),以便在日志和消息记录中更直观地查看消息的发送时间。

9、AI 输出内容的分段发送

AI 回复内容可以按照指定的分隔符(例如 [+])进行分段,并逐段发送。

每段发送之间会有一个随机的延迟,延迟时间范围可以设定(例如500-3000毫秒),以模拟真人打字的效果。

分段前的完整消息会先记录到消息队列和数据库中。

分段发送示例

10、引用消息处理

支持处理引用消息(包括图片和文字),引用消息包含原始发送者信息、时间等,格式化为 [引用消息] [时间戳] [用户名 (用户ID)]: 消息内容 的形式,并添加到对话的上下文中。

对于引用的图片消息,使用现有的 image_to_text 功能进行处理,将结果加入消息队列和上下文中。

对于引用的文字消息,直接提取文字内容并加入消息队列和上下文中。

11、组合消息处理

支持处理同时包含文字和图片的组合消息。在触发 AI 对话之前,先将图片转换为文字,然后将完整的消息内容传递给 AI。

12、清除记录功能

清除全部记录:通过指令 清除全部记忆 清除某个群内在数据库中的所有消息记录,并重新加载消息队列。

清除一定数量记录:通过指令 清除记忆X条 清除数据库中最新的 X 条消息记录,并重新加载消息队列。

13、ai主动屏蔽用户

支持检测ai返回的特定内容中存在的固定屏蔽指令语句:(r"\[屏蔽(\d+)\s+(\d+)(秒|分钟|小时)\]"),

ai可以自主决定屏蔽指定用户任意时间,例如:[屏蔽12345678 999分钟]anything,当用户被屏蔽时,其无法再触发ai对话,发送的如何消息也都不会被message_queue消息队列记录。

14、已屏蔽用户总览列表

通过指令 /屏蔽列表,bot 可以将当前已被屏蔽的用户一一排列出来,并展示当前剩余的屏蔽时间,单位使用时/分/秒。

15、bot 主人可用的主动屏蔽/取消屏蔽指令

bot 主人 2246727592 可以使用指令 /屏蔽 用户ID 时间(秒/分钟/小时) 来主动屏蔽一位用户。

通过指令 /解除屏蔽 用户ID 来主动取消对一位用户的屏蔽,并且有指令使用成功的提示。

挑选土豆的堆堆

385792404-090bcf11-4509-46b9-8d40-b65e21f21f63.jpg

2

评论区