Skip to content

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 点)时,该时点一并执行
  • 迟到唤醒不漏跑:任务在排程时确定,不依赖唤醒时刻的小时数;
  • 全部任务关闭时调度器不空转,直接等待退出信号。

签到(Checkin)

逐账号流程:

  1. 跳过 disabled 账号与无 RefreshToken 账号;
  2. token 临近过期(10 分钟窗口)先刷新;刷新失败的 12153 走连续计数(连续 3 次才禁用),刷新接口抖动不误杀;
  3. DailyCheckin;「今天已签到」判为幂等成功(already),不是错误;
  4. UserResource 查余额 → ReenableIfCredits 解冻:仅当余额 > 0 且账号未禁用时清冷却(不清熔断——签到只证明余额恢复,熔断证明 chat 通道问题);
  5. 冷却中的账号也参与(签到就是为了解冻它们)。

结果的 CheckinOutcome 状态:ok / already(今天已签到)/ fail / skipped(disabled / 无凭证 / global)。

串行化:同一时刻仅允许一次签到在跑(ErrBusy),防止定时触发与手动触发互相撞车重复打上游。

猫猫旅行(Travel)

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)。

活跃上报(Activity)

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,豁免当日防抖——门槛刚达成不算轰炸)。

Token 保活(Keepalive)

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)。

Clone this wiki locally