常见问题

最常被问到的问题与解答。

15

搜索与查找玩家

为什么名称搜索只能找到曾在本站被查看过的玩家?

因为官方 API 没有名称搜索。它只能查询完全一致的标签,仅此而已——没有任何端点能用名称换回玩家列表。

所以名称搜索查的其实是本地索引。每个在本站被打开过的玩家资料都会被保存,名称也一并记下,之后才能用名称找到这位玩家。首次以有效密钥启动时,还会遍历官方奖杯排行榜(global 加上数十个国家/地区)为索引播种,因此全新安装不会完全是空的。

用标签搜索一次,该玩家就会永久加入索引。曾用名称也会保留,改名不会让记录消失——搜索页的“包含曾用名称”选项读的正是这份记录。

上周还能找到的玩家从搜索里消失了,发生了什么?

刷新循环会按计划向 API 询问每一个已收录的标签。当 API 返回 404——账号已删除,或该标签从未存在——这一行就会连同名称与俱乐部记录一起删除。留着它只会把请求浪费在注定失败的标签上,还会在搜索结果里留下幽灵。

玩家资料下方的“api”、“cache”、“demo”是什么意思?

每次获取数据时都会一并报告来源。api 表示本次页面渲染时直接从 Supercell 拉取。cache 表示存储的副本仍在保鲜期内——玩家三分钟、俱乐部十分钟——或实时请求失败时改用最后一份完好的副本,而不是显示错误页。demo 表示未配置 API 密钥,页面显示的是固定种子生成器的数据。

本站当前连接实时 API 运行。

对战与统计

为什么对战记录只覆盖 25 场?

因为 API 提供的完整对战记录就只有最近 25 场,没有分页、也没有日期范围。更长的历史只能靠日积月累。

所以每次有人打开玩家资料,那 25 场中的新对战就会复制进本地归档,并以键值去重,同一场对战永远不会存两次。经常被查看——或被加入书签而进入快速刷新档位——的玩家,随时间会累积远超 25 场的记录。逐场归档的数据保留 90 天后清理。

对战页签上的各项统计以当前 25 场窗口计算,这也是为什么打完一轮之后数字可能大幅波动。

强度榜究竟是怎么算出来的?

从归档的对战出发,按日期、模式、地图与区间逐日汇总。强度榜读取所选条件最近七天的数据,并忽略该窗口内出场少于 200 次的英雄。

分数不是原始胜率。每位英雄的胜场会先与整体平均混合:加入约 1,500 场按全体平均胜率计的虚拟对战——也就是经验贝叶斯收缩。打了 210 场、正在连胜的英雄会被拉回平均附近;打了 40,000 场的几乎不动。接着以对数尺度加入一个小权重的出场率项,避免没人玩的英雄靠小众胜率登顶。

字母是该地图分数分布上按标准差切出的区段,不是固定的胜率门槛。S 大约在平均以上 1.25 个标准差,低于平均约 1 个标准差以上则落入最低的 D。因此梯度永远是相对于你正在看的那张地图。

为什么强度榜有时显示为演示数据?

特定地图的强度榜要先有真实样本才有意义。如果该模式、地图与区间归档的对战不足 5,000 场,页面会退回固定种子生成器并在顶部明说,而不是悄悄端出用 80 场拼凑的榜单。热门排位地图最先填满;冷门活动地图可能长期停留在后备数据。

“估计游玩时间”到底是什么?

一个推导出来的数字,而且在所有出现之处都如此标注。API 完全不提供游玩时间——只有胜场数。

它从胜场往回推:3v3 胜场按常见胜率约换算成两倍场次,单人生存战夺冠代表远多于此的场次,每场再乘以该模式的平均时长,账号等级则覆盖不计入胜场统计的部分。普通账号误差约在 15% 以内;主要打友谊赛或活动模式的玩家误差更大。

生存战的名次算胜场吗?

算,只要在前半。生存战的 API 只给名次不给胜负,因此 10 人单人战的前 5 名、5 队双人战的前 3 名,在所有显示胜率之处都计为胜场——切点是名次前半、向上取整,这也是为什么队伍数为奇数时,中间名次归在胜方。平局另计,且不计入胜率分母。

为什么排位段位分布被标注为模型?

没有任何天梯人口端点。Supercell 以外没有人能数出每个段位有多少玩家。分布页显示的是带有估计总量的模型形状;能显示的实测数字只覆盖本站已收录的玩家资料——是样本,不是整个天梯。形状可供参考,绝对数字请当作估计值看待。

为什么有些英雄没有稀有度,或显示为灰色?

API 返回英雄的 id、名称、随身工具、星徽能力、装备与超级充能——但不含稀有度与定位。那些来自按名称匹配的内置对照表。在对照表最后更新之后推出的英雄没有对应条目,因此标为未知、以中性灰呈现,并被排除在稀有度统计之外,而不是硬给一个看似合理的猜测。内置名册最后同步于 2026-09-15,计算器表格则对应游戏内数值,快照日期为 2026-09-16

数据新鲜度与 API 密钥

这里的数据多久刷新一次?

两套机制并行。打开页面时,若存储副本超过其保鲜期——玩家三分钟、俱乐部十分钟——就会直接重新拉取。

后台则有一个轮询器每 30 秒唤醒一次,每轮以约 100 个请求的预算处理最过期的条目,并受速率限制约束,让整个流程不超出密钥的额度。预算的去向由优先档位决定:被加入书签或最近一小时被查看的账号约每两分钟刷新,最近一天被查看的每十五分钟,其余每六小时一次。这条资料刷新流程只为前两个档位顺带拉取对战记录。

但对战记录本身不限于这两个档位。另有一条独立的采集流程——通常占每轮预算约一半——按各账号对战记录距上次收集的时间遍历整个索引(冷账号也在内),凡超过半小时未采集的玩家都会再拉一次记录。没有人查看的账号仍然在打对战,而那些对战正是强度榜样本的来源。

在无服务器平台上没有常驻进程可维持这个间隔,因此轮询器会关闭,改由外部调度器调用 cron 端点。

API 密钥绑定的 IP 地址变了会怎样?

Supercell 的 API 密钥绑定固定 IP。服务器的公网 IP 一旦改变——换主机、动态家用网络、不同出口节点——所有请求都会开始收到明确表示“IP 不符”的 403。

发生时,刷新循环会提前中止,而不是把整轮预算烧在注定失败的请求上;错误与原因提示会被记录,页面改用最后的缓存副本——网站照常运转,只是冻结在当下。解决办法是到 developer.brawlstars.com 为当前公网 IP 创建新密钥,填入环境变量后重启。

账号与自行部署

我的账号存了什么?

用户名、加盐的 scrypt 密码哈希、偏好语言、两个时间戳,以及一个经过验证的电子邮箱地址:注册时会向邮箱发送一组 6 位数验证码,输入正确后才会创建账号。这个地址只用于验证本身与账号安全通知;本站能发到这个地址的信,完整清单如下——这份清单直接由发信程序生成,不是手写的:

  • 注册时发出的六位数验证码,输入之后账号才会创建
  • 更换地址时发到新地址的六位数验证码
  • 地址变更完成后,发到旧地址的通知,让变更不会悄悄发生
  • 有人把你的地址填进注册表单时,发给你的提醒
  • 有人想把你的地址改挂到别的账号上时,发给你的提醒

不会发送邮件订阅,也不会提供给任何第三方。要注意的是,目前仍然没有密码重置——有邮箱也还找不回忘记的密码。

除此之外:最多 25 个书签与最近浏览的 25 个资料,两者都绑定账号、跨设备同步,以及一枚有效期 90 天的会话 cookie。以上是注册本身会产生的东西,不是完整清单:头像、绑定的玩家标签、上传的图片、聊天与私信、公告板帖子与好友,也都会随你自己加上去而记在账号名下——完整清单由隐私政策第 2 节直接从数据表结构生成。删除账号会连同邮箱地址、书签、浏览记录与会话一并清除。你在问题反馈表单上填的邮箱是另外一回事,属于那一则反馈而不属于账号。

怎么在本地部署这个网站?

需要 Node 22 以上,因为持久化使用 Node 内置的 SQLite——没有原生模块要编译,也没有数据库服务器要安装。安装依赖后,在 3000 端口启动开发服务器即可。

没有 API 密钥也能运行:一切退回固定种子生成器,并播种一个演示目录让名称搜索有结果可回。把密钥加入本地环境文件并重启后,首次实时启动会清除所有合成数据行,它们永远不会渗入搜索结果或排行榜。

内置游戏数据(英雄、随身工具、星徽能力、超级充能)由同步脚本更新,而不是在运行期拉取。

这是官方网站吗?

不是。这是非官方的粉丝内容,建立在公开的 Brawl Stars API 之上,未经 Supercell 认可——每一页的页脚都有同样的声明,旁边就是 Supercell 粉丝内容政策的链接。

更多

这里没覆盖的问题,答案多半在技术说明搜索规格之中。

常见问题 · BrawlPeek