ericwyuan
042c4d52be
fix(sync): 被 Garmin 限流时说人话,并停止把限流越撞越深
服务器上的数据停在 8-25,而同步状态是 error、卡在「连接 Garmin」,
记录的原因是 `JSONDecodeError: Expecting value: line 1 column 1`。
真相:Garmin 返回的是 HTTP 429,响应体是纯文本 "Rate limited"(12 字节),
garth 把它交给 json.loads,于是限流被伪装成了解析错误。令牌本身好好的,
oauth1 有效期到 2027-08-23,账号也没问题。
- 新增 RateLimited 异常并识别 429(按状态码或响应体),同步状态里显示
「Garmin 暂时限制了请求频率…令牌本身没有失效」,不再是一句解析报错。
- 命中限流后整个进程对该账号退避 30 分钟。重试正是把限流撞得更深的原因,
原来失败后每小时还接着试。
- 只在 oauth2 令牌确实过期时才 refresh_oauth2()。原先每次 _connect 都无条件
刷新一次,白白消耗配额——正是这个把账号一步步推到了 429。
排查过程中我一度误判:先以为是数据库迁移把令牌 base64 包了一层,
改了解码逻辑反而把能用的令牌弄坏(garth.loads 本来就要 base64 形式),
已还原。真正的定位靠拦截 requests.Session 打印出原始响应。
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-28 14:20:43 +08:00
..
2026-08-24 04:03:49 +08:00
2026-08-23 12:25:33 +08:00
2026-08-24 04:03:49 +08:00
2026-08-23 17:55:12 +08:00
2026-08-23 17:44:51 +08:00
2026-08-23 12:34:18 +08:00
2026-08-23 12:34:18 +08:00
2026-08-24 04:03:49 +08:00
2026-08-23 20:11:45 +08:00
2026-08-28 14:20:43 +08:00
2026-08-24 04:34:32 +08:00
2026-08-23 18:49:05 +08:00
2026-08-24 00:17:04 +08:00
2026-08-24 04:03:49 +08:00