一个基于 Koishi 的 QQ 机器人插件。核心功能是接入 sb6657.cn 烂梗站,附带若干群娱乐命令(俄罗斯轮盘赌、睡觉禁言)以及群管类被动监听器(复读禁言、刷屏禁言)。
需要 Node 24 版本
pnpm i # 安装依赖
pnpm build # 打包(输出到 dist/)在你自己的 Koishi 根目录下,external 文件夹内(如果没有就自己新建一个),建立 sb6657-bot 文件夹。
然后把项目里打包出来的 dist 文件夹,以及 package.json 文件都丢进去。
随后在你自己 Koishi 根目录的终端里,输入:
yarn add ./external/sb6657-bot本地安装上这个插件。
最后找到你自己 Koishi 项目的 koishi.yml 文件,在 plugins: 层级下面加上 sb6657-bot: {} 直接硬启用插件。
重启项目(比如说你是 Docker 就重启镜像)。
在 Koishi Web 管理端的插件配置里,找到 sb6657-bot 插件,按需配置并启用。
面板按功能分组,每个分组第一项都是 是否启用 开关,可单独开启 / 关闭而不影响其他功能。
所有功能的
enabled默认都是false:插件首次安装后所有指令和监听器都不会工作,需要在 Koishi 控制台手动逐项启用。
本插件包含两类功能:
- 主动命令:用户在群里输入对应指令触发
- 被动监听器:不需要用户主动调用,插件会监听群内消息自动触发
| 命令 | 别名 | 说明 | 是否需要群聊 |
|---|---|---|---|
搜烂梗 <关键词> |
搜 / search / meme |
根据关键词搜索 sb6657 烂梗站的梗 | 否 |
随机 |
随机烂梗 / 抽烂梗 / random |
随机抽一条烂梗 | 否 |
开枪 |
—— | 俄罗斯轮盘赌,运气不好就被禁言 | 是 |
睡觉 |
—— | 禁言自己一段时间,来次精致睡眠 | 是 |
投票禁言 <user:user> |
—— | 发起投票禁言某个用户,达到票数后执行禁言 | 是 |
投票解禁 <user:user> |
—— | 发起投票解禁某个用户,达到票数后执行解禁 | 是 |
| 名称 | 触发条件 | 禁言对象 |
|---|---|---|
| 🔁 复读禁言 | 同一条消息在频道内被连续重复 N 次 | 最后那个跟风复读的人 |
| 🚿 刷屏禁言 | 单个用户在滑动时间窗口内发送消息数达到阈值(频率),或在更长窗口内连续发送相同内容次数达到阈值(相同内容) | 刷屏那个用户 |
群聊限制说明:
开枪/睡觉以及两个被动监听器都依赖 QQ 禁言能力,只能在群聊中使用,且机器人需要具备群管权限。
群生效范围:两个被动监听器都支持单独配置
所有群/白名单/黑名单三种模式,可针对不同 QQ 群独立控制是否开启,避免"一开全开"。
所有配置项都在 Koishi Web 管理端按功能分组展示。以下分组 ↔ 功能一一对应:
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled |
boolean | false |
是否启用本指令 |
minInterval |
number | 1000 |
指令触发的冷却时间(毫秒) |
defaultMaxUsage |
number | 50 |
普通群友每天的默认搜索次数 |
customLimits |
array | [] |
VIP 用户的自定义次数白名单(可添加多条),每项含 userId 和 maxUsage |
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled |
boolean | false |
是否启用本指令 |
minInterval |
number | 1000 |
指令触发的冷却时间(毫秒) |
基础字段:
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled |
boolean | false |
是否启用本指令 |
minInterval |
number | 600 |
指令触发的冷却时间(毫秒) |
mode |
'probability' / 'sequence' |
'probability' |
游戏模式,两种模式互斥 |
每次开枪独立判定,中弹概率恒定;空枪后禁言时间叠加增长。
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
probability |
number (0-1) | 0.2 |
每次中弹概率 |
initTime |
number | 180 |
每轮初始禁言时间(秒),无上限 |
timeStepMin |
number | 60 |
空枪后叠加的最小时间(秒),无上限 |
timeStepMax |
number | 180 |
空枪后叠加的最大时间(秒),无上限 |
msgHit |
string | 见下 | 中弹文案 |
msgNewRound |
string | 见下(可清空,留空则不发) | 中弹后下一轮开始时追加的文案 |
msgMiss |
string | 见下 | 空枪文案 |
N 格弹巢中装 1 发子弹,每开一次减少一格,保证 N 枪内必定中弹。禁言时间固定。
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
chambers |
number | 6 |
弹巢总格数(N 格装 1 发),无上限 |
muteTime |
number | 300 |
中弹后禁言时间(秒),无上限 |
msgHit |
string | 见下 | 中弹文案 |
msgNewRound |
string | 见下 | 新一轮装填后追加的文案 |
msgMiss |
string | 见下 | 空枪文案 |
所有开枪文案都支持 {key} 占位符替换:
| 占位符 | 含义 | 适用模式 |
|---|---|---|
{at} |
艾特触发命令的用户 | 全部 |
{time} |
格式化后的时长,如 1分钟30秒 / 1小时5分钟 |
全部 |
{seconds} |
原始秒数 | 全部 |
{chamber} |
当前是第几枪(1-based) | 仅弹巢模式 |
{remaining} |
空枪后弹巢剩余格数 | 仅弹巢模式(msgMiss) |
{total} |
弹巢总格数 | 仅弹巢模式 |
默认文案:
- 概率模式 · 中弹:
钢铁般的左键,无解的直架!{at} 被杀死了! - 概率模式 · 新一轮:
加油吧{at} ,我们科隆major干回来。下一轮初始禁言时长为{time} - 概率模式 · 空枪:
先瞄准再空枪。{at} 恭喜你躲过一劫!禁言时间将增加到{time}! - 弹巢模式 · 中弹:
Bang!第{chamber}/{total}枪抽中了!{at} 被杀死了! - 弹巢模式 · 空枪:
{at} 咔哒——空的。弹巢剩余{remaining}/{total}格…… - 弹巢模式 · 新一轮:
弹巢重新装填完毕,共{total}格。
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled |
boolean | false |
是否启用本指令 |
minInterval |
number | 600 |
指令触发的冷却时间(毫秒) |
minSeconds |
number | 21600(6 小时) |
睡眠最短时长(秒),无上限 |
maxSeconds |
number | 28800(8 小时) |
睡眠最长时长(秒),无上限 |
msgSleep |
string | 见下 | 睡觉文案 |
文案占位符同"开枪通用占位符":{at} / {time} / {seconds}。
默认文案:{at} 好好睡觉,{time}后再醒来吧!
被动监听器。当同一条消息在频道内被连续重复 N 次,会禁言最后那条复读的人。
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled |
boolean | false |
是否启用本功能(关闭后不再监听) |
guildMode |
'all' / 'whitelist' / 'blacklist' |
'all' |
群生效范围:所有群 / 白名单 / 黑名单 |
guilds |
string[] | [] |
群号列表(白名单 / 黑名单模式下使用) |
minTimes |
number | 10 |
触发禁言所需的最少重复次数 |
muteSeconds |
number | 60(1 分钟) |
基础禁言时长(秒),无上限。实际 = 此值 × 随机倍率 |
maxDurationMultiplier |
number | 5 |
随机倍率上限(1 ~ 该值随机取整数) |
msgMute |
string | 见下 | 触发禁言时的提示文案 |
| 占位符 | 含义 |
|---|---|
{at} |
艾特触发用户 |
{time} |
本次禁言时长(格式化,如 5分钟 / 1小时5分钟) |
{seconds} |
本次禁言秒数 |
{times} |
触发所需重复次数(取自 minTimes) |
{baseSeconds} |
基础禁言秒数(取自 muteSeconds) |
{multiplier} |
本次随机倍率 |
默认文案:检测到复读,已禁言{time}
被动监听器。内置两个相互独立、互不干扰的计数器,按 群:用户 维度分别维护:
- 频率计数器(始终启用,受
enabled控制) 单个用户在windowSeconds秒内发送消息数达到threshold,触发禁言。 抓"短时间内连发"。 - 相同内容计数器(受
sameContentEnabled单独开关控制) 单个用户在sameContentWindowSeconds秒内连续发送同样内容的次数达到sameContentThreshold,触发禁言。一旦发了不同内容就会重置为新内容。 抓"间隔几秒就发一次同样内容"这种慢速刷屏 / 复读。
两个计数器同时工作,配置上互不影响。同一条消息若同时命中(极少见),只会触发优先判定的相同内容计数器,不会被同一条消息重复禁言两次。
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled |
boolean | false |
是否启用本功能(关闭后两个计数器都不工作) |
guildMode |
'all' / 'whitelist' / 'blacklist' |
'all' |
群生效范围:所有群 / 白名单 / 黑名单 |
guilds |
string[] | [] |
群号列表(白名单 / 黑名单模式下使用) |
windowSeconds |
number | 6 |
频率滑动时间窗口大小(秒),判定"最近 N 秒内" |
threshold |
number | 5 |
触发阈值:窗口内消息数达到该值即触发 |
muteSeconds |
number | 300(5 分钟) |
触发后禁言时长(秒),无上限 |
msgMute |
string | 见下 | 触发禁言时的提示文案 |
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
sameContentEnabled |
boolean | false |
是否启用相同内容检测(与频率计数器互不影响,可单独开关) |
sameContentWindowSeconds |
number | 300(5 分钟) |
相同内容滑动时间窗口大小(秒),无上限。一旦用户发送不同内容,本计数器会重置 |
sameContentThreshold |
number | 5 |
触发阈值:窗口内连续发送相同内容次数达到该值即触发 |
sameContentMuteSeconds |
number | 600(10 分钟) |
触发后禁言时长(秒),无上限 |
msgSameContentMute |
string | 见下 | 触发禁言时的提示文案 |
两个计数器的文案占位符同名,含义按各自计数器解释({count}、{threshold}、{window} 都取所属计数器的字段):
| 占位符 | 含义 |
|---|---|
{at} |
艾特触发用户 |
{time} |
本次禁言时长(格式化) |
{seconds} |
本次禁言秒数 |
{count} |
本次窗口内实际消息数 / 相同内容连续次数 |
{threshold} |
触发阈值(取自 threshold 或 sameContentThreshold) |
{window} |
窗口秒数(取自 windowSeconds 或 sameContentWindowSeconds) |
默认文案:
- 频率计数器 (
msgMute):{at} 刷屏了!{window}秒内发送了{count}条消息,禁言{time}冷静一下。 - 相同内容计数器 (
msgSameContentMute):{at} 刷屏了!{window}秒内连续发送了{count}条相同内容,禁言{time}冷静一下。
| 模式 | 行为 |
|---|---|
all(所有群) |
无论哪个群都生效,guilds 字段忽略(但填写内容会保留) |
whitelist(白名单) |
仅 guilds 列出的群生效 |
blacklist(黑名单) |
除 guilds 列出的群之外的群生效 |
复读禁言和刷屏禁言各自有独立的
guildMode/guilds,可以互不干扰地配置。
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled |
boolean | false |
是否启用投票禁言与解禁功能 |
guildMode |
'all' / 'whitelist' / 'blacklist' |
'all' |
群生效范围模式 |
guilds |
string[] | [] |
群号列表(白名单/黑名单模式下使用) |
muteNeedsVotes |
number | 5 |
禁言所需票数 |
unmuteNeedsVotes |
number | 5 |
解禁所需票数 |
muteSeconds |
number | 86400(24 小时) |
投票禁言时长(秒) |
enableUnmute |
boolean | false |
是否允许投票解禁非投票禁言的用户(如管理员手动禁言) |
- 投票禁言会实时查询目标当前是否已被禁言(不限来源),已禁言则禁止发起投票。
- 解禁投票默认只能解禁由本插件投票产生的禁言;若开启
enableUnmute,则可对任何被禁言用户发起解禁投票。- 群友输入指令时需使用群聊的 @ 功能(蓝色艾特),手打昵称无法识别,请参照提示。
- 每人在同一种投票中只能投一票,不能给自己投票,也不能投票禁言机器人。
- QQ 禁言上限:QQ 官方群禁言最长约 30 天。本插件不做配置上限(按需无限填写),但若传入超过官方允许的值,
muteGuildMember会抛错,插件会捕获并给出可读提示,不会直接崩溃。 - 权限:所有涉及禁言的功能(
开枪/睡觉/ 复读禁言 / 刷屏禁言)都依赖机器人的群管禁言权限,请确保机器人已被设置为管理员。 - 多群隔离:
开枪的游戏状态按群独立管理;复读禁言按子频道(cid)独立计数;刷屏禁言按群:用户独立计数。互不干扰。 - 状态持久化:上述所有状态都存在内存中,插件重启/重载会重置。
- 互斥模式:
开枪两种模式互斥,切换mode时面板下方字段会自动切换;运行时改模式,本群残留的旧状态会被自动重建。 - 两个禁言功能可以同时启用:复读针对"团体跟风",刷屏针对"个人连发",互不冲突。
- 投票禁言:与
开枪等玩法类似,禁言执行依赖机器人管理员权限;投票状态存于内存,重启即清空。若目标已被管理员手动禁言或自然解禁,插件会通过实时查询自动修正内存状态,保证逻辑正确。