花一整天写解析器,然后发现腾讯已经帮我做完了

用 CDragon 自己写英雄联盟技能数值解析器,debug 到 93% 覆盖率。然后有人丢了一个腾讯 API 链接过来——0 解析,100% 覆盖。

· 2 min read

花一整天写解析器,然后发现腾讯已经帮我做完了

这个故事分三幕。

第一幕:我以为问题很简单。 第二幕:我发现问题很复杂。 第三幕:我发现问题根本不该用这种方式解决。


先说背景

我做了一个英雄联盟桌面助手。Tauri + Rust + React,悬浮窗,玩家在游戏里能看到英雄技能的完整数值——各等级伤害、冷却时间、法力消耗。

游戏里的技能描述是这样的:

造成 @BaseDamage@ 物理伤害

Riot 的存储方式不是直接给你”30/60/90/120/150”,而是:

  • 模板字符串:造成 @BaseDamage@ 物理伤害
  • 数值表:BaseDamage = [0, 30, 60, 90, 120, 150]

第 0 个是占位,1-5 是各等级。游戏运行时做替换。

所以我的工作就是——写一个替换引擎。

听起来简单对吧?


第一幕:我觉得这不难

数据来源有两个:

  • LCU(英雄联盟客户端本地 HTTP 接口,端口 2999)→ 给你技能描述模板
  • CDragon(社区维护的数据镜像站)→ 给你完整的数值表

我先写单元测试验证 CDragon 解析层。8 个测试,全绿。

然后我跑起来一看——所有技能数值都是 0。


第二幕:Debug 地狱

Bug 1:大小写

CDragon HashMap 存的 key 是 "Q""W""E""R"。 LCU 返回的 spellKey 是 "q""w""e""r"

Rust 的 HashMap 大小写敏感。get_spell("q") 永远返回 None

修了。

Bug 2:切片

数值表是 [0, 30, 60, 90, 120, 150],第 0 个是占位符,应该跳过。代码没跳。显示 0/30/60/90/120/150

修了。

Bug 3:跨技能引用

有些模板写 @spell.GnarE:Damage@,意思是”去 E 技能里找 Damage”。但代码只在当前技能里找。

修了。

Bug 4:f1 token

另一种引用语法,指向 effectAmount 数组而不是 DataValues。两种格式完全不同,要分别处理。

修了。

然后我建了一个”侦察兵”

audit_token_coverage——一次性扫描所有 191 个英雄,告诉我哪些 token 没被正确替换。

跑完一看:178/191 完美。覆盖率 93%。

剩下 13 个都是边角 case——某个英雄的某个技能用了某种罕见的引用语法。


这时候有人说了句话

你确定你需要这个功能吗?

我愣了一下。

然后他继续说:

你的应用核心价值是什么?看截图,是英雄选择情报——评分、最近 6 场战绩、连败提示、One-trick 标签。这些才是卖点。

技能数值呢?玩家鼠标悬停技能图标 0.5 秒就能看到。你的悬浮窗在游戏开始后才显示。你的面板真的比游戏内置的好用吗?

我当时没认真想,只在”怎么修完剩下 13 个”的思路里打转。


第三幕:真相

后来有人丢了一个链接:

https://game.gtimg.cn/images/lol/act/img/js/hero/{champId}.js

这是腾讯运营国服时自己整理的中文数据。我一看——

{
  "cooldown": "4/4/4/4/4",
  "cost": "60/65/70/75/80",
  "description": "造成【80/125/170/215/260】+80%【法术强度】..."
}

冷却时间:直接是字符串,不需要 token 解析。 法力消耗:直接是字符串。 伤害数值:已经替换好了。

腾讯帮我做掉了我一整天在做的所有工作。

而且不是 93%。是 100%。


真正的工作量对比

CDragon 方案腾讯 API
覆盖率93%100%
中文支持要手动翻译天然中文
解析复杂度4 层 fallback + 8 种 formula part零解析
已投入时间一整天半天集成
维护成本每个版本可能要补新 token腾讯自己维护

国内有个项目叫 frank,技能数值显示就是用这个 API。稳定、完整、不会被封。


我从这件事学到的

1. 先调研,再动手。

如果我在第一天就搜了”英雄联盟技能数据 API”,可能 8 小时前就知道腾讯这个接口了。frank 这个项目我早 8 小时看到,就能省下今天 90% 的工作。

2. 单元测试绿不代表没 bug。

测试覆盖了”解析层”,但 bug 在”调用层”。两层之间的缝隙,测试够不到。

3. 有时候最好的代码是不写。

CDragon 解析器写了上千行。腾讯 API 零解析。答案一直都在那里,只是我没去找。

4. 灵魂拷问有时比 debug 更重要。

有人问我”你确定你需要这个功能吗”的时候,我没认真想。如果我当时停下来想 5 分钟,可能就去搜替代方案了,而不是继续修第 5 轮、第 6 轮。

5. 但也不算白干。

今天的 CDragon 解析器、audit 工具、token 解析的理解、Claude Code 的协作经验——这些留下来了。不是沉没成本,是技术积累。


结局

现在的方案:

  • 腾讯 API 做主数据源(100% 覆盖,天然中文,零解析)
  • CDragon 做 fallback(万一腾讯 API 挂了)
  • LCU 补充运行时信息(当前等级、技能图标)

代码更少了,数据更准了,维护更轻松了。


有时候你花一整天解决的问题,答案是一个你根本没去搜的链接。

不是能力问题,是方向问题。