Skip to content

Latest commit

 

History

205 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

OneBot 11 签到机器人(Python + Flask + SQLAlchemy + SQLite)

一个由 Flask 驱动的 QQ 群机器人:通过 WebSocket 连接 OneBot 11 服务端,具备前端管理页面, 支持配置群聊白名单、识别群聊用户身份,并处理以 / 开头的指令。 内置 /签到/武器库/购买/出售/转职/晋升/地下城/铁匠铺/锻造/挑战/踢/撅/佬 等指令与多级货币体系、职业/晋升/稀有装备、矿石与锻造玩法、 B 站直播/动态监控。

🏗️ 地下城剥离(进行中:refactor/dungeon-extract 分支)

把地下城功能剥离为独立服务(单进程):代码独立成准新仓库 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 专属
    • /地下城 进入 / 状态 / 排名 / 退出:地下城冒险(进入自动穿戴每部位最优 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(项目目录内,直接编辑即可维护,程序启动后按文件修改时间自动重载); 数据库中只记录用户持有的装备 iduser_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 包含关系匹配)

Boss 挑战 / 材料 / 炼金(v2.7)

详细数值设计见 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 胜率)
    • 道具 = 掉落增益(金钱/装备/矿石/草药/特殊/全材料 × Lv13;稀有道具低等级不提供; **万宝符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 站开播/下播)

  • 原理:批量轮询 B 站公开 API(getRoomBaseInfo,无需登录/Token,一次查询所有监控房间),每 60 秒一次,检测 live_status 变化
  • 判定规则:仅 live_status == 1(直播中)视为开播;轮播(2)不视为开播
    • 0/2 → 1:开播通知
    • 1 → 0/2:下播通知
  • 通知内容
    • 开播:直播间标题 / 主播名 / 开播时间 / 直播间链接,附带直播间封面图(由程序下载到本地后以图片消息发送)
    • 下播:直播间标题 / 主播名
  • 绑定规则:一个群最多绑定 1 个直播间;一个直播间可绑定多个群(1 对多)
  • 管理:管理页「直播间监控」卡片可 添加(群号 + 房间号 + 备注)/ 停用 / 启用 / 删除 / 立即检测;卡片内设有独立监控日志区(实时显示轮询、开播/下播、增删启停等记录,每 3 秒自动刷新)
  • 首次监控只记录当前状态、不通知,避免误报;网络/接口异常跳过本轮、不更新状态
  • 备注字段可选(未填时主播名/标题取 B 站接口返回)

UP 主动态监控(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

使用流程

  1. 打开管理页,配置连接并确认"已连接"
  2. 在「群聊白名单」中添加目标群号
  3. (可选)在「直播间监控」中添加要监控的 B 站房间号并绑定群号,开播/下播自动推送
  4. (可选)在「动态监控」中添加要监控的 UP 主 UID 并绑定群号,新动态自动推送(CDP 浏览器登录态优先;无 CDP 时可用 bili_cookies.txt 注入登录态 Cookie,见「动态监控」节)
  5. 在白名单群里发送:
    • /签到:每日签到,随机获得铜币/银币
    • /转职 战士|魔法师:选择职业 → /武器库 查看可买装备 → /购买 短剑/出售
    • /晋升:地下城进度达标后提升阶级(解锁更高阶装备)
    • /地下城 进入:开始冒险(持有任意 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 改动需重启进程

About

通过 WebSocket 连接 OneBot 11 服务端,具备前端管理页面

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages