koishi-plugin-sb6657-bot
v1.1.5
Published
A Koishi-based QQ bot plugin for sb6657.cn
Downloads
191
Readme
sb6657-bot
sb6657.cn 官方 Koishi QQbot 插件,提供烂梗搜索、随机烂梗、热门烂梗,附带若干群娱乐命令(俄罗斯轮盘赌、睡觉禁言)以及群管类被动监听器(复读禁言、刷屏禁言)。
安装方法
在 Koishi 插件市场搜索并安装 sb6657-bot(包名:koishi-plugin-sb6657-bot)即可。
本地运行方法
1. 运行项目并打包
需要 Node 24 版本
pnpm i # 安装依赖
pnpm build # 打包(输出到 dist/)2. 安装至 Koishi
在你自己的 Koishi 根目录下,external 文件夹内(如果没有就自己新建一个),建立 sb6657-bot 文件夹。
然后把项目里打包出来的 dist 文件夹,以及 package.json 文件都丢进去。
随后在你自己 Koishi 根目录的终端里,输入:
yarn add ./external/sb6657-bot本地安装上这个插件。
最后找到你自己 Koishi 项目的 koishi.yml 文件,在 plugins: 层级下面加上 sb6657-bot: {} 直接硬启用插件。
重启项目(比如说你是 Docker 就重启镜像)。
3. 启用插件
在 Koishi Web 管理端的插件配置里,找到 sb6657-bot 插件,按需配置并启用。
面板按功能分组,每个分组第一项都是 是否启用 开关,可单独开启 / 关闭而不影响其他功能。
所有功能的
enabled默认都是false:插件首次安装后所有指令和监听器都不会工作,需要在 Koishi 控制台手动逐项启用。
功能一览
本插件包含两类功能:
- 主动命令:用户在群里输入对应指令触发
- 被动监听器:不需要用户主动调用,插件会监听群内消息自动触发
命令列表
| 命令 | 别名 | 说明 | 是否需要群聊 |
| ---------------------- | -------------------------------- | ---------------------------------------- | ------------ |
| 搜烂梗 <关键词> | 搜 / search / meme | 根据关键词搜索 sb6657 烂梗站的梗 | 否 |
| 随机 | 随机烂梗 / 抽烂梗 / random | 随机抽一条烂梗 | 否 |
| 热门24h | hot24h / 24h热门 | 获取最近 24 小时的热门烂梗 | 否 |
| 热门7d | hot7d / 7d热门 | 获取最近 7 天的热门烂梗 | 否 |
| 开枪 | —— | 俄罗斯轮盘赌,运气不好就被禁言 | 是 |
| 睡觉 | —— | 禁言自己一段时间,来次精致睡眠 | 是 |
| 投票禁言 <user:user> | —— | 发起投票禁言某个用户,达到票数后执行禁言 | 是 |
| 投票解禁 <user:user> | —— | 发起投票解禁某个用户,达到票数后执行解禁 | 是 |
被动监听器
| 名称 | 触发条件 | 禁言对象 | | ----------- | ---------------------------------------------------------------------------------------------------------- | -------------------- | | 🔁 复读禁言 | 同一条消息在频道内被连续重复 N 次 | 最后那个跟风复读的人 | | 🚿 刷屏禁言 | 单个用户在滑动时间窗口内发送消息数达到阈值(频率),或在更长窗口内连续发送相同内容次数达到阈值(相同内容) | 刷屏那个用户 |
群聊限制说明:
开枪/睡觉以及两个被动监听器都依赖 QQ 禁言能力,只能在群聊中使用,且机器人需要具备群管权限。
群生效范围:两个被动监听器都支持单独配置
所有群/白名单/黑名单三种模式,可针对不同 QQ 群独立控制是否开启,避免"一开全开"。
可配置项列表
所有配置项都在 Koishi Web 管理端按功能分组展示。以下分组 ↔ 功能一一对应:
🔍 搜烂梗 指令 (search)
| 字段 | 类型 | 默认值 | 说明 |
| ----------------- | ------- | ------- | ----------------------------------------------------------------------- |
| enabled | boolean | false | 是否启用本指令 |
| minInterval | number | 1000 | 指令触发的冷却时间(毫秒) |
| defaultMaxUsage | number | 50 | 普通群友每天的默认搜索次数 |
| customLimits | array | [] | VIP 用户的自定义次数白名单(可添加多条),每项含 userId 和 maxUsage |
🎲 随机烂梗 指令 (random)
| 字段 | 类型 | 默认值 | 说明 |
| ------------- | ------- | ------- | -------------------------- |
| enabled | boolean | false | 是否启用本指令 |
| minInterval | number | 1000 | 指令触发的冷却时间(毫秒) |
🔥 热门烂梗 指令 (hotMemes)
启用后会同时注册 热门24h 和 热门7d 两个指令,结果以合并转发消息展示。
| 字段 | 类型 | 默认值 | 说明 |
| ------------- | ------- | ------- | -------------------------------- |
| enabled | boolean | false | 是否启用两个热门烂梗指令 |
| minInterval | number | 1000 | 两个指令共用的冷却时间(毫秒) |
🔫 开枪(俄罗斯轮盘赌)指令 (roulette)
基础字段:
| 字段 | 类型 | 默认值 | 说明 |
| ------------- | ------------------------------ | --------------- | -------------------------- |
| enabled | boolean | false | 是否启用本指令 |
| minInterval | number | 600 | 指令触发的冷却时间(毫秒) |
| mode | 'probability' / 'sequence' | 'probability' | 游戏模式,两种模式互斥 |
模式 A:放回抽样(概率模式)
每次开枪独立判定,中弹概率恒定;空枪后禁言时间叠加增长。
| 字段 | 类型 | 默认值 | 说明 |
| ------------- | ------------ | -------------------------- | ---------------------------------- |
| probability | number (0-1) | 0.2 | 每次中弹概率 |
| initTime | number | 180 | 每轮初始禁言时间(秒),无上限 |
| timeStepMin | number | 60 | 空枪后叠加的最小时间(秒),无上限 |
| timeStepMax | number | 180 | 空枪后叠加的最大时间(秒),无上限 |
| msgHit | string | 见下 | 中弹文案 |
| msgNewRound | string | 见下(可清空,留空则不发) | 中弹后下一轮开始时追加的文案 |
| msgMiss | string | 见下 | 空枪文案 |
模式 B:不放回抽样(弹巢模式)
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}格。
😴 睡觉 指令 (sleep)
| 字段 | 类型 | 默认值 | 说明 |
| ------------- | ------- | ----------------- | -------------------------- |
| enabled | boolean | false | 是否启用本指令 |
| minInterval | number | 600 | 指令触发的冷却时间(毫秒) |
| minSeconds | number | 21600(6 小时) | 睡眠最短时长(秒),无上限 |
| maxSeconds | number | 28800(8 小时) | 睡眠最长时长(秒),无上限 |
| msgSleep | string | 见下 | 睡觉文案 |
文案占位符同"开枪通用占位符":{at} / {time} / {seconds}。
默认文案:{at} 好好睡觉,{time}后再醒来吧!
🔁 复读禁言 (repeatMute)
被动监听器。当同一条消息在频道内被连续重复 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}
🚿 刷屏禁言 (spamMute)
被动监听器。内置两个相互独立、互不干扰的计数器,按 群:用户 维度分别维护:
- 频率计数器(始终启用,受
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,可以互不干扰地配置。
🗳️ 投票禁言 指令 (voteMute)
| 字段 | 类型 | 默认值 | 说明 |
| ------------------ | --------------------------------------- | ------------------ | ---------------------------------------------------- |
| 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时面板下方字段会自动切换;运行时改模式,本群残留的旧状态会被自动重建。 - 两个禁言功能可以同时启用:复读针对"团体跟风",刷屏针对"个人连发",互不冲突。
- 投票禁言:与
开枪等玩法类似,禁言执行依赖机器人管理员权限;投票状态存于内存,重启即清空。若目标已被管理员手动禁言或自然解禁,插件会通过实时查询自动修正内存状态,保证逻辑正确。
