这是摩诃善法大吉祥智慧主,智慧之神布耶尔,须弥的草神大人,你敢和她对视五秒吗?
这是一个应群友要求做的 QQ 机器人,基于 nonebot2
- 基础功能
- 自动批准加好友/加群申请
- pixiv搜索
- AI 设置
- Token Pool
- Related pic
- 搜索标签统计
- 漫画搜索下载
- 基于 OpenAI 兼容平台 API 的纯文本对话
- 基础功能
- 持续化记忆
- 模型设置
- 长期记忆筛选
- 权限控制
- Bug: 权限查询失败
- 心跳包
- 并发处理
- Pixiv 异步下载
- OpenAI API 异步处理
- Bug: 日志处理
-
基于 StableDiffusion 的图像生成基于大香蕉 / Qwen-Image 的图像生成 - 搜图
- 星图数据库
- 消息总结
- B 站视频自动解析与总结
本项目的包管理器已经迁移至 uv ,直接按照 uv 项目常见的方式运行 bot.py 即可。
以下所有命令开头的 ! 均可替换为 /。可选参数用 [] 表示,不可选的用 <> 表示。
:设置机器人的``。该设置在当前会话生效。
!clear_memory: 清除记忆。!reset_prompt: 重置prompt并清除记忆。!show_prompt: 查看当前prompt。!get_models: 查看当前可用的模型。!current_model: 查看当前使用的模型。!set_model <model>: 设置当前使用的模型。
!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—— 关闭本群的随机发言
状态会永久保存,重启机器人也不会丢失。
机器人有一个全局定时任务,每次任务执行时会遍历所有开启了本功能的群,对每个群独立计算“今天要不要说话”。计算完成后,再根据是否有活跃群来安排下一次任务的时间。
-
检查最近消息
如果群里最近20条消息缓存为空,则跳过该群(不发言)。 -
冷却惩罚
如果机器人在最近1小时内已经在这个群说过话,那么发言概率减半(×0.5)。 -
消息过少惩罚
如果该群的消息缓存总数少于5条,发言概率直接归零(不说话)。 -
活跃奖励
如果该群最近5分钟内其他成员发送的消息超过10条,视为“活跃群”,发言概率提高20%(×1.2,最高不超过1.0)。 -
无人互动惩罚
如果机器人上次发言后,群里再也没有其他人说过话,发言概率直接归零(不说话)。 -
随机决定
经过以上加减分后得到最终概率(例如0.36),然后掷骰子:如果随机数小于该概率,就真的发言。 -
发言
- 调用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_URL、OPENAI_API_TOKEN、OPENAI_MODEL_NAME),否则无法生成回复。 - 机器人只会监听和缓存开启了本功能的群的消息,未开启的群不受影响。
- 命令
/randspeaker无需 @机器人,直接发送即可。
由于 nonebot 不知为何加载 .env 文件有延迟,因此我们选择使用一个额外的 config.json 文件来配置。这个文件的路径可以在
.env 文件中配置。
配置文件已经全面迁移到 config.yaml ,其中形如 ${CUSTOM_CONFIG_KEY} 的内容会从环境变量或 .env 中读取。 nonebot 所需要的配置项仍然必须写在 .env 中,其它的配置项则写在 config.yaml 中。
你需要通过 gppt 包来获取 pixiv 的 refresh_token,这个包需要使用 ChromeDriver。所以请确保你已经安装了 Chrome。
由于 pixiv 可能会有 reCAPTCHA 验证,因此你需要修改 gppt 包中的一个 timeout
参数。具体参考gppt 问题 #183。
此外,你也可以使用根目录的 get_token.py 来获取 token。
##许可证
随心所欲,想干什么就干什么。