ikuuu 全自动签到(Val Town 版)

部署在 Val Town 上的 ikuuu 每日自动签到:邮箱+密码全自动登录(GeeTest V4 交由 2Captcha 求解),支持多账号、Cookie 复用、Telegram 通知。无需服务器,无需手动更新 Cookie。

主脚本:main.ts

为什么需要它

ikuuu 从 2026-04 起在登录页启用了 GeeTest V4 验证码,传统的"邮箱+密码直接 POST 登录"会返回:

系统无法接受您的验证结果,请刷新页面后重试。

本项目实测过纯算法求解器(GeekedTest 思路)与多家免费打码平台,在当前 GeeTest V4 的 "ai" 类型题目上均已失效,因此改用 2Captcha 求解。配合下面的 Cookie 复用策略,实际打码次数被压到极低,长期成本可忽略。

工作原理

Val Town Cron
   └─ 读取 SQLite 中的账号状态(Cookie / 签到日期 / 失败计数)
       ├─ 今天已签到? → 直接跳过,零请求零成本
       ├─ 有缓存 Cookie? → 直接 POST /user/checkin
       └─ Cookie 失效? → 2Captcha 求解 GeeTest V4 → POST /auth/login(phase=password) → 签到
   └─ 汇总结果,异常时推送 Telegram

关键点:只有 Cookie 失效时才会打码。ikuuu 的会话通常能维持很久,所以绝大多数天数是零成本运行。

部署步骤

1. 创建 Val

在 Val Town 新建一个 Cron Val,把 main.ts 的内容整体粘贴进去。

建议 cron 设为每天一次,例如 30 0 * * *(UTC,对应北京时间 08:30)。

2. 配置环境变量

在 Val Town 的 Settings → Environment Variables 中添加。

必填:

变量说明
IKUUU_ACCOUNTS账号列表,格式 邮箱:密码,多账号用 || 分隔
TWOCAPTCHA_KEY2Captcha 的 API Key

多账号示例(Val Town 环境变量是单行,用 || 连接):

alice@example.com:pwd1||bob@example.com:pwd2

第一个冒号分隔邮箱和密码,所以密码含冒号没问题;但密码里不能出现 ||

可选:

变量默认说明
IKUUU_BASE_URLhttps://ikuuu.orgikuuu 常换域名,失效时改这里
IKUUU_CAPTCHA_ID已内置GeeTest 验证码 ID,站点更新导致失效时才需覆盖
TELEGRAM_TOKENTelegram Bot Token(@BotFather 获取)
TELEGRAM_CHAT_ID接收通知的 Chat ID(@userinfobot 获取)
ALWAYS_REPORT1 则每次都推送回执,否则仅异常时推送
FETCH_INFO跟随 ALWAYS_REPORT1 则额外抓取剩余流量与到期日(每账号多一次请求)
BALANCE_ALERT12Captcha 余额低于此值(美元)时告警
FAIL_STREAK_ALERT2连续失败几次才升级为强提醒
LOGIN_RETRIES1验证码被拒时的额外登录尝试次数
CRED_PAUSE_AFTER3连续几次凭据错误后暂停打码(熔断)
MAX_SOLVES账号数 ×(1+重试数)单次运行的打码硬上限
CONCURRENCY4多账号并发数
BUDGET_SEC52总时间预算,必须小于 Val Town 的运行上限
HTTP_TIMEOUT_SEC12单个 HTTP 请求超时
JITTER_MAX_SEC5每账号随机延迟上限,用于错峰
TZ_OFFSET8判定"今天"所用的时区偏移
FORCE1 忽略"今日已签"缓存,强制执行
RESET_STATE1 清空失败计数与凭据熔断,跑完记得改回

3. 手动跑一次验证

在 Val Town 点 Run,看日志是否输出 ✅ 签到成功。首次运行会打码登录并把 Cookie 写入 SQLite,之后就走缓存了。

设计要点

Cookie 优先,成本最低。 签到本身不需要验证码,只有登录才需要。脚本把 Cookie 持久化在 Val Town 的 SQLite 里,只在确认失效时才触发付费打码。

当天已签则完全跳过。 成功签到会记录日期(按 TZ_OFFSET 判定),同一天内重复运行不产生任何请求,手动重跑和 cron 重复触发都是安全的。

失败分类,避免误烧钱。 5xx / 429 判定为服务端抖动并重试,不会误认成 Cookie 失效而去登录;只有 301/302/401/403 或响应内容像登录页才算失效。登录失败会区分"验证码被拒"(上报退款并重试)与"凭据错误"(不重试,直接告警)。

全局时间预算。 每个网络请求前检查剩余时间,并始终预留 4 秒发送通知,避免被 Val Town 静默掐断而收不到任何告警。

凭据熔断。 连续多次确凿的凭据错误后停止打码,避免密码改了却每天白烧钱。恢复方式:确认密码无误后加 RESET_STATE=1 跑一次。

常见问题

登录失败怎么排查? 日志里会有一行 登录被拒(HTTP xxx) result=... 原文: ...,那是服务端的真实回复。成功登录的标志是 result=authenticated(不是旧版的 ret=1)。据此判断是域名变更、验证码配置变化还是账号问题。

为什么日志里曾出现 invalid_phase? 2026-08 起登录 POST 必须带 phase=passwordhostpageLoadedAt 和 GeeTest 字段;缺 phase 会被拒绝。当前 main.ts 已按这个格式提交。

ikuuu 换域名了?IKUUU_BASE_URL 即可。

成本大概多少? GeeTest V4 在 2Captcha 约 $0.003/次。由于只在 Cookie 失效时打码,实际一年下来通常不到 $1。

为什么不用 2Captcha 的 Browser API(云浏览器)? 那是托管 Chrome 服务,需要 Puppeteer/Playwright 通过 CDP 驱动。真实浏览器完成一次登录通常要几十秒,会超出 Val Town 免费版 60 秒的运行上限——这正是本项目最初放弃 Puppeteer 方案的原因。当前 HTTP 直连方案更快也更省。

安全吗? 账号密码只存在 Val Town 环境变量中,不写入代码;日志不打印 Cookie 与密码。

目录结构

.
├── main.ts              # 主脚本(interval / cron)
└── README.md

早期还有一套基于 GitHub Actions + 纯算法 GeeTest 求解器的实现(checkin.py / geeked/),实测求解器已被 ikuuu 的风控拦截(成功率 0/10),已从仓库移除。