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 来主动取消对一位用户的屏蔽,并且有指令使用成功的提示。
挑选土豆的堆堆
评论区