Skip to content

Commit e30e231

Browse files
fix(leaderboard): 脚本 UA 换 Chrome 伪装规避 CF Bot Fight
故障复盘 PR #322 合并后 prod build 跑 generate-leaderboard.mjs 拿到 Cloudflare 的 403 + "Just a moment..." 挑战页,脚本走 fallback 写空数组上线, 首页 Top Rank / /rank contributors 全空。 根因 api.involutionhell.com 走 Cloudflare,默认 Bot Fight Mode 对短时间内多次 请求或低信誉 IP 段(Vercel build runner)会临时 challenge。当时虽然 UA 含 "build" 关键词加重了被拦概率,但实测换任意 UA 当下都能 200,所以本质是 CF 信誉评分 + 时间窗叠加。 本 PR 脚本 UA 从 "InvolutionHell-build/1.0 (generate-leaderboard.mjs)" 改为标准 Chrome UA,避免任何 "build/script/bot" 关键词触发 CF UA 启发式判定。 跟 backend OgFetchService 的 UA 伪装策略对齐。 长期建议(不在本 PR 范围) 在 Cloudflare 给 api.involutionhell.com/api/public/* 加规则: Action: Skip → "Browser Integrity Check" + "Bot Fight Mode" 让公开 API 永远绕过挑战。需要在 CF dashboard 操作。 修复路径 合并 → CI 触发 prod redeploy → generate-leaderboard 拉到真实 21 条 → 首页 Top Rank / /rank contributors 恢复正常。
1 parent 1bf07ca commit e30e231

1 file changed

Lines changed: 9 additions & 1 deletion

File tree

scripts/generate-leaderboard.mjs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,15 @@ async function fetchAggregatedFromBackend() {
103103
const res = await fetch(LEADERBOARD_API_URL, {
104104
headers: {
105105
accept: "application/json",
106-
"user-agent": "InvolutionHell-build/1.0 (generate-leaderboard.mjs)",
106+
// UA 用 Chrome 伪装:API 站点走 Cloudflare,CF 默认 Bot Fight Mode 会
107+
// 把任何含 "bot" / "build" / "script" 关键词的 UA 当机器人拦下,回
108+
// 403 + "Just a moment..." 挑战页(之前的 UA 就被这么拦了,导致 prod
109+
// build 拿到 403 走 fallback 写空 leaderboard,feed 卡片全空)。
110+
// 长期方案应是在 CF 给 /api/public/* 加 "Skip Bot Fight" 规则白名单,
111+
// 这里的 UA 伪装只是兜底。
112+
"user-agent":
113+
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 " +
114+
"(KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
107115
},
108116
signal: controller.signal,
109117
});

0 commit comments

Comments
 (0)