Skip to content

LuoGu14514/nahida-bot

 
 

Repository files navigation

Nahida Bot

Avatar

这是摩诃善法大吉祥智慧主,智慧之神布耶尔,须弥的草神大人,你敢和她对视五秒吗?

这是一个应群友要求做的 QQ 机器人,基于 nonebot2

功能

  • 基础功能
  • 自动批准加好友/加群申请
  • pixiv搜索
    • AI 设置
    • Token Pool
    • Related pic
    • 搜索标签统计
  • 漫画搜索下载
  • 基于 OpenAI 兼容平台 API 的纯文本对话
    • 基础功能
    • 持续化记忆
    • 模型设置
    • 长期记忆筛选
  • 权限控制
    • Bug: 权限查询失败
  • 心跳包
  • 并发处理
    • Pixiv 异步下载
    • OpenAI API 异步处理
  • Bug: 日志处理
  • 基于 StableDiffusion 的图像生成基于大香蕉 / Qwen-Image 的图像生成
  • 搜图
  • 星图数据库
  • 消息总结
  • B 站视频自动解析与总结

运行

本项目的包管理器已经迁移至 uv ,直接按照 uv 项目常见的方式运行 bot.py 即可。

使用

以下所有命令开头的 ! 均可替换为 /。可选参数用 [] 表示,不可选的用 <> 表示。

OpenAI

:设置机器人的``。该设置在当前会话生效。

  • !clear_memory: 清除记忆。
  • !reset_prompt: 重置prompt并清除记忆。
  • !show_prompt: 查看当前 prompt
  • !get_models: 查看当前可用的模型。
  • !current_model: 查看当前使用的模型。
  • !set_model <model>: 设置当前使用的模型。

Pixiv

  • !setu [xN] [sN] [r18] [ban-ai]: 获取推荐图片。
  • !setu [xN] [sN] [r18] [ban-ai] <tags/tag> tag1 tag2: 获取指定标签的图片。
  • !pxrelated [xN] [sN] [r18] [ban-ai] <id>: 获取与指定 id 相关的图片。

随机发言插件说明

本插件让机器人能够在群聊中主动、随机地发言,模拟真人活跃。它会根据群聊的活跃程度动态调整发言概率和频率,既能在热闹的群里多说话,也能在冷清的群里保持安静。


快速开始

启用/禁用

在目标群聊发送以下命令(无需@机器人):

  • /randspeaker on —— 开启本群的随机发言
  • /randspeaker off —— 关闭本群的随机发言

状态会永久保存,重启机器人也不会丢失。


它是怎么工作的?

机器人有一个全局定时任务,每次任务执行时会遍历所有开启了本功能的群,对每个群独立计算“今天要不要说话”。计算完成后,再根据是否有活跃群来安排下一次任务的时间。

每次任务中的判定流程(每个群单独计算)

  1. 检查最近消息
    如果群里最近20条消息缓存为空,则跳过该群(不发言)。

  2. 冷却惩罚
    如果机器人在最近1小时内已经在这个群说过话,那么发言概率减半(×0.5)。

  3. 消息过少惩罚
    如果该群的消息缓存总数少于5条,发言概率直接归零(不说话)。

  4. 活跃奖励
    如果该群最近5分钟内其他成员发送的消息超过10条,视为“活跃群”,发言概率提高20%(×1.2,最高不超过1.0)。

  5. 无人互动惩罚
    如果机器人上次发言后,群里再也没有其他人说过话,发言概率直接归零(不说话)。

  6. 随机决定
    经过以上加减分后得到最终概率(例如0.36),然后掷骰子:如果随机数小于该概率,就真的发言。

  7. 发言

    • 调用OpenAI,根据最近聊天记录生成一条自然回复。
    • 记录本次发言时间,重置“无人互动”标记,并清空该群的消息计数器。

动态缩短机制(让活跃群反应更快)

除了定时任务本身,本插件还有一个“加速器”:

  • 每一条其他成员发送的消息,都会尝试把下一次全局任务的时间提前一半(如果剩余时间大于30秒)。
  • 没有频率限制,消息越多,任务就执行得越快,机器人就能更快地响应热闹的群聊。

奖励与惩罚一览表

类型 触发条件 效果
冷却惩罚 机器人1小时内已在本群发言 发言概率 ×0.5
消息过少惩罚 群消息缓存总数 < 5条 概率归零(不发言)
无人互动惩罚 上次发言后,无人再发新消息 概率归零(不发言)
活跃概率奖励 5分钟内其他成员消息 ≥10条 发言概率 ×1.2(上限1.0)
活跃间隔奖励 本次任务中至少有一个群活跃 下次任务间隔缩短50%(不低于30秒)
动态缩短 每收到一条其他成员消息 将下次任务剩余时间减半(>30秒时生效)

配置参数(可自行调整)

以下常量定义在插件代码顶部,你可以按需修改:

参数 含义 默认值
MIN_INTERVAL 基础最小间隔 30分钟
MAX_INTERVAL 基础最大间隔 2小时
MAX_HISTORY_PER_GROUP 每个群缓存的最大消息数 100条
ACTIVE_WINDOW 活跃判断的时间窗口 5分钟
ACTIVE_MSG_COUNT 活跃判断的消息阈值 10条
ACTIVE_PROB_BONUS 活跃概率奖励倍数 1.2
ACTIVE_INTERVAL_BONUS 活跃间隔奖励倍数 0.5
MIN_INTERVAL_ACTIVE 活跃群的最短间隔 30秒

数据存储

  • 各群的启用状态保存在 data/random_speaker/state.json 文件中。
  • 消息缓存保存在内存中,重启后会重新积累。

注意事项

  • 需要正确配置 OpenAI 相关参数(OPENAI_API_URLOPENAI_API_TOKENOPENAI_MODEL_NAME),否则无法生成回复。
  • 机器人只会监听和缓存开启了本功能的群的消息,未开启的群不受影响。
  • 命令 /randspeaker 无需 @机器人,直接发送即可。

配置

由于 nonebot 不知为何加载 .env 文件有延迟,因此我们选择使用一个额外的 config.json 文件来配置。这个文件的路径可以在 .env 文件中配置。

配置文件已经全面迁移到 config.yaml ,其中形如 ${CUSTOM_CONFIG_KEY} 的内容会从环境变量或 .env 中读取。 nonebot 所需要的配置项仍然必须写在 .env 中,其它的配置项则写在 config.yaml 中。

PixivBot

你需要通过 gppt 包来获取 pixiv 的 refresh_token,这个包需要使用 ChromeDriver。所以请确保你已经安装了 Chrome

由于 pixiv 可能会有 reCAPTCHA 验证,因此你需要修改 gppt 包中的一个 timeout 参数。具体参考gppt 问题 #183

此外,你也可以使用根目录的 get_token.py 来获取 token

##许可证

随心所欲,想干什么就干什么。

About

Just a simple QQ Bot based on Onebot API

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Python 100.0%