部署在 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 的会话通常能维持很久,所以绝大多数天数是零成本运行。
在 Val Town 新建一个 Cron Val,把 main.ts 的内容整体粘贴进去。
建议 cron 设为每天一次,例如 30 0 * * *(UTC,对应北京时间 08:30)。
在 Val Town 的 Settings → Environment Variables 中添加。
必填:
| 变量 | 说明 |
|---|---|
IKUUU_ACCOUNTS | 账号列表,格式 邮箱:密码,多账号用 || 分隔 |
TWOCAPTCHA_KEY | 2Captcha 的 API Key |
多账号示例(Val Town 环境变量是单行,用 || 连接):
alice@example.com:pwd1||bob@example.com:pwd2
按第一个冒号分隔邮箱和密码,所以密码含冒号没问题;但密码里不能出现
||。
可选:
| 变量 | 默认 | 说明 |
|---|---|---|
IKUUU_BASE_URL | https://ikuuu.org | ikuuu 常换域名,失效时改这里 |
IKUUU_CAPTCHA_ID | 已内置 | GeeTest 验证码 ID,站点更新导致失效时才需覆盖 |
TELEGRAM_TOKEN | — | Telegram Bot Token(@BotFather 获取) |
TELEGRAM_CHAT_ID | — | 接收通知的 Chat ID(@userinfobot 获取) |
ALWAYS_REPORT | 关 | 设 1 则每次都推送回执,否则仅异常时推送 |
FETCH_INFO | 跟随 ALWAYS_REPORT | 设 1 则额外抓取剩余流量与到期日(每账号多一次请求) |
BALANCE_ALERT | 1 | 2Captcha 余额低于此值(美元)时告警 |
FAIL_STREAK_ALERT | 2 | 连续失败几次才升级为强提醒 |
LOGIN_RETRIES | 1 | 验证码被拒时的额外登录尝试次数 |
CRED_PAUSE_AFTER | 3 | 连续几次凭据错误后暂停打码(熔断) |
MAX_SOLVES | 账号数 ×(1+重试数) | 单次运行的打码硬上限 |
CONCURRENCY | 4 | 多账号并发数 |
BUDGET_SEC | 52 | 总时间预算,必须小于 Val Town 的运行上限 |
HTTP_TIMEOUT_SEC | 12 | 单个 HTTP 请求超时 |
JITTER_MAX_SEC | 5 | 每账号随机延迟上限,用于错峰 |
TZ_OFFSET | 8 | 判定"今天"所用的时区偏移 |
FORCE | 关 | 设 1 忽略"今日已签"缓存,强制执行 |
RESET_STATE | 关 | 设 1 清空失败计数与凭据熔断,跑完记得改回 |
在 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=password、host、pageLoadedAt 和 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),已从仓库移除。