Repository navigation
v1.8.1 — 一个过期的登录状态,不再拖着整个池子陪跑
有人的卡片上,好几个账号下面顶着一大段红色英文,大意是「上游不认这个登录了,去桌面端重新登录」。话说得没错,可问题是:它只说了结论,没解决过程——那几个账号明明已经废了,每次请求还是要挨个撞一遍,撞得头破血流,旁边几个好端端的账号一次都轮不上。
事情是怎么变成这样的
上游吊销一个登录状态时,不会顺手把凭据文件里的过期时间改掉。于是本机留着一份「看起来还有效」的凭据:过期时间写着 11 月 4 日,今天才 10 月,一切正常。
插件就信了。它把这三个账号当成健康账号,按顺序一个一个试:
- 拿账号 A 去请求,上游回 401;
- 插件想「可能是 token 过期了」,于是刷新 token;
- 上游回答「这个 refresh token 早就没了」(
invalid_grant: Offline user session not found); - 插件刷新失败,但没有记仇,转头又拿 A 去试;
- 八次重试名额(
maxAttempts)就这么全喂给了同一个死账号,健康账号一次都没被碰过。
所以现象是「明明还有能用的账号,请求却一直失败」,外加卡片上一片红。
现在怎么处理
给账号加了第三种状态:判死(前两种是「正常」和「限流冷却」)。
- 只有上游亲口说死才算死。 判据是
invalid_grant/Offline user session not found这类明确答复。网络超时、DNS 抽风、5xx 一律不算——否则一次网络抖动就会把好账号关进小黑屋半小时,那比原来的 bug 还难查。 - 判死的账号立刻退出轮换,不再参与
acquire的选择,请求当场换健康账号继续,不用等到八次重试耗尽。 - 想复活有两条路:在 WorkBuddy 桌面端重新登录该账号(插件发现 refresh token 变了,自动放行),或者点卡片上的「清除所有冷却」手动再给它一次机会。
- 全池都死了的时候,返回的不再是含含糊糊的「你还没登录」,而是 401
session_dead:N/M WorkBuddy account(s) for this gateway were rejected by the upstream (their sign-in was revoked); sign in again in the WorkBuddy desktop app to restore them。「等待」和「重新登录」是两种完全不同的处置方式,不能混着报。
卡片上的红字也收拾了一下
- 原来那段整段英文报错直接铺在「积分包」面板里,把面板撑得老长,右边的「合计」都被挤出屏幕。现在折叠成一个红色小标「登录已被拒绝」,鼠标悬停才显示原文。
- 账号行上加了红色的「登录已被拒绝」标签,下面补一句「请在 WorkBuddy 桌面端重新登录该账号以恢复」——红色是故意的,用琥珀色会让人以为「等一会儿就好」,而这个状态等多久都不会好。
- 判死的账号不再参与卡片刷新时的积分 / 签到探测。以前每刷新一次卡片,就对每个死账号白打两个必定 401 的请求,刷新越勤越热闹。
已知边界
- 判死状态记在内存里,重启后重新判定。也就是说重启后的第一次请求还会再试一次那个账号,然后才把它请出去——这一次的代价是必要的,否则「重启一下就好了」的临时故障会被误判成永久失效。
- 国际版每日签到活动(
checkin-activity-status)实测当前是active: false,所以「多账号自动领 30 积分」目前没有可领的东西;国内版的活动是正常的,逐账号领取的链路本来就有。