服务器上的数据停在 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>
37 KiB
37 KiB