一个由 Flask 驱动的 QQ 群机器人:通过 WebSocket 连接 OneBot 11 服务端,具备前端管理页面,
支持配置群聊白名单、识别群聊用户身份,并处理以 / 开头的指令。
内置 /签到、/武器库、/购买、/出售、/转职、/晋升、/地下城、/铁匠铺、/锻造、
/挑战、/踢、/撅、/佬 等指令与多级货币体系、职业/晋升/稀有装备、矿石与锻造玩法、
B 站直播/动态监控。
把地下城功能剥离为独立服务(单进程):代码独立成准新仓库 dungeon_service/(0 import 外壳,
将来整体拎出即成新仓库),运行时与消息端同进程,不做双进程。
- 游戏域 14 模块 + models 已迁入
dungeon_service/;根目录同名文件为转发壳(单一实现源); - 15 个地下城命令集中在
dungeon_service/commands.py,消息端经GameCore门面 (settle保守命令触发结算 /run_command/take_events)直调; - 回归门槛:
python3 -m pytest dungeon_service/tests/ -q(35 用例,含 18 个 golden 逐字 diff); - 详细方案见
docs/dungeon-extract-plan.md;未来拆独立进程按 §4.3 HTTP 契约起 server.py。
📋 版本更新记录见 CHANGELOG.md。
- 连接 OneBot WS 服务端:以客户端身份连接 OneBot 的正向 WebSocket(主机/端口/路径/授权 Token/消息格式/角色可配置),自动断线重连
- 消息格式:数组(接收与发送均使用消息段数组格式)
- 角色:Universal(同一连接同时支持 API 调用与事件推送,路径建议
/) - 群聊白名单:管理页面可增删/启停白名单群,仅白名单内的
/指令会被处理 - 用户身份识别:记录群成员的 QQ 号与昵称(优先群名片)
- 命令处理:消息以
/开头进入命令分发,当前支持:/签到:每日签到(每用户每天只能 1 次),随机奖励——- 95% 概率获得 50~200 铜币
- 4% 概率获得 888 铜币
- 1% 概率获得 1 铜币
- 连续签到天数会延续(昨日未断则累加)
/余额:查看当前资产/职业称号/装备数/签到统计 + 生效中的药水·道具(剩余层数/时间)/背包:查看持有(按分类展示:武具类型/矿石/🌿草药/✨特殊材料/💎Boss材料/🧪药水/🎫道具)+ 生效中效果/武器库:查看可购买的装备(按职业与阶级过滤展示;价格档 50→45000 铜币,共 14 档,68 件;/武器库 开关可隐藏低于自己等级的装备,只展示当前档,减少刷屏)/转职 战士|魔法师|魔剑士|近战法师:选择职业(可随时切换)/晋升:按地下城进度达标 + 消耗货币提升阶级(解锁更高阶装备)/购买 商品名 [商品名...]:消耗铜币购买装备,支持批量购买(空格分隔,不能赊账);/购买 全部(或/购买 一键)一键购入当前最高档每部位评分最好装备各 1 件(已持有更好则跳过,v2.12.16)/出售 商品名 [商品名...]:出售装备,获得购买价 60% 的铜币(掉落稀有装备回收价 30%),支持批量- v2.12.7 一键出售:
/出售 全部(或/出售 一键)一次性卖出所有可出售、未穿戴、非本部位最高评分的非专属装备;保留穿戴中、每部位评分最高(仅当该部位无更高分锻造/专属时,v2.12.11)、锻造与 Boss 专属
- v2.12.7 一键出售:
/地下城 进入 / 状态 / 排名 / 退出:地下城冒险(进入自动穿戴每部位最优 1 件,推进值只算穿戴中的 4 件——地下城新获装备重新进入前不自动穿戴,/背包 可见「穿戴中」标记;含 Boss 关掉落与命名守关 Boss 战力判定——失败重置本关进度但收益照常;排名看本群战力 TOP10 + 自己战力/进度层/专属装备拥有情况(按最近活跃群归属,见下文))/铁匠铺:查看锻造配方(400 层开启 Lv1,依次开放至 Lv4;锻造从商店 T4.5 之上的毕业线);/铁匠铺 分解 <装备名>分解锻造装回收矿石(普通返半、稀有返六成、传说/神话按 50% 概率每单位判定;仅锻造装可分解,商店/掉落装备不可)/锻造 装备名:消耗「铜币 + 矿石」制作装备(不能赊账;铁匠铺装备不可回收);/锻造 推荐按当前背包矿石/铜币自动计算可锻造配方及数量(只列本职业配方,历史层不足标 🔒)/挑战 @对方:发起对战,纯随机 50/50 胜负,三条文字演出(间隔 2 秒),赌注结算(见下文)/挑战 <Boss名|层数|称号>:统一挑战入口——无 @ 时按 Boss 挑战处理(兼容完整名/部分名/层数如1000层/称号如究极,见 Boss 系统)/挑战 列表:Boss 清单 + 今日剩余挑战次数(守关组 x/3 · 大 Boss 各 x/1;未解锁标锁;每行标注 👑 专属掉落装备名·职业·部位);/挑战 装备 [名称]:查询专属装备属性与全服余量(按 Boss 名分组排列并显示 Boss 名与掉率,v2.12.12/22);14 小 Boss 专属按部位分组 3 主手(800/1600/2500 层)/3 盾法器(200/500/900 层)/3 战甲法袍(300/600/1200 层)/5 饰品(100/400/700/1400/1800 层,v2.12.26 重排);4 大 Boss 部位:1000 战甲法袍 / 2000 盾法器 / 3000 主手 / 3600 通用饰品;评分规则:同一轮次内武器评分最高 > 饰品居中 > 战甲≈副手,3600 属性保持最高- 挑战播报含娱乐技能交锋:玩家按等级称号(15 种:初始+7 阶×2 职业)、Boss 按自身称号取技能,每个技能带效果短语、胜负行引用技能名连贯演出,仅文字表述、无效果
- 玩家对战(/挑战 @对方)三段演出同样按双方等级称号出招(技能名前后呼应)
/boss 列表:查看守关 Boss(挑战统一走/挑战 <Boss名|层数|称号>;普通守关每日共 3 次、大 Boss 1000/2000/3000/3600 每日各 1 次、按装备强度定成功率、首通必出 Boss 材料、大 Boss 额外必掉「万宝源晶」、铜币/稀有永久递减;胜利掉落矿石按种类合并计数)/炼金 [配方名|配方|列表]:查看/制作药水·道具(消耗 材料+矿石+铜币;输入 配方/列表/全部/查看 显示全部 47 个配方);/炼金 <配方名> <数量>批量制作(v2.11.85,数量默认 1、最多 99)/使用 <物品名>:使用药水(属性 BUFF)/道具(掉落增益)/转转 捐赠 <装备名>:把不需要的装备放入公共库,他人可乞讨(锻造装除外,可去 /铁匠铺 分解)/祈愿 1|2|3 [次数]:消耗金钱祈愿,可得金钱/装备/材料/矿石/道具,也有谢谢惠顾(v2.11.92 支持批量:第二参数为次数,默认 1、最多 10)——5 铜 / 5 银 / 5 金三档,中奖率与卡池稀有度逐档提升;三档均为负期望(≈0.87/0.65/0.45,档位越高亏越多,长期趋向亏损);高级货保留且高频:档3 每抽 40% 出 tier45 装备(其中 20% 稀有大奖)、16% 传说神话材料/矿石(空奖 38%/30%/6%);材料与矿石按稀有度同池抽取(v2.11.89),矿石发放入矿石栏;奖等(v2.11.80):🥉铜奖·低级 / 🥈银奖·中级 / 🥇金奖·高级(稀有大奖/传说材料)/ 👑特等奖·神话材料/神话矿石,按奖品稀有度标注/转转 乞讨:从公共库随机获得一件符合自己等级的装备(tier ≤ 当前阶级/锻造 Lv 已解锁),每天 3 次/踢 @对方//撅 @对方//佬 @对方:头像合成图片/GIF(见下文)/帮助:查看可用命令(已含最新功能提示:挑战统一入口/武器库开关/Boss 判定)
- 货币体系(内部统一以最小单位"铜币"存储):
100 铜币 = 1 银币 100 银币 = 1 金币 100 金币 = 1 王国币 100 王国币 = 1 圣王国币 - 消息频率限制(可配置):按「群 × 用户」统计 "/" 指令频率(如 15 条 / 60 秒),超出后提示「发送消息过快,请在 N 秒后再试」,冷却期内该用户再次发送的消息被静默过滤、不再提示
- B 站直播间监控:绑定群号,轮询 B 站公开 API(每 60 秒),直播间开播/下播自动推送到绑定群(开播附封面图);可配置启用/禁用
- B 站 UP 主动态监控:绑定 UP 主 UID 到群号,队列式轮询动态接口(每项间隔 200 秒),检测到新动态自动推送(UP 名/类型/内容/时间/链接,图文动态附配图);请求层采用 CDP 真实浏览器优先、curl 降级的策略抗风控;可配置启用/禁用
- 前端管理页:连接状态、连接配置、消息频率限制、直播间监控、动态监控、群白名单管理、用户资产列表、签到记录、装备库、地下城实时状态、运行日志
装备数据保存在 equipment.json(项目目录内,直接编辑即可维护,程序启动后按文件修改时间自动重载);
数据库中只记录用户持有的装备 id(user_item 表),装备完整属性统一从 JSON 读取。
每件装备包含字段:
| 字段 | 说明 |
|---|---|
id |
唯一标识(如 short_sword) |
name |
名称(如 短剑) |
type |
类型:weapon 武器 / staff 法杖 / shield 盾牌 / armor 防具 / robe 法袍 / focus 法器 / accessory 饰品 |
line |
职业线:physical(战士)/ magic(魔法师)/ any(通用) |
tier |
阶级档位(0~5,对应可装备阶级) |
attack / defense / hp / mp / agility / intelligence |
六维属性 |
price |
标准价格(铜币) |
价格采用指数式分档,从 50 铜币 涨到 4 金币 50 银币(=45000 铜币),共 68 件,14 档。
旧「武具店」已改名 /武器库。
-
职业系统:
/转职 战士 | 魔法师 | 魔剑士 | 近战法师(v2.12.14 新增后两者)- 战士(physical)可用:武器/防具/盾牌;魔法师(magic)可用:法杖/法袍/法器(部位对称,不混穿)
- 魔剑士(双线·物理主手+魔法施法):武器/法器/法袍 + 饰品,攻为主、智为辅;近战法师(双线·魔法主手+物理防护):法杖/盾牌/防具 + 饰品,魔为主、敏为辅
- 双线职业以「lines × 部位白名单」限定可用装备(如魔剑士不可穿同属物理线的盾牌/战甲),Boss 战力锚定按各自职业组合(穿满对应档胜率仍 ≈70%)(饰品 accessory 为通用部位,仅按归属线判定、不受部位白名单限制——带物理/魔法归属线的 Boss 专属饰品各职业线均可穿,v2.12.21)
- 四职业组合强度已对齐(v2.12.8/9 两线生存资源对齐后):商店各档 ±1%、锻造 ±3.5%、4 大专属全穿 ±2.5%
- 部位评分对等(v2.12.0):防具(铠甲)补攻/敏输出词条,各档位铠甲评分与同级法袍对等(此前铠甲纯生存、评分仅法袍 1/8~1/13);主手两职业词条结构对称,评分同档波动 ±25% 内
- 副手完全对等(v2.12.8):盾牌/法器逐档对齐——同档两件防/命取较高、输出词条预算取较高(只增强不削弱),商店/锻造/稀有/专属 2000 共 17 组;全部副手同档单件评分差 ≤1.2 分;Boss 挑战胜率零变化(S 与 B0 同源同步,实测 80.4%→80.4%),魔法师推进 +10%、战士数值不变
- 两线组合对齐(v2.12.9):防具(铠甲/法袍)按同规则对齐生存词条(商店/锻造/稀有/专属 3000 共 11 组)——商店全档战士/法师组合速度 ±1%(T4 1492/1492)、锻造 ±5.5%、4 大专属全穿法师反超 5%(此前落后 21%);胜率仍 80.4% 零变化
- Boss 专属数值修正(v2.12.25):同 Boss 同部位两职业件评分全部对齐(组内差 ≤3.6,8 件增强);3000 层防具裂界玄铠/夜幕 1290→797/799(原「锻造×2」反超 3600 最终 Boss,下调为 ≈锻造×1.1),层序梯度恢复单调——1000 主手 550 → 2000 盾 518 → 3000 甲 797 → 3600 饰品 1126,防具不再高于同档主武器;v2.12.26 部位重排:4 大 Boss 改为 1000 防具/2000 副手/3000 主手,14 小 Boss 按轮次重排(3 武/3 盾/3 甲/5 饰),每轮内武器评分最高、饰品居中、战甲≈副手,3600 保持最高
- 部位梯度全局统一(v2.12.27):商店/稀有/锻造/专属四来源统一「主手最高 > 饰品居中 > 战甲≈副手」——商店饰/甲/盾由高于主手下调(T4 饰 256→186、甲 206→169);稀有全件按 ≈同级商店 ×1.10 复核(T4 武 250→228、甲 299→189);锻造非武器件下调(T6 甲 736→368、饰 582→405),武器/法杖保持层锚倍率(lv1-4 ≈ 商店T5 的 0.86/1.08/1.35/1.72);专属按倍率重算(小 Boss ≈ 稀有×1.5、4 大按锻造×1.8/2.1)。胜率锚定自动保持(B0 运行时按新装备重算:档末仍 ≈70%、档首 ≈85%),两职业同件评分差 ≤5%
- 双线对等复核(v2.12.28):同档同部位评分差——稀有 ≤3.1%、锻造 ≤2.9%、专属 ≤3.1%、商店同价位 ≤3.7%(修复锻造 Lv1/Lv2 法杖偏高、商店 T5 神谕圣杖 242→251);四职业(战士/法师/魔剑士/近战法师)穿满同档组合速度极差:商店 ≤1.9%、锻造 Lv3/4 ≤1.5%、锻造 Lv1/2 4.8~5.7%(词条结构极限,v2.12.9 口径 ±5.5%)
- 后期数值调高(v2.12.29):锻造 Lv3/Lv4 全部件 +12%(lv4 武 445→497、甲 370→414、饰 405→453);4 大 Boss 专属 +12%(1000 甲→468、2000 盾→571、3000 武→1042、3600→1260,保持最高);梯度/双线/倍率口径全部保持
- 套装效果(v2.12.3):穿戴 4 件稀有/锻造(任意混合,无需同系列/Lv)→ 全属性 ×1.1(全稀有、全锻造、2+2、1+3 均生效;只要 4 件中没有商店装备);穿戴命名 Boss 专属装备后普通套装 1.1 一律不计算,按件累乘——普通命名 Boss 专属 ×1.2/件、三大 Boss(1000/2000/3000)专属 ×1.5/件、3600 最终 Boss ×2/件(与称号加成同层,属性药水点数不乘;推进速度/战力/挑战胜率同口径生效;/背包 显示「⚡ 套装效果生效中」)
any(通用)仅饰品,两职业共用;未转职:提示先转职;已转职只吃本职业与any,不混搭- 另一职业专属装备保留但不生效(背包标注「另一职业·不生效」),可出售
-
晋升系统:全员一律从 T0 见习 起步;
/晋升按已通关层数达标(50/150/400/800/1600/2500/3000 层,v2.12.17 起须通关要求层、到达不算)+ 消耗铜币 逐级提升阶级(老玩家不自动继承,同样从 T0 逐级晋升)- 称号:见习→疾风→烈焰→银辉→苍穹→神谕→灭世→至尊 + 职业名(如「烈焰战士」)
- 称号提供属性加成:每阶全属性 +5%(T7 封顶 +35%),作用于地下城推进/Boss 通关/状态展示——同装备下高阶称号更强
- 商店(武器库)顶配 T5=45000 随阶级解锁;铁匠铺按层分级(Lv1@400 → Lv4@3200)为毕业线,锻造顶级供 T6 灭世 / T7 至尊 追装(不再纯称号)
- 🏁 地下城封顶 3600:通关 3000 层即达成 T7(最高档,v2.12.17);此后仍可推进至 3600 封顶并驻留,挂机收益(铜币/矿石/材料)持续产出(详见「Boss 挑战 / 材料」节)
-
同价格档 物理武器 与 魔法法杖 推进收益对齐(平衡脚本校验 <3%)
-
稀有装备(Boss 关掉落专属,详见「地下城」节):商店买不到,背包带
✦与(稀有)标注;可出售(rare_drops.json按 tier 定义参考价,出售得参考价 60%) -
/购买 商品名 [商品名...]:消耗铜币购买装备,支持批量购买(空格分隔);铜币不足无法购买(不能赊账);需职业/阶级符合 -
/出售 商品名 [商品名...]:出售装备,获得购买价 60% 铜币(向下取整),支持批量;铁匠铺锻造的装备无法出售;Boss 稀有装备可出售(按rare_drops.json参考价 60%);/出售 全部一键出售(可出售+未穿戴+非本部位最高评分,保留穿戴/部位最高/锻造/专属) -
未知商品会给出「你是不是想买:……」的联想提示(按名称/id 包含关系匹配)
详细数值设计见
docs/alchemy-boss-consumable-request.md;Boss 名可整表替换(bosses.json)。
- 守关 Boss(/boss):18 个命名守关 Boss —— 1000 前每 100 层(100~900)、
1000「十方魔主·终焉」(究极大 BOSS 单独冠名)、1000 后每 200(1200/1400/1600/1800)、
2000「百劫魔帝·归墟」(独立命名)、2000 后每 500(2500/3000)、
3000「千界魔尊·裂界」(究极大 Boss)、3600 最终「万瓜之主·夕张」。
- 分组与每日额度:普通守关(除 1000/2000/3000/3600 外的 14 个)每日组内共 3 次(跨 Boss 共享); 大 Boss(1000/2000/3000/3600)每日各 1 次(每 Boss 独立计数);胜败均扣、按日期重置
/boss 列表:按历史最高层解锁展示(各 Boss 首通/今日剩余次数)- 地下城推进 Boss 关判定:仅命名守关 Boss(100/200/…/3000/3600)进度跑完后按战力胜率判定—— 我方战力高于 Boss 战力则胜率上升、反之下降(保留 3% 保底);判定失败 → 进度重置(重新攻略该关), 本关收益照常继续计算,直到再次跑满进度并判定成功才通关推进;其余 Boss 关 (精英/小Boss/无名字的整百层 Boss)进度跑完即通关
/boss 挑战 Boss名:成功率按当前装备强度(S=dungeon_speed(effective_stats), Logistic 公式,3%97% 保底/封顶);Boss 战力锚定对应装备档——B0 = 穿满该层对应档装备的 S ÷ 1.327 (100→商店T1、200300→T2、400700→T3、8001400→T4、1600~2500→T5、 3000/3600 后段按锻造装难度:3000→锻造Lv3、3600→锻造Lv4),穿满对应装备时档末胜率≈70%、档首≈85% (同档内 B0 线性插值,前面的 Boss 战力要求适当降低),穿低档装胜率明显下降(3000 层需锻造装)- 掉落:首通必出 Boss 材料;重复成功随机 60%(不掉率递减);铜币/稀有装备随挑战永久递减
(
×max(0.2, 0.8^n)/×max(0.1, 0.8^n),n=累计成功次数);稀有 tier ≤ Boss T 档(低级 Boss 只掉低级装) - 自动推进首通:经过命名 Boss 层首次击破 → 必掉 Boss 材料一次(挑战/推进共用首通标记)
- 四大 Boss 专属特殊道具(v2.12.4):1000/2000/3000/3600 挑战成功各按 0.1% 极低掉率掉专属收藏道具
(
category=souvenir独立分类):1000「终焉刻印」、2000「归墟之心」、3000「裂界残片」、3600「万瓜圣契」(原为必掉,按「掉率极低」口径统一为 0.1%) - 大 Boss 专属材料:1000/2000/3000 究极大 Boss 挑战成功必掉 1 个「万宝源晶」(
boss_myriad·神话); 3600 最终 Boss 同样额外掉落(万宝符原料)
- 材料掉落(地下城):
- 草药
herb:普通层 ≥150 层周期掉落(15 分钟/次,概率 普通35/稀有8/传说随层/神话极小;v2.11.86 数量递增参考矿石:每周期先掷数量b=1+min(层//300,3)封顶 4,60% b / 30% b+1 / 10% b+2 颗,每颗独立判种类,整周期必不掉空) - 特殊物品
special:与草药同池同概率普通层周期掉落(150 层起每 15 分钟);Boss 关另有额外 roll(精英 25% / 小Boss 45% / 大Boss 80%);神话档掉落「万宝源晶」(万宝符原料,大 Boss 挑战必掉 + 周期神话档稀有双来源) - Boss 材料:
/boss挑战与自动推进首通产出(按 Boss T 档共料,同档多 Boss 同材料);大 Boss 额外掉「万宝源晶」 /背包分类展示材料(草药/特殊/Boss)与药水/道具,并附「生效中」效果;/余额、/地下城 状态同见生效中药水/道具
- 草药
- 炼金(/炼金):配方消耗 草药/特殊/Boss 材料 + 矿石 + 铜币 → 药水/道具(47 配方,
consumables.json);/炼金 推荐按当前背包材料/矿石/铜币自动计算可合成配方及可制作数量(历史层不足的标注 🔒)- 分级解锁(按配方 Lv × 历史最高层):Lv1@100 / Lv2@500 / Lv3@900 / Lv4@1300 / Lv5@1700
- 命名与输入:等级用阿拉伯数字(「聚财符1」「狂攻药水3」);「名 1 / 名1 / 名Ⅰ / 名 I / 名一」写法均可匹配
- 消耗差异化:同 Lv 六种药水消耗各不相同——为**「草药+特殊」组合、不消耗矿石**(矿石留给锻造, 避免战士综合缺矿);草药与特殊材料同池同概率掉落(成本由稀有度档唯一决定), 配方按材料点数对齐(common=1 / rare=2 / legendary=3),同级六种点数一致(5/6/7/8/9)→ 同级期望成本相同; 等效药水(攻=魔、敏=智、防=命)同级用同一种 Boss 材料,来源等级一致且 ≤ 药水解锁层 (Lv2=磐岩心核 / Lv3=尸皇骨匣 / Lv4=霜语结晶 / Lv5=烬鳞龙鳞,Lv1 入门不加),全部 Boss 材料均有消耗端; 道具按增益目标配材料(采掘=矿石/采药=草药/祈灵=特殊/寻宝=Boss 材料/万象=混合/万宝=万宝源晶)
- 使用(/使用):
- 药水 = 属性强化(攻/魔/智/敏 × Lv1~5 按推进公式权重折算收益等价:攻=魔=2、敏=智=1.5,故敏智数值=攻魔×4/3; 防/命为生存乘区属性),加成并入有效属性(提升推进与 Boss 胜率)
- 道具 = 掉落增益(金钱/装备/矿石/草药/特殊/全材料 × Lv1
3;稀有道具低等级不提供; **万宝符13 = 全部材料 ×1.6/1.8/2.0**,消耗万宝源晶(1/2/3) + 万宝符3 叠万瓜圣辉,万象符上位) - 持续:药水 持续 100 层;道具 持续 4 小时
- 互斥覆盖:药水/道具各自同时仅能存在一种;使用新的药水/道具会替换同类的旧 BUFF 并刷新时长 (层数型重置为完整 100 层 / 时间型重置为完整 4 小时);药水与道具互不影响(两槽并存)
- 查看:
/地下城 状态展示生效中的药水/道具及剩余层数/时间(到期自动清理)
- 解锁资格:进入地下城时当前层数 > 400 层 即获得本轮矿石资格(进入时判定,本轮有效;退出地下城后资格作废,下次进入重新判定)
- 结算周期:每 15 分钟一个结算周期,自动掷骰一次(不足一周期的时间直接丢弃)
- 采矿数量(先掷数量、必掉无空窗,v2.11.33~36):每周期基础颗数
b = 1 + min(层数//300, 3)(封顶 4); 60% 得 b 颗 / 30% 得 b+1 颗 / 10% 得 b+2 颗;例:100 层 1/2/3、300 层 2/3/4、600 层 3/4/5、900+ 层 4/5/6 - 每颗判档(档内随机):传说
2% × (层数/400)^0.5(上限 30%,金/龙晶/圣辉石/龙魂晶); 神话0.1% × (层数/400)^0.5(上限 1%,星陨铁/混沌核/神谕石);稀有固定 8%(银/秘银/精金/星辰砂); 未命中传说/神话/稀有 → 兜底普通(铜/铁/锡/铅,必掉不掉空);层数加成只作用于传说/神话档 - 矿石种类(
ores.json,可直接编辑维护):共 15 种稀有度 矿石 普通 铜矿石、铁矿石、锡矿石、铅矿石 稀有 银矿石、秘银矿石、精金矿石、星辰砂 传说 金矿石、龙晶石、圣辉石、龙魂晶 神话 星陨铁、混沌核、神谕石 - Boss 关即时掉落(详见「地下城」):通关 Boss 层必掉矿石且一次多颗——
颗数 = min(1 + 层数//100 + 类型加成, 8)(大Boss+2 / 小Boss+1 / 精英+0); 按 Boss 类型给高稀有占比(大 Boss 神话 18% / 传说 55% / 稀有 22% / 普通 5%,权重和=1 必掉); 每颗独立判定档位与种类(一次掉落可为混合档位/混合种类) - 数据库(
user_ore表)只记录用户持有矿石 id 与数量;/背包查看(★神话 / ✦传说 / ◆稀有 / ·普通) - 矿石的消耗途径:铁匠铺锻造(见下节)
-
解锁条件:玩家曾到达地下城 400 层 开启 Lv1(铁匠铺按层分级:Lv1@400 / Lv2@800 / Lv3@1600 / Lv4@3200); 锻造产物强度从「商店 T4.5」起步逐级走高,穿戴随铁匠铺 Lv 解锁(不卡当前阶级),商店顶级仍由 T5 玩家购买
-
玩法:
/铁匠铺查看已解锁配方 →/锻造 装备名消耗「铜币 + 矿石」制作装备(不能赊账;铜币或矿石不足会明确提示缺什么) -
配方数据:
forge.json(可直接编辑维护),共 28 个配方、分 4 个等级,强度从「商店 T4.5」起步逐级走高(Lv1≈商店T4.5 → Lv4≈T7 级毕业带),价格随强度联动(3.2 万铜币起):等级 价格(铜币) 每级 7 部位 Lv1 32,000 断岳重剑 / 星芒秘杖 / 磐岳战铠 / 灵纹轻袍 / 壁垒圆盾 / 秘仪法器 / 旅者徽记 Lv2 60,000 破霄圣剑 / 凌霜权杖 / 苍岳重甲 / 月华法袍 / 辉光方盾 / 曜晶法器 / 灵犀指环 Lv3 120,000 天罚神剑 / 灭世魔杖 / 神鳞圣铠 / 圣辉法袍 / 神鳞重盾 / 神火宝珠 / 神纹项链 Lv4 260,000 龙神战戟 / 创世圣杖 / 神铸神铠 / 创世圣袍 / 神铸圣盾 / 灭世宝珠 / 万古王冠 - 每级 7 部位对称齐全:战士武器 / 法师法杖 / 战士防具 / 法师法袍 / 盾 / 法器 / 饰品
- 配方材料分级(不掺更低档):Lv1 全普通 / Lv2 稀有+普通 / Lv3 传说+稀有 / Lv4 神话+传说+稀有; 同位置(主手/副手/防具)两职业材料与数量统一、饰品补齐剩余种类 → 每个职业 4 件覆盖本档全部矿石(无跨职业浪费),职业总量对称; 神话矿(星陨铁/神谕石/混沌核)仅 Lv4:主手/副手/防具各一种、饰品三种都用;副材料配传说(Lv4:龙晶石/金矿/龙魂晶/圣辉石各司其位)
-
锻造产物入
user_item表(与武器库购买同一背包),但无法在/出售回收 -
名称统一不带「锻造·」前缀(如
/锻造 断岳重剑),输入带不带前缀均可匹配;未知配方会给出联想提示
- 玩法:
/挑战 @对方,纯随机 50/50 胜负(装备不参与判定),发送 3 条文字演出消息(每条间隔 2 秒):甲出招 → 乙反击 → 终结+胜负结算;/挑战 <Boss名|层数|称号>(无 @)走 Boss 挑战(Boss 系统共用同一入口) - 赌注:基准 =
max(min(全服资产中位数 × 3%, 双方资产之和 × 10%), 50铜币),即「中位数基准」封顶为双方总资产的 10%、保底 50 铜币- 挑战方(发起者)败 → 支付 基准 × 1.2
- 被挑战方败 → 支付 基准 × 0.8
- 赢家通吃;不能赊账——输家资产不足时按全部资产支付(资产清零),赢家仅获得输家实际支付的金额
- 次数:发起方每天限 3 次(按日期重置);被挑战方不限次
- 限制:不能挑战自己;对方未注册(从未在群里出现过)无法挑战
- 系统累计记录每个用户发送的未知指令次数
- 前 2 次:正常提示「未知指令,发送 /帮助 查看可用命令」
- 第 3 次(达到阈值):合成
beat.jpeg底图 + 用户头像(46×46 圆形贴 (23,82))的图片并提示不再响应(合成失败时退回原图) - 第 4 次起:该用户的未知指令被静默过滤(不提示、不发图),但有效指令不受影响
- 进入条件:持有任意 1 件装备
- 层数进度(幂函数曲线,防数值膨胀):第 1 层总进度 1000,随时间流逝自动削减,推进速度按【公式】:
每个用户单独核算,进度实时持久化,离线/断连期间也按真实时间差补算
(攻击力 × 2 + 魔力值 × 2 + 敏捷 × 1.5 + 智力 × 1.5) × (1 + 防御力 / 400) × (1 + 生命值 / 600) - 层难度曲线(第 n 层总进度):
1000 × n^0.75(幂函数,远慢于旧指数曲线,后期不膨胀) - 金币产出(按 5 秒 为单位核算,未满 1 铜币自动累积):
- 第 1 层:每 60 秒 1 铜币
- 第 n 层每秒产币:
(1/60) × n^0.6(增速低于难度曲线,更稳健)
- 属性规则:
- 初始属性:攻击 5 / 防御 2 / 生命 20 / 魔力 5 / 敏捷 5 / 智力 5
- 穿戴中(v2.11.70):进入地下城自动把每部位收益最高的 1 件标记为「穿戴中」,推进值只算穿戴中的 4 件;地下城新获装备重新进入前不自动穿戴(/背包 可见标记);未标记玩家回退自动最优
- 背包等级标记(v2.11.78):未到穿戴等级的装备在 /背包 中标出——商店/稀有超阶级标「需T5」、锻造未按历史层解锁标「需锻造Lv4」;Boss 专属免等级不标
- 同槽位(主手/副手/防具/饰品)取整体推进速度最优的穿法:评分起步 + 槽位迭代校正(按实际叠加后的 dungeon_speed 判定),跨槽位叠加
- 统一口径(v2.11.71):装备收益分(评分)= 推进速度同套公式
dungeon_speed(基础属性+该件属性);装备收益 / 推进值 / 装备评分三者同一套计算,防肉装不再有保底分虚高问题。装备性价比 = 收益分 ÷ 价格(独立口径,仅用于“花钱买什么划算”比较) - 职业/阶级过滤:已转职只吃本职业 + 通用(any)装备;未转职自动择优(物理/魔法取高);商店/稀有装备 tier>当前阶级的不生效,锻造装备按铁匠铺 Lv(历史最高层)穿戴、不卡当前阶级;Boss 专属装备不要求穿戴等级(v2.11.77,掉落即生效)
- Boss 关:
- 分布:每 10 层精英、每 50 层小 Boss、每 100 层大 Boss(同层命中按 大 Boss > 小 Boss > 精英)
- 血量:Boss 层总进度放大(精英 ×1.5 / 小 Boss ×3 / 大 Boss ×6)
- 通关掉落:额外金钱(≈当前层产币速率 × 5/15/40 分钟,精英/小Boss/大Boss,随层成长)+ 必掉矿石(按 Boss 类型高稀有占比,大 Boss 高概率神话/传说)+ 概率稀有装备(精英 6% / 小Boss 15% / 大Boss 30%)
- 命名 Boss 专属装备(v2.11.49~50):全部 18 个命名 Boss 均有专属(boss_gear.json 共 30 件,背包 👑 标注、不可出售):
- 4 大 Boss(1000/2000/3000/3600) 专属(共 7 件),属性 ≈ 同级锻造 ×1.8 / ×2.1(v2.12.27 按锻造重构后数值锚定:1000→锻造Lv2×1.8、2000→锻造Lv3×1.8、3000→锻造Lv4×2.1、3600 保持最高 1126);全服限量各 3 件,掉率 0.1%(v2.12.15 起 按职业过滤掉落,只会掉本职业可用件):1000「终焉魔铠/终焉圣袍」(防具·战/法)、2000「归墟壁垒/归墟星瞳」(副手·战/法)、3000「裂界斩刀/裂界法剑」(主手·战/法)、3600「夕张圣冕」(饰品·通用);
- 其他 14 个命名 Boss 各 2 件(战士/法师各 1 件,覆盖两职业),属性 高于同级稀有装备(≈同级稀有 ×1.5 = ≈同级商店 ×1.65);全服限量各 5 件,掉率 3%;按轮次部位轮换(v2.12.26/27):3 主手(800 裂渊/1600 赤渊/2500 渊灭)、3 盾法器(200 磐岩/500 烬鳞/900 灭世)、3 战甲法袍(300 枯骨/600 冥渊/1200 吞海)、5 通用饰品(100 灰鬃/400 霜语/700 噬星/1400 裂空/1800 净世);同 tier 内低层略弱(层内系数 0.92→1.0);
- 全局计数达上限不再掉落,挑战胜利独立判定;
- 评分规则(v2.12.26/27 全局统一):同一轮次内主手评分最高 > 饰品居中 > 战甲≈副手,3600 保持最高;四来源(商店/稀有/锻造/专属)同规则
- 稀有装备(Boss 掉落专属):独立
rare_drops.json(41 件,覆盖 T0~T5 全部位),商店(武器库/铁匠铺)买不到; 覆盖 战士主手/盾/防具、法师主手/法器/袍 + 通用饰品;强度 ≈ 同阶商店 ×1.10(v2.11.65 全量复核校准:穿满四件套合成战力口径,且不超过下一阶普通); 掉落偏向玩家当前阶级档(越高级 Boss 越易出该档稀有,低档留保底);进包立即可见并标✦ 名称(稀有) new!(仅首次/背包查看提示,查看后清除),退出地下城后下次进入才计入推进速度 - 矿石掉落:进入时层数 > 400 层可获得矿石资格(每 15 分钟结算一次,见「矿石系统」)
- 地下城内可用指令:
/签到、/余额、/背包、/祈愿(v2.11.82)、/帮助、/踢、/撅、/佬、/挑战与/地下城(退出/状态),其余指令一律拒绝
- 原理:批量轮询 B 站公开 API(
getRoomBaseInfo,无需登录/Token,一次查询所有监控房间),每 60 秒一次,检测live_status变化 - 判定规则:仅
live_status == 1(直播中)视为开播;轮播(2)不视为开播0/2 → 1:开播通知1 → 0/2:下播通知
- 通知内容:
- 开播:直播间标题 / 主播名 / 开播时间 / 直播间链接,附带直播间封面图(由程序下载到本地后以图片消息发送)
- 下播:直播间标题 / 主播名
- 绑定规则:一个群最多绑定 1 个直播间;一个直播间可绑定多个群(1 对多)
- 管理:管理页「直播间监控」卡片可 添加(群号 + 房间号 + 备注)/ 停用 / 启用 / 删除 / 立即检测;卡片内设有独立监控日志区(实时显示轮询、开播/下播、增删启停等记录,每 3 秒自动刷新)
- 首次监控只记录当前状态、不通知,避免误报;网络/接口异常跳过本轮、不更新状态
- 备注字段可选(未填时主播名/标题取 B 站接口返回)
- 原理:轮询 B 站公开动态接口(
/x/polymer/web-dynamic/v1/feed/space),取 UP 主最新动态 id 并与上次记录比对 - 轮询策略:队列式串行轮询——多个 UP 主时逐个轮询、每项间隔 200 秒(如 A→200s→B→200s→A…);仅 1 个 UP 主时每 200 秒一次。拉大单 UP 请求间隔,规避 B 站风控
- 请求层(CDP 优先、curl 降级):
- 优先走 CDP:通过 Chrome DevTools 协议驱动本机真实的 Edge/Chrome 浏览器导航到接口地址,请求由真实浏览器内核发出(完整 TLS/JS/环境指纹),并直接复用 CDP 浏览器里已登录的 B 站登录态,无需配置 Cookie
- CDP 不可用时自动降级为 curl.exe:系统自带 curl 的 TLS 指纹更接近浏览器,带 Chrome UA + Referer + cookie 文件请求;存在
bili_cookies.txt(Netscape 格式)时自动使用其中的登录态(含 SESSDATA),否则自动种入 buvid 系列匿名 Cookie
- 防风控:命中 B 站风控(-352/412/403 或非 JSON 响应)自动进入 300 秒冷却,冷却期间不再请求该接口
- 登录态(Cookie):优先复用 CDP 浏览器里已登录的 B 站登录态;无 CDP / CDP 失败时降级用
curl请求,并自动读取模块同目录的bili_cookies.txt(Netscape 格式,含SESSDATA即视为已登录;未注入时 curl 仅携带游客 Cookie,命中风控概率更高) - 置顶动态处理:B 站会把置顶动态放在列表最前,代码按真实发布时间
pub_ts倒序排序,以「真正最新的动态」作比对基准,避免置顶挡新动态 - 设计参考:借鉴 HarukaBot / bili-monitor / bilibili-notify 等开源项目的动态订阅轮询思路(记录最新动态 id 防重复推送)
- 判定规则:最新动态 id 变化即视为有新动态;一次轮询内出现多条时按时间从旧到新逐条推送;「直播了」动态(UP 开播时 B 站自动发的直播动态)不播报(由直播间监控处理开播提醒)
- 通知内容:UP 主名 / 动态类型(转发/投稿视频/图文/文字/专栏/音频)/ 内容(文字或标题)/ 发布时间 / 动态链接;图文动态会下载正文配图(最多 3 张)到本地
tmp/后随消息发送 - 绑定规则:一个群可绑定多个 UP 主;一个 UP 主可绑定多个群(多对多)
- 管理:管理页「动态监控」卡片可 添加(群号 + UP 主 UID + 备注)/ 停用 / 启用 / 删除 / 立即检测;卡片内设有独立监控日志区(实时显示轮询、新动态、增删启停等记录,每 3 秒自动刷新)
- 首次监控只记录最新动态 id、不通知,避免误报历史动态;网络/接口异常跳过本轮、不更新状态
python_onebot_backend/
├── app.py # Flask 入口 / REST API / 事件处理
├── bot.py # OneBot 正向 WebSocket 客户端(自动重连)
├── commands.py # 命令分发与全部玩法实现(签到/武具/地下城/锻造/挑战/踢撅佬)
├── currency.py # 货币换算与格式化
├── models.py # SQLAlchemy 模型(配置/白名单/用户/装备/矿石/签到记录/监控项)
├── equipment.py # 装备 JSON 加载(含 mtime 自动重载)
├── equipment.json # 武器库装备数据(68 件,含 line/tier,可直接编辑维护)
├── classes.py # 职业注册表(战士/魔法师 → line / 可用部位)
├── tiers.py # 阶级分层/晋升(层门槛/费用/称号前缀)
├── dungeon.py # 地下城核心(层进度/公式/产币/职业+tier过滤/Boss 关/稀有掉落)
├── ore.py # 地下城稀有矿石(400 层以上,15 分钟一周期掷骰,含神话极小档)
├── ores.json # 矿石数据(普通/稀有/传说/神话共 15 种)
├── forge.py # 铁匠铺锻造(按层分级:Lv1@400…Lv4@3200,消耗铜币+矿石)
├── forge.json # 锻造配方数据(28 配方,Lv1~Lv4 各 7 部位)
├── rare_drops.json # Boss 稀有装备掉落池(41 件,覆盖全部位)
├── materials.json # 地下城材料(草药/特殊/Boss 材料)
├── bosses.json # 命名守关 Boss(18 个:层/名/材料/稀有上限)
├── consumables.json # 炼金产物(药水/道具,47 条;seed_consumables.py 生成)
├── alchemy_recipes.json # 炼金配方(47 条;seed_consumables.py 生成)
├── boss.py # 守关 Boss 挑战(列表/成功率/永久递减/次数/首通/掉落)
├── material.py # 材料掉落与持有(镜像 ore.py)
├── alchemy.py # 炼金(配方加载与制作)
├── consumable.py # 药水/道具注册与使用(BUFF / 掉落增益)
├── kick.py # 头像合成(/踢 /撅 /佬 /封禁图,Pillow 圆形裁切)
├── images.jpg # /踢 底图(可替换)
├── beat.jpeg # 未知指令封禁底图(可替换)
├── dalao.png # /佬 底图(可替换)
├── 2886735798_frames/ # /撅 多帧 GIF 序列底图
├── livemon.py # B 站直播间监控(轮询 API + 后台线程)
├── dynamon.py # B 站 UP 主动态监控(队列轮询 + 后台线程)
├── cdp.py # CDP 请求层(用真实浏览器发 B 站接口请求,抗风控)
├── ratelimit.py # 消息频率限制器(内存实现)
├── repeat.py # 复读机(2 个不同用户相同消息后复读一次)
├── templates/index.html # 前端管理页面
├── requirements.txt # 依赖
└── onebot_bot.db # SQLite 数据库(首次运行自动生成)
cd python_onebot_backend
python -m venv venv
# Windows:
venv\Scripts\activate
# macOS / Linux:
# source venv/bin/activate
pip install -r requirements.txt
python app.py启动后打开管理页:http://127.0.0.1:5000/
在管理页「连接配置」中填写(对应 OneBot 实现的配置):
| 配置项 | 说明 | 默认 |
|---|---|---|
| 主机 | OneBot WS 服务端 IP | 127.0.0.1 |
| 端口 | OneBot WS 服务端端口 | 6700 |
| 路径 | 连接路径(Universal 用 /) |
/ |
| 授权 Token | OneBot 配置的 access_token(无则留空) | 空 |
| 消息格式 | array(数组) |
array |
| 角色 | universal(推荐) |
universal |
「消息频率限制」可在管理页独立配置:
| 配置项 | 说明 | 默认 |
|---|---|---|
| 启用 | 是否开启频率限制 | 关闭 |
| 窗口内最多消息数 | 统计窗口内 "/" 指令的最大条数 | 15 |
| 统计窗口(秒) | 频率统计的时间窗口 | 60 |
| 提示冷却时长(秒) | 超出限制后提示的作用时长,冷却期内静默过滤 | 60 |
保存后会自动重连。连接成功后在管理页顶部看到"已连接"。
以 go-cqhttp / NapCat 为例,需要在 OneBot 实现中启用正向 WebSocket:
ws: enable: true host: 127.0.0.1 port: 6700
- 打开管理页,配置连接并确认"已连接"
- 在「群聊白名单」中添加目标群号
- (可选)在「直播间监控」中添加要监控的 B 站房间号并绑定群号,开播/下播自动推送
- (可选)在「动态监控」中添加要监控的 UP 主 UID 并绑定群号,新动态自动推送(CDP 浏览器登录态优先;无 CDP 时可用
bili_cookies.txt注入登录态 Cookie,见「动态监控」节) - 在白名单群里发送:
/签到:每日签到,随机获得铜币/银币/转职 战士|魔法师:选择职业 →/武器库查看可买装备 →/购买 短剑→/出售/晋升:地下城进度达标后提升阶级(解锁更高阶装备)/地下城 进入:开始冒险(持有任意 1 件装备)/地下城 状态:查看层数/进度/金币/地下城 退出:离开地下城(保存进度,下次直达续上)/铁匠铺:查看锻造配方(400 层开 Lv1)→/锻造 断岳重剑消耗铜币+矿石制作/背包:查看持有的装备(含 ✦ 稀有)与矿石/踢 @对方:合成"踢人"图片(你的头像 + 对方头像贴到底图,30 秒冷却)/撅 @对方:合成"撅人"动态 GIF(多帧序列,小概率被反撅,30 秒冷却)/佬 @对方:合成"大佬"致敬图(30 秒冷却)/挑战 @对方:发起对战(随机 50/50 胜负,每天 3 次)/余额:查看资产
在 commands.py 中新增一个处理函数,然后在 COMMANDS 注册表中登记即可,例如:
def cmd_roll(user, group_id, args):
return "🎲 掷出了 6"
COMMANDS = {
# ...已有命令...
"roll": cmd_roll,
"掷骰子": cmd_roll,
}- 签到日期取服务器本机日期,建议将程序部署在中国时区(UTC+8)机器上
- 复读机:白名单群里 2 个不同用户发送相同内容的消息后,机器人立刻复读一次;同一轮(60 秒窗口)内即使第 3 个、第 4 个用户继续发相同内容也不再复读,防止刷屏;同一用户重复发送不计入;命令消息(
/开头)不参与复读;窗口过期后自动重置 - 地下城进度/金币在任意指令触发时按真实时间差自动补算(惰性结算),无需常驻定时器;战利品结算播报(Boss 掉落/周期矿石/草药材料)仅
/地下城展示(v2.11.81)——签到/余额/背包等命令照常结算入账但不播报,战报保留至下次/地下城一并带出 - 地下城进度保存:
/地下城 退出会保存当前层数与剩余进度,之后/地下城 进入会直达上次位置继续冒险(例如上次在第 19 层剩 500 进度,下次进入仍从第 19 层剩 500 开始);无保存进度时从第 1 层开始。管理页地下城表格会显示「保存进度」列;旧数据库首次启动自动补列(无需重建) /踢 @对方:发送者(踢人者)头像 120×120 圆形贴在底图images.jpg的 (400,98),被 @ 者(被踢者)头像贴在 (75,34),合成图保存到tmp/images_时间戳.jpg并作为图片消息发送到群;每个用户 30 秒冷却;头像来自腾讯官方 qlogo 直链(失败时用灰色圆形占位图)。回复文本中被 @ 者优先显示其群名片/昵称(机器人在白名单群里所有消息都会记录发送者名片;对被 @ 用户还会异步查询一次get_group_member_info刷新名片),无记录时显示 QQ 号/撅 @对方:2886735798_frames/下 3 帧序列底图,A(发起人)与 B(被撅者)头像 120×120 圆形按每帧坐标逐帧贴上、合成为动态 GIF 发送;B 头像逆时针旋转 90°;2% 概率 A/B 位置互换(A 撅失败被 B 反撅);30 秒冷却/佬 @对方:dalao.png底图,A 头像 54×54 贴 (91,121)、B 头像 54×54 贴 (200,3),合成 PNG 发送;30 秒冷却- 未知指令封禁:累计 3 次未知指令后发头像+底图合成图并停止响应,第 4 次起静默过滤(见「未知指令封禁」)
- 所有命令回复通过
send_group_msg以数组格式发送 - 连接异常会自动每 3 秒重连一次,可在「运行日志」中查看
- 铁匠铺/装备/矿石数据均为 JSON 文件(
equipment.json/forge.json/ores.json/rare_drops.json),程序按文件修改时间自动重载,修改后无需重启;classes.py/tiers.py/models.py/commands.py/dungeon.py改动需重启进程