签到啦(Agent Skill 版)
签到啦 是我写了七年的日常签到程序,今年把它拆开重构成了 SignIn-Skill。
重构不是为了蹭 Agent 的热度。老结构有个实际问题:脚本越堆越多之后,连半年后的我自己都不知道该跑哪个、缺什么凭证、报错了算真失败还是已经领过了。所以这次把”怎么用”这件事本身当成产品来做。
现在的形态是遵循通用 Agent Skill 规范:根目录一份 SKILL.md 当入口说明书,scripts/ 放工具脚本,frontmatter 里写触发条件。任何支持这个约定的 AI 助手都能直接发现它,你对它说一句”签到”就够了。
同时可以完全脱离 AI 用纯 Python 跑 —— 这是硬要求不是兼容姿态。签到这种东西要挂 cron,凌晨三点没有大模型陪着你。
收录 25 个已抓包验证的自动化入口,按”同一家企业的产品合并成组”收敛为 16 个平台组。全部纯接口实现(不是 UI 点击),自带幂等(当天重复执行自动跳过)与状态文件。
依赖底线:Python 3.10+,全部脚本只用标准库。只有两处例外——美团和京东的签名要在本机 Node 里跑官方签名器沙箱,阿里系解凭证信封要
cryptography。
安装
作为 Skill 装进助手(以 Claude Code 为例):
1 | git clone https://github.com/Litre-WU/SignIn-Skill ~/.claude/skills/SignIn-Skill |
WorkBuddy 放 ~/.workbuddy/skills/SignIn-Skill/,其他助手放各自的 skills 目录,或者在项目根 .skills/ 放下后在对话里引用。
不用 AI、纯脚本运行:
1 | cd scripts |
跑了 8 个新平台之后,配置模板有 19 份,但大半平台已经免配置,原因见下一节。
免抓包:凭证其实就在你自己机器上
传统签到脚本最大的摩擦是”先去抓一条请求贴给我”。但绝大多数平台的凭证就存在你本机,只是不在我以为的地方。
scripts/browser_cookies.py 解决浏览器侧:Chromium 系的 Cookies 库运行时被独占锁,直接打不开。它走三级回退——只读直开 → 复制整库到 TEMP 复用 → 退到 CDP 9222;解密是 Chromium v10 信封(Windows 上 DPAPI + AES-GCM)。有了这层,京东京豆变成”浏览器里是登录态就行,脚本自己读,不用抓包”。
桌面端又不一样,凭证在各自的存储里:
| 平台 | 凭证在哪 | 取法 |
|---|---|---|
| 阿里云盘 | 浏览器 Local Storage(Cookies 库被独占锁但 leveldb 可读) | 按值搜 "refresh_token":"<32位hex>" 再向外扩出 JSON |
| 千问办公 / Qoder | 桌面端 auth-v2.dat、auth.v1.dat |
和浏览器 cookie 同一套 v10 解密链,实时解密 |
| LobsterAI(有道) | %APPDATA%/LobsterAI/lobsterai.sqlite 的 kv 表 |
只读打开拿 auth_tokens;客户端在跑也能读:先 mode=ro&immutable=1,失败再退 mode=ro |
| 华为码道 | CodeArts Agent 桌面端 state.vscdb |
解出 IAM 临时 AK/SK,按 SDK-HMAC-SHA256 签名打接口 |
| MiniMax Code | ~/.minimax/auth/prod/cn/mcode-public/auth.json |
直读活 token,过期再离线刷 |
按值搜索而不是按键名取,是因为 leveldb 里没有可靠的键名索引可依赖。
账号保活:一条统一纪律
免抓包带来新问题——凭证寿命是服务端说了算的,而且各家口径不一样。以前是每个脚本各写一套续期逻辑,现在抽成 scripts/credential_core.py,只放纪律、不含平台知识:
- 到期时间只认服务端返回值,优先级
expires_in>expires_at> JWTexp;数值大于 1e12 判成毫秒。 - 距过期不足 1 小时才动手续。
- 同一支
refresh_token按指纹 6 小时内只试一次。 - 终态码判死,不重试:
401/403/40100/40101/200003/invalid_grant。 - 新凭证只写自己的
*_live_cache.json,绝不回写官方客户端的文件。
第 5 条是底线。往别人的存储里写东西,客户端升级一次就可能把自己坑死,而且这本质上是在污染别人的数据。
配套的 scripts/keepalive_status.py 给 23 个平台做只读体检:根凭证临期(≤3 天)告警,加上”上次总控成功距今天数”(>1.5 天标心跳陈旧)。派生出来的短效凭证(AT 7200s、临时 AK/SK 2h、sdtoken 1800s)不参与临期告警,否则天天误报。这个体检挂在总控最前面,打 2~3 行预警。
幂等判据:响应经常是不可信的
理想的幂等是接口直接告诉你今天领没领过。现实里大量接口不告诉你:
- TRAE:
claim是幂等的,但成功响应和重复领取的响应长得一模一样。只能先查status.checked_in预检,领完再回查status取积分。 - ZCode(智谱):查可领额度前必须先补
event/report激活(app_launch + app_daily_active)。不补的话 preview 返回空列表,脚本会稳定误报”今日已领”。一个假成功比一个真失败难查得多。 - MiniMax Code:
points是总数,别去累加bonus_points;今日已领判据是is_today && status == 3。 - LobsterAI:
claimedToday+actions双重预检,余额查profile-summary(quota端点不含活动积分,用它查会以为没到账)。 - WorkBuddy 国际版:判定只看响应体
code,重复领取是 HTTP 400 +code 10001,按状态码判会当成失败。
一个刻意的”不做”
京东东东农场领水滴的 16 项任务全是 BROWSE 浏览类,完成依赖真实点击跳转、停留 6 秒生成的 assignmentToken(uploadInteractiveAssignment)。纯 API 做不到。
脚本选择不空打——因为每次撞上都会返 6002 并累积更宽的频控,打一次账号被限一分。所以它只如实标注”这几项需手动”,浇水和领免费水滴照常全自动。
能自动化多少就说多少,做不到就写清楚做不到。
反面教材:京东互动中心的 403
互动中心”天天抽奖”那组 functionId(assign_query / reward_center / assign_execute)我一开始判断成限流,判断错了。
真实现象是:urllib 403、headless 403、连真浏览器里页面自己发的请求也 403。更糟的是反复探测会让封锁从”写操作”扩大到”读操作”,最后连查余额都拒。
还有个方法学坑:拿 headless 起 9222 去测,测出来的 403 是假结论(风控本来不认无头环境),却会让你误判成”接口死了”。所以 jd_interact_inpage.py 主动拒绝无头 9222、永不自启浏览器、永不回收用户实例,只留作封锁解除后的复测入口。2026-10-17 这项已从每日流程移出。
教训:定性必须当场拿原始响应做证据,别拿上一轮的推断当结论。
抓包这一环也交给 agent
确实还要抓包的平台,流程做成了闭环。装了 Reqable(抓包客户端)的话 scripts/reqable_hunt.py 提供四个子命令:
1 | python reqable_hunt.py doctor # 抓包前置体检 |
agent 自己过滤记录、落地凭证、写回 config,你只在小程序或浏览器里做一次动作,不用复制任何请求文本。没装 Reqable 就手工抓 1 条请求发给助手(SKILL.md §一)。
restore-proxy 是必需的:Reqable 启动会接管系统代理,但关掉它不会自动撤销代理设置。残留的系统代理会让一整套脚本成片”失效”,而失效的样子长得像接口挂了——我在这个坑上白查过一轮。
实测收益
仓库里写明的实测值,举几个:
| 平台 | 每日 |
|---|---|
| 华为码道 CodeArts | 1000 积分(30 天有效) |
| Qoder CN | 100 Credits(30 天有效) |
| 千问办公 | 100 积分(免费版当日有效) |
| 魔搭 ModelScope | 魔粒 +290(登录 250 + 点赞 40) |
| TRAE(字节) | 实测单日 150 |
| LobsterAI(有道) | 每日登录奖励 100 |
| MiniMax Code | 单日 400 / 800 档 |
| 办公小浣熊(商汤) | 300 积分 |
| 天翼 189 云盘 | 随机空间,实测 +26~50MB |
| 小米有品红包 | 实测 0.24 元(连签 7 天第 7 天 5 元) |
两个脚本已废弃并留在仓库做参考:jd_signin.py(旧 App 端 signBeanIndex 接口 2026-10-12 服务端下线)、jd_login.py(新版京东拒绝 tmauth,改用 Web 端)。接口是会死的,这也是为什么状态文件和幂等比脚本本身更重要。
后续
- 保活层再吃掉几个仍需手工抓包的平台。
- 总控的任务编排现在靠脚本顺序,想换成声明式。
- 继续加平台,但会先把”这个平台的凭证能不能本机取到”当成第一道评估。
免责声明
- 本仓库不含任何账号凭证,config 全部需要你自己生成,
.gitignore已防止误提交。 - 凭证有效期分钟到天级不等,且部分平台是服务端轮换制(不是自然过期),失效后需重新获取。
- 自动化操作可能违反部分平台的服务条款,风险自负;请勿高频调用,接口异常先停手排查。
- 仅供学习交流。
__END__