Add daily Feishu digest for dota2.refining.dev traffic.

Gitea Actions runs notify_site_traffic.py at 09:00 CST using Cloudflare GraphQL and a Feishu webhook (secrets from keyzoo).

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
voson
2026-07-28 15:26:07 +08:00
co-authored by Cursor
parent 9898dd39fb
commit 9f484166d4
6 changed files with 755 additions and 65 deletions
+192 -37
View File
@@ -4,11 +4,166 @@
## [Unreleased]
### Added
- 上分帝 Web 日活飞书推送:`notify_site_traffic.py` + Gitea Actions
`site-traffic-notify`(每日 09:00 CST;真实访问按已知浏览器 UA 打开 `/` 估算)。
- 上分帝 Web 顶层「走势」`#/trends[/bracket]`:近 8 周高胜率/上场率榜(初期 / 迷你走势 / 末期 / 变化;STRATZ;无禁用率;`0.5.41`)。
- 上分帝 Web 接入 STRATZ`fetch_stratz_meta.py`token 经 `.env` / keyzoo):
- 「走势」优先用 STRATZ 近几周段位胜率/上场率/场次,并展示周折线柱与分路胜率(OpenDota 作兜底)
- 新子 Tab「对位」`#/heroes/<key>/matchups`:天梯对位优势 / 被克 / 协同 Top(与网格机制「克/怕/搭」分开展示)
- 「排行」新增「英雄 Meta」模式 `#/rankings/meta[/bracket]`(按段位上场排序)
- 缓存:`data/stratz_hero_meta.json` / `data/stratz_matchup_tops.json`gitignore;仅 Web,不进 recommend / relations
- 上分帝 Web「近期比赛」Tab`#/heroes/<key>/matches`):同英雄近期局终局出装 +
加点顺序;展示选手昵称/段位勋章与 OpenDota 选手·比赛链接;
`fetch_hero_matches.py``data/hero_matches.json`
`--source league|public|both``--enrich-players` 可补昵称段位;
`--enrich-item-times` 可补购买时间;仅 Web 站点,不进局内推荐)。
- 选将规则阵容画像(不接 AI):识别敌方推进/全球流、敌我缺口(缺控制/爆发/输出/先手);
全网格标 **克 / 搭 / 补**;叠加层显示一句阵容分析;每英雄短推荐原因写入日志与
`results` JSON`draft_archetypes.py` + `recommend.suggest_marks`)。
### Changed
- 上分帝 Web「走势」:三卡 / 分路胜率统一为 **当前选中段位 · 最近 1 周**STRATZ `winWeek`);分路不再用合并档 `stats` 接口;段位栏下显示时间窗提示(`0.5.30`)。
- 上分帝 Web「走势」:近 8 周改为 **逐周列表**(日期 / 胜率 / 横向条 / 场次),Tab 内容区可滚动(`0.5.31`)。
- 上分帝 Web「走势」近 8 周:左对齐条按本英雄 8 周区间缩放、周环比、去掉 50% 中线(`0.5.37`)。
- 文档与注释统一称呼:`web/relations/` 子项目改称 **上分帝 Web**(不再称「关系预览」);路径与脚本名(如 `serve_relations.py`)暂保持不变。
- 「近期比赛」公开对局默认优先国服(Perfect World cluster`--public-region china`),联赛+天梯可用 `--source both`;卡片来源显示「国服 / 天梯 / 联赛」。
- 「近期比赛」改为展示最近 10 场胜局(传奇及以上天梯 + 联赛/职业,按时间从新到旧);公开列表过滤机器人/Turbo,仅保留 ranked lobby`0.5.40`)。
- 选将推荐不再限 Top-3 名次青标;非定位局也可推克/搭/补(无分路字则不过滤)。
## [0.5.29] - 2026-07-28
### Added
- 上分帝 WebSTRATZ 走势 / 对位 Tab / 英雄 Meta 榜(见 Unreleased 明细;站点版本 `0.5.29`)。
## [0.5.28] - 2026-07-28
### Added
- 「近期比赛」出装图标叠加购买时间(MM:SS,支持负值);数据来自 OpenDota
`purchase_log`(未解析对局无时间)。中立装用 `neutral_item_history`
- `fetch_hero_matches.py --enrich-item-times`:只补时间字段,无需全量重拉列表。
### Changed
- 「近期比赛」出装布局对齐 OpenDota:主栏一行、背包第二行(背包轮廓图标),去掉竖分隔线。
## [0.5.27] - 2026-07-28
### Changed
- 「近期比赛」卡片头:昵称旁不再显示段位文字(如「冠绝」);保留勋章图标,排行榜 # 放进勋章 tooltip。
## [0.5.19] - 2026-07-28
### Fixed
- 排行页标题「Immortal 排行榜」与 info 图标保持同一行不换行。
## [0.5.18] - 2026-07-28
### Changed
- 排行页「Immortal 排行榜」标题旁增加与走势页一致的 info 气泡提示(官方 Immortal 地区榜 · 各区分数不可比)。
## [0.5.13] - 2026-07-28
### Changed
- 排行榜按视口居中(不含右侧说明);说明绝对定位贴在榜单右侧。
## [0.5.12] - 2026-07-28
### Fixed
- 排行表分割线错位(去掉选手列 flex)。
## [0.5.11] - 2026-07-28
### Changed
- 排行页右侧说明贴紧榜单(与榜单成组居中),不再贴屏幕右缘。
## [0.5.10] - 2026-07-28
### Changed
- 排行页国籍列显示中文国名(未知代码仍回退为原代码)。
## [0.5.9] - 2026-07-28
### Changed
- 排行页战队 / 国籍无数据时留空,不再显示「—」。
## [0.5.8] - 2026-07-28
### Changed
- 排行页:榜单单独居中,右侧说明贴屏幕右缘(不再与榜单成组居中)。
## [0.5.7] - 2026-07-28
### Changed
- 排行页新增「战队」列(原选手行内战队标签拆出)。
## [0.5.6] - 2026-07-28
### Changed
- 排行页新增「国籍」列(原选手行内国旗代码拆出)。
## [0.5.5] - 2026-07-28
### Changed
- 排行页去掉官方榜说明文案。
## [0.5.4] - 2026-07-28
### Changed
- 排行页副标题去掉地区名与「Top 100」,仅保留更新时间。
## [0.5.3] - 2026-07-28
### Changed
- 排行页:榜单居中,标题 / 地区切换 / 说明贴在右侧。
## [0.5.1] - 2026-07-28
### Added
- 上分帝 Web「排行」页(`#/rankings`,插在英雄之后):Valve Immortal 四区榜
Top 100(中国 / 欧洲 / 美洲 / 东南亚);`fetch_leaderboards.py`
`data/leaderboards.json`(仅排名+昵称等,无 MMR/账号 ID)。
## [0.5.0] - 2026-07-28
### Added
- 上分帝 Web「走势」Tab`#/heroes/<key>/trends`):OpenDota 近约 7 天各段位
胜率 / 上场率 / 场次;顶部勋章条(先锋→冠绝)切换段位。
- `fetch_hero_stats.py``data/hero_stats.json`(含 `totals` / `window_*`);
仅 Web 站点,不进 `relations.json` / 局内推荐。
- 核心装备图标显示列表内相对使用率 %OpenDota popularity 归一化)。
- 冠绝勋章旁说明:样本过小则与超凡合并展示。
### Changed
- 走势布局居中:勋章条 + 三卡,无段位列表 / 被禁率;勋章约 90px。
- 静态资源增加 `/rank/``assets/rank_icons/rank_icon_1..8.png`
## [0.4.2] - 2026-07-27
### Changed
- 关系预览静态图标(头像 / 装备 / 技能 / 属性等)改由阿里云 OSS 同桶托管;
- 上分帝 Web静态图标(头像 / 装备 / 技能 / 属性等)改由阿里云 OSS 同桶托管;
`config.js` 新增 `STATIC_ASSET_BASE`,生产 Pages 包体约 **2 MB**(仅
HTML/JS/data),换机部署无需本地 fetch 图标。同步脚本
`_oss_static_assets.py upload`
@@ -21,7 +176,7 @@
### Changed
- 线上关系预览技能演示视频改由阿里云 OSS 托管(桶 `climperor`
- 线上上分帝 Web技能演示视频改由阿里云 OSS 托管(桶 `climperor`
`https://climperor.oss-cn-shanghai.aliyuncs.com/ability-video/...`),不再打进
Cloudflare Pages;本地 `serve_relations.py` 仍读 `assets/ability_videos/`
导出写入 `config.js``ABILITY_VIDEO_BASE``export_relations_site.py
@@ -39,7 +194,7 @@
### Added
- 新增 `deploy_relations.py`:一键把关系预览静态站点部署到 Cloudflare Pages
- 新增 `deploy_relations.py`:一键把上分帝 Web静态站点部署到 Cloudflare Pages
—— 串联导出(`export_relations_site.py`)→ 资产完整性预检(缺图则中止)
`wrangler pages deploy` 直传 `dist/relations/` → 绑定自定义域名。凭据
经 keyzoo 注入(`refining/cloudflare` 的 Global API Key)或手动
@@ -60,24 +215,24 @@
- 修复 `serializeHash` 生成 `#heroes`(缺 `/`)导致刷新后路由解析异常的
问题,现统一为 `#/heroes` 形态。
- 版本日志中未知单位 id 不再显示 `# 1961` 原始数字,回退为「其它单位」。
- 本地预览 `serve_relations.py` 增加 CSP 响应头(`default-src 'self'` 等),
- 本地开发服务 `serve_relations.py` 增加 CSP 响应头(`default-src 'self'` 等),
限制资源只从本站加载。
- `data.json` 加载失败时显式抛出 HTTP 状态错误,不再静默进入异常渲染。
### Performance
- 关系预览缓存英雄技能条目(`skillEntriesFor`)与血蓝条量程
- 上分帝 Web缓存英雄技能条目(`skillEntriesFor`)与血蓝条量程
`resourceBarScale`)计算结果,数据重载时失效,减少重复遍历。
## [0.3.0] - 2026-07-27
### Added
- 关系预览「版本」页改为默认展示**最新版本**的完整改动详情(综合 / 物品 / 中立物品 /
- 上分帝 Web「版本」页改为默认展示**最新版本**的完整改动详情(综合 / 物品 / 中立物品 /
英雄),顶部下拉可切换近一年内的其它版本;`fetch_patches.py` 重写为抓取近一年
(默认 365 天,`--days` / `--since` 可调)版本列表 + 逐版本 `patchnotes` 详情,
构建 `lookup`ability_id / hero_id → 名称 + 图标 key)并下载引用到的物品 / 技能
图标到 `assets/`,静态导出与本地预览均自包含、不联网。
图标到 `assets/`,静态导出与本地开发服务均自包含、不联网。
- 版本页排版对齐官网:左大标题「游戏性更新 {版本}」+ 右选择框,内容居中窄列;
物品图标按 Steam CDN 88×64 比例(66×48)显示(修复正方形框上下黑边);英雄头像
复用英雄页 16:9 宽卡(`?v=wide``object-fit:contain`)不再裁切面部;图标放大
@@ -88,19 +243,19 @@
技能页 bundled `innate.png`(从 `hero_abilities.is_innate` 构建先天 key 集合判断),
覆盖 117 个被引用的先天技能。
- `hero_notes` 属性标签补全 `movement` → 「移速」(修复原始英文 `movement` 漏显示)。
- 新增 `export_relations_site.py`:一键导出关系预览为纯静态站点(`dist/relations/`),
- 新增 `export_relations_site.py`:一键导出上分帝 Web为纯静态站点(`dist/relations/`),
内含 `data.json` 快照 + 前端 + 图片资源,可直接部署到任意静态托管;
`--with-videos` 可选拷贝技能演示视频(体积数 GB)。
- 关系预览前端资源路径改为相对路径(`data.json` / `attr/` / `portrait/` / `item/` 等),
- 上分帝 Web前端资源路径改为相对路径(`data.json` / `attr/` / `portrait/` / `item/` 等),
静态托管在子路径下也能正常工作;`serve_relations.py` 同时提供 `/data.json` 路由,
本地预览行为不变。
- 关系预览技能详情:左侧播放官网技能演示视频(`assets/ability_videos/` 本地缓存,
本地开发服务行为不变。
- 上分帝 Web技能详情:左侧播放官网技能演示视频(`assets/ability_videos/` 本地缓存,
`/ability-video/<英雄>/<技能>.webm` 路由),右侧为技能名与描述(对齐官网左右分栏);
未缓存的技能自动隐藏视频,描述列占满整行。
- 英雄详情的装备详情区不再重复显示大图(上方装备行已有图标)。
- 关系预览技能详情新增「施法前摇」「吟唱时间」两行(取自 Valve `cast_points` /
- 上分帝 Web技能详情新增「施法前摇」「吟唱时间」两行(取自 Valve `cast_points` /
`channel_times`,逐级相同则合并为单值);`fetch_hero_abilities.py` 全量重抓后生效。
- 关系预览技能详情按 dota2.com.cn 版式重排:移除右上重复的技能大图标(上方技能列表
- 上分帝 Web技能详情按 dota2.com.cn 版式重排:移除右上重复的技能大图标(上方技能列表
已高亮选中项);属性值(技能/伤害类型/免疫/驱散/施法距离等)双列网格、特殊数值
自适应多列网格(消除右列大片空白);冷却/蓝量移到带图标的底栏——冷却用官方
`cooldown.png`(新增 `assets/ui_icons/` + `/ui-icon/` 路由,静态导出一并拷贝),
@@ -112,10 +267,10 @@
不再被牵连出滚轮;压缩参数行距使典型技能在高屏零滚轮(无头 Chrome + CDP 实测
`scrollHeight == clientHeight` 验证)。整块宽度上限 1000→1320px、视频 700→820px、
详情列 720→760px。
- 关系预览顶栏左上角新增 Dota 2 logo +「上分帝」标题(`assets/ui_icons/dota2_logo.png`
- 上分帝 Web顶栏左上角新增 Dota 2 logo +「上分帝」标题(`assets/ui_icons/dota2_logo.png`
透明 emblem),经 `/ui-icon/` 路由与静态导出统一分发;窄屏自动隐藏标题或整组标识,
不影响居中分页布局。
- 关系预览新增 **Hash 路由**:顶层标签(英雄 / 物品 / 版本)、选中英雄 + 详情子标签
- 上分帝 Web新增 **Hash 路由**:顶层标签(英雄 / 物品 / 版本)、选中英雄 + 详情子标签
(技能 / 核心装备 / 被克装备 / 版本变更)、物品页选中物品、版本页选中版本均同步进
URL;英雄页的定位标签筛选与搜索框文本以 query 参数(`?tags=核心,辅助&q=axe`)进
URL。形态如 `#/heroes/axe/core``#/items/black_king_bar``#/patches/7.41`
@@ -179,15 +334,15 @@
### Added
- 关系预览英雄详情:基础属性条(力量/敏捷/智力 + 成长、初始生命/魔法与恢复;
- 上分帝 Web英雄详情:基础属性条(力量/敏捷/智力 + 成长、初始生命/魔法与恢复;
附攻击/护甲/移速/攻击距离)。数据来自 OpenDota(`fetch_cdn_templates.py`
`data/heroes.json`),主属性高亮。
- `fetch_ability_videos.py`:从 Steam CDN 批量拉取官网技能演示(webm/mp4),
默认限速约 1.5s+抖动,支持断点续传与 404 缓存;输出 `assets/ability_videos/`(不入库)。
- 装备说明填充 Valve `%token%` 数值(如飓风长戟「飓风之力」);
`fetch_items_meta.py --reformat-desc`,共用 `loc_format.py`
- 关系预览英雄详情底部分页:**技能** / **核心装备** / **被克装备**
- 关系预览新增顶级 **物品** 页(与英雄同级):对齐 dota2.com.cn 商店物品
- 上分帝 Web英雄详情底部分页:**技能** / **核心装备** / **被克装备**
- 上分帝 Web新增顶级 **物品** 页(与英雄同级):对齐 dota2.com.cn 商店物品
**11 列竖排**(基础分类 / 合成分类),详情在右侧;目录来自官网
`itemscategory/json``fetch_item_shop.py``data/item_shop.json`),
并展示合成组件(含卷轴)与「可升级为」。
@@ -195,16 +350,16 @@
详情(含装备合成)展示在下方详情区(非弹窗)。
- 「害怕」装备规则完善:莲花 `spell_reflect`、点目标技能自动关联莲花/林肯;
`data/hero_fear_overrides.json` 补经典克制(如剑圣→莲花)。
- 关系预览技能区对齐官网:可点选技能 / 魔晶 / 神杖升级,右侧显示描述;
- 上分帝 Web技能区对齐官网:可点选技能 / 魔晶 / 神杖升级,右侧显示描述;
下方展示天赋树(25→10)。数据来自 Valve herodata`fetch_hero_abilities.py`)。
- 关系预览选中英雄后展示技能(图标 + 名称;可驱散角标;悬停看描述);
- 上分帝 Web选中英雄后展示技能(图标 + 名称;可驱散角标;悬停看描述);
数据来自 `data/hero_abilities.json`,图标按需缓存到 `assets/ability_icons/`
- 关系预览「怕的装备」:`fetch_items_meta.py`Valve/OpenDota 描述 → 机制标签)、
- 上分帝 Web「怕的装备」:`fetch_items_meta.py`Valve/OpenDota 描述 → 机制标签)、
`fetch_hero_abilities.py`(技能驱散等汇总)、`item_fears.py`(规则映射)→
`data/items_meta.json` / `hero_abilities.json` / `hero_item_fears.json`
详情区在「核心」下增加「怕」行。例外标签见 `data/item_tag_overrides.json`
本阶段仅预览,无对局内出装推荐。
- 关系预览选中英雄后,下方展示中文定位 `tags` 与核心成品装备(不再分阶段);
本阶段仅 Web 站点,无对局内出装推荐。
- 上分帝 Web选中英雄后,下方展示中文定位 `tags` 与核心成品装备(不再分阶段);
`fetch_hero_items.py`OpenDota 热度合并 + Valve 中文名,Steam CDN 图标 →
`data/hero_items.json` / `assets/item_icons/`(过滤消耗品/中立/廉价件;
坚韧球/夜叉等中间件若该英雄常继续合成则隐藏,停在该件则保留)。
@@ -218,34 +373,34 @@
- `data/heroes.json` 增加中文口语别名 `aliases`(如斯拉达→大鱼人、主宰→剑圣);
`fetch_cdn_templates.py` 重拉时按 `key` 合并保留,不覆盖手工收录。
- `data/heroes.json` 增加英文缩写 `abbr`(小写列表,如 nec / vs / pa);
关系预览搜索支持缩写且不区分大小写;重拉模板时保留该字段。
上分帝 Web搜索支持缩写且不区分大小写;重拉模板时保留该字段。
- `fetch_stratz_matchups.py` + `audit_relations.py`:拉取 STRATZ 对位并与 OpenDota
交叉审计定性关系,输出 `data/relations_audit.json`
- 定性关系库 `data/relations.json`(克制有向边 + 搭档 + 理由);
`import_relations_xlsx.py` 可从选将笔记导入;`serve_relations.py` 三视图只读预览(改 JSON 后刷新)。
- `fetch_hero_portraits.py` 下载 dota2.com/heroes 竖版头像到 `assets/hero_portraits/`
关系预览网格使用(与匹配用 `templates/cdn/` 分离)。
上分帝 Web网格使用(与匹配用 `templates/cdn/` 分离)。
- 英雄中文定位标签 `tags`(核心/辅助/推进/逃生/爆发/先手/控制/耐久/幻象);
关系预览页可筛选,不参与推荐打分。
- 关系预览属性图标改用 dota2.com 官方素材(`assets/attr_icons/`),不再手绘。
上分帝 Web 页可筛选,不参与推荐打分。
- 上分帝 Web属性图标改用 dota2.com 官方素材(`assets/attr_icons/`),不再手绘。
- 选将 Top-3 推荐改为读定性关系:+克制敌方 / −被敌方克 / +己方搭档;
叠层左上角青方标显示名次 1/2/3。
- draft JSON / GSI `self` 透传 `accountid``steamid`
### Changed
- 关系预览英雄详情(`#detail`):贴视口底部展示(`margin-top: auto`,高度仍按内容收缩);
- 上分帝 Web英雄详情(`#detail`):贴视口底部展示(`margin-top: auto`,高度仍按内容收缩);
与上方英雄选择区保留约 16px 间距;标题 / 属性条 / 分页 / 技能与装备行 / 检视区整体水平居中(最大宽约 820px),长描述在居中容器内仍左对齐。物品页布局未改。
- 关系预览技能详情区不再重复放大技能图标;顶栏选中态即可识别,详情只保留名称 / 标签 / 驱散 / 描述(核心/怕装详情仍显示装备大图)。
- 关系预览先天技能统一使用共用金色水滴图标 `assets/ability_icons/innate.png`
- 上分帝 Web技能详情区不再重复放大技能图标;顶栏选中态即可识别,详情只保留名称 / 标签 / 驱散 / 描述(核心/怕装详情仍显示装备大图)。
- 上分帝 Web先天技能统一使用共用金色水滴图标 `assets/ability_icons/innate.png`
(多数 innate 在 Steam `dota_react/abilities` 上 404),技能行与详情区不再破图占位。
- 关系预览英雄详情:技能图标与核心/怕装列表图标加大(技能 68px、装备 72×54),
- 上分帝 Web英雄详情:技能图标与核心/怕装列表图标加大(技能 68px、装备 72×54),
便于点选;商店页 `.shop-item` 尺寸未改。
- 物品页详情面板改为与 11 列商店并排居中集群(`sticky`),贴在商店右侧约 16px
不再固定贴视口右缘;窄屏仍堆叠置顶。
- 物品页:`#items-view` 限制为视口内滚动容器,避免 `sticky` 详情随窗口滚动盖住商店列;
空状态去掉过大 `min-height`,面板高度随内容收缩。
- 关系预览天赋树改为官网弹层风格(居中「天赋树」、25→10 圆形等级徽标、左右选项行)。
- 上分帝 Web天赋树改为官网弹层风格(居中「天赋树」、25→10 圆形等级徽标、左右选项行)。
- `heroes.json` 迁至 `data/heroes.json`;可再生成的对位/审计/报告文件改由 `.gitignore` 忽略。
- `assets/role_icons/` 改用 Valve 游戏内选人筛选图标(`filter_*`);灰蓝底板 + 深色
符号,透明角填品红 chroma,叠层不再出现黑边。
@@ -268,24 +423,24 @@
### Fixed
- 关系预览英雄卡片 title 垃圾清理:`data/relations.json` 的 counters 被
- 上分帝 Web英雄卡片 title 垃圾清理:`data/relations.json` 的 counters 被
`relations_patch_draft.json` 注入 100 条 reason 为 `opendota_adv/stratz_adv`
胜率数值的边(违反 `meta.note: no winrate` 与 AGENTS.md「不要用胜率/场次表达
机制克制」),拼进 hover title 显示为「opendota_adv=0.13; stratz_adv=4.47」
之类。删除这 100 条 numeric-reason 边(含水人 axe/hoodwink/windrunner →
morphling 三条),保留 5 条定性 + 149 条空 reason counters + 11 条
synergies(空 reason 经 `.filter(Boolean)` 不进 title)。
- 关系预览英雄页:`#detail` 不再 `flex: 1` 撑满网格下方剩余视口(短内容时大片黑底空白);
- 上分帝 Web英雄页:`#detail` 不再 `flex: 1` 撑满网格下方剩余视口(短内容时大片黑底空白);
改为按内容收缩(`fit-content`),并用 `max-height` 限制长文案在面板内滚动。
- 关系预览技能行对齐官网:左起「天赋树图标 → 先天圆形图标 → 方形技能」;天赋详情改为
- 上分帝 Web技能行对齐官网:左起「天赋树图标 → 先天圆形图标 → 方形技能」;天赋详情改为
悬停/点击浮动弹层(不再内联占高);图标见 `assets/ability_icons/talent_tree.png`
- 关系预览天赋树数值修复:天赋 `name_loc``{s:bonus_<sv>}` token 原全部
- 上分帝 Web天赋树数值修复:天赋 `name_loc``{s:bonus_<sv>}` token 原全部
显示为 `+?`/`-?``format_loc` 只读 `values_float``talent_rows` 只传天赋
自身空 `special_values`)。改为跨技能按 talent key 索引 `bonuses` + sv 名
/单 token 配对两层兜底填 `bonus.value`;重生成 `data/hero_abilities.json`
1016 条全部恢复。naga_siren「捕捞速度」上游缺 bonus,经
`data/talent_overrides.json` 手工补 `+125`
- 关系预览核心装备「阿哈利姆福佑」→「阿哈利姆神杖」:`ultimate_scepter_2`
- 上分帝 Web核心装备「阿哈利姆福佑」→「阿哈利姆神杖」:`ultimate_scepter_2`
(id 271) 是神杖 (id 108) 的激活形态,OpenDota 分开计数导致 37 个英雄
核心装备列表出现「福佑」甚至神杖+福佑并存。`fetch_hero_items.py` 新增
`fold_blessing_into_scepter` 把 blessing 计数按 max 合并入 scepter