-
Notifications
You must be signed in to change notification settings - Fork 227
Scheduler
Sliverkiss edited this page Sep 14, 2026
·
1 revision
调度器管理四类独立排程任务。每类任务有自己的时段(schedule.*_hours)与独立开关(schedule.*_enabled):
| 任务 | 默认时段 | 开关 | 行为 |
|---|---|---|---|
签到 checkin
|
09:00 / 21:00 |
checkin_enabled |
刷新 token → 每日签到 → 查余额 → 解冻冷却账号 |
猫猫旅行 travel
|
09:00 / 21:00 |
travel_enabled |
无猫领养;有猫按状态 派出 / 领奖 / 跳过 |
活跃上报 activity
|
10:00 |
activity_enabled |
对话活跃上报(点亮连登 / 解锁领养) |
token 保活 keepalive
|
22:00 |
keepalive_enabled |
全量刷新 access token,session 死亡自动禁用 |
要点:
-
hours为空数组 = 未配置 → 回落默认时段(不是禁用);*_enabled: false才是真正关闭; - 多类任务配到同一小时(如签到与旅行都含 9 点)时,该时点一并执行;
- 迟到唤醒不漏跑:任务在排程时确定,不依赖唤醒时刻的小时数;
- 全部任务关闭时调度器不空转,直接等待退出信号。
逐账号流程:
- 跳过
disabled账号与无 RefreshToken 账号; - token 临近过期(10 分钟窗口)先刷新;刷新失败的 12153 走连续计数(连续 3 次才禁用),刷新接口抖动不误杀;
-
DailyCheckin;「今天已签到」判为幂等成功(already),不是错误; -
UserResource查余额 →ReenableIfCredits解冻:仅当余额 > 0 且账号未禁用时清冷却(不清熔断——签到只证明余额恢复,熔断证明 chat 通道问题); - 冷却中的账号也参与(签到就是为了解冻它们)。
结果的 CheckinOutcome 状态:ok / already(今天已签到)/ fail / skipped(disabled / 无凭证 / global)。
串行化:同一时刻仅允许一次签到在跑(ErrBusy),防止定时触发与手动触发互相撞车重复打上游。
RunTravelNow 对每个可用账号一趟状态机推进(上限账号 800ms / 账号限速):
BuddyInfo 查询
├─ 无猫 → 同意协议(幂等)→ buddy/first 领养(+300 积分)
│ └─ 400 first_buddy task not completed yet:当日防抖,次日重试
└─ 有猫 → TravelStatus 分派
├─ arrived → 带 record_id 领奖
├─ idle → 派出(location_id=4,每日 1 次,CST 自然日重置)
└─ traveling → 跳过(在途)
- 派出地点固定
location_id=4(4 个地点收益/时长完全相同,无最优解); - 领养门槛 = 对话量(
chat_5);未达标的账号当日记一次adoptTried防抖,不重复轰炸上游; - 401 / 查询失败只跳过该账号本轮(不强行刷新 token,交 22:00 keepalive)。
RunActivityNow:对池内每个可用账号上报 report 接口(POST {billingBase} 的 active 上报路径)的 chat_request_send 事件。
- 每号上报 N 条(
schedule.activity_report_count,默认 5);N 条共用同一 conversationId(同一会话多轮对话),requestId 各自独立; - 账号内条间隔 1.5s(
activityReportGap),账号间 800ms(activityAccountDelay)——防秒发风控; - 上报成功 → streak 自检(回读连登天数,发现「200 但静默丢弃」);
- 无猫账号对话量刚补满 → 立即重试领养(
travelAdoptForce,豁免当日防抖——门槛刚达成不算轰炸)。
RunKeepaliveNow:对每个非 disabled 账号 RefreshToken。
- 刷新成功 →
ClearSessionDead(清 12153 误判计数)+ BackfillRealm + 原子落盘; - 刷新失败 12153 → 连续 3 次判定 session 死亡 →
disabled_reason=12153 session dead; - 其余失败只记日志,不杀号。
| 任务 | CN | Global |
|---|---|---|
| 签到 | ✅ | ⛔ 跳过(skipped/global) |
| 旅行 | ✅ | ⛔ 跳过 |
| 活跃上报 | ✅ | ✅ 同样上报 |
| 保活 | ✅ | ✅ 刷新 |
Global 账号判定后直接结束该账号处理,不发起任何上游调用(刻意风控规避)。见 International。
-
签到:
RunCheckinNow()/CheckinAll()(返回逐账号CheckinOutcome),cmd/signin(./signin_bin auths)为离线批量表格工具; -
活跃:
RunActivityNow(),cmd/activity(./activity_bin)一次执行; -
旅行 / 保活:可复用调度器
RunTravelNow/RunKeepaliveNow(无独立 CLI)。