Trae 每日自动签到 & 积分监控 · 零依赖 · 多账号 · 企业微信推送
Trae AutoCheckin 是一套用于 Trae 的积分自动化工具,包含 4 个独立脚本:
| 脚本 | 作用 |
|---|---|
trae_checkin.py |
🎯 多账号每日签到,9074 自动换号,自动续期 + 推送 |
trae_credit_monitor.py |
📊 只读查询积分「已用 / 剩余」,绝不签到 |
trae_sms_login.py |
🌐 网页 OAuth 登录换 Token(真浏览器走官网,验证码/滑块无忧) |
trae_get_token.py |
🔑 从 Trae 客户端一键提取 refreshToken / 生成 TRAE_ACCOUNTS(免抓包) |
纯 Python 标准库实现,无需 pip 安装任何依赖,可直接丢进青龙面板 / 本地 crontab / 任意定时任务运行。
- 🪶 零依赖 — 只用 Python 标准库,开箱即用
- 🛡️ 解 9074 — 命中后自动换新设备号重签(实测立刻成功),与桌面端请求完全对齐
- 🚀 一轮全签 — 默认每轮把所有未签账号全签掉,9074 自动换号兜底
- 🔐 Token 缓存 — 复用未过期的
accessToken,失效才续期,减少请求 - ⛓️ 链式续期 — 自动处理
refreshToken轮换并回写,长期不失效 - 🔁 产品线回退 — 续期自动在 IDE(Trae CN)/ SOLO(TRAE SOLO CN)两套钥匙间回退,两类客户端提取的 token 都能续
- 👥 多账号 — 支持任意数量账号,环境变量即可配置
- 📅 当日跳过 — 已签成功的账号后续运行零请求,不重复消耗
- 📱 稳定设备号 — 优先用客户端真实设备号,拿不到才按账号生成固定 16 位
- 📤 微信推送 — 签到 / 积分结果推送到企业微信机器人
- 🌐 网页登录 — 真浏览器走官网 OAuth 拿 Token,验证码/滑块都在浏览器里完成
- 🎨 美观日志 — 带图标与分区的执行日志,状态一目了然
这是唯一需要你手动准备的东西,弄到它就大功告成。
本仓库自带 trae_get_token.py,会自动从 Trae 客户端读取并解密登录凭据,零依赖、不联网、不上传。
# 1. 先在电脑上打开 Trae 客户端并登录你的账号
# 2. 运行提取脚本
python trae_get_token.py
# 3. 终端会打印出(直接复制等号后面的那串):
# TRAE_REFRESH_TOKEN = AbCdEfGhIjKlMnOpQrStUvWxYz0123456789ABCD=.0000000000000000复制到青龙面板 环境变量 → 新建变量:
| 变量名 | 值 |
|---|---|
TRAE_REFRESH_TOKEN |
粘贴上面复制的那串 |
多账号:直接运行下面这条,会自动把本机登录态和账号目录里的凭据合成一个 TRAE_ACCOUNTS 数组:
python trae_get_token.py --accounts输出一行 JSON,整行复制到 TRAE_ACCOUNTS 环境变量即可(字段说明见下方「TRAE_ACCOUNTS 怎么填」)。
也可以沿用旧写法:在客户端依次登录每个账号,各运行一次 trae_get_token.py,
把得到的值分别填到 TRAE_REFRESH_TOKEN、TRAE_REFRESH_TOKEN_2、TRAE_REFRESH_TOKEN_3 …
Trae 在 2026-09 之后给 ExchangeToken 接口加了设备签名校验,
不带设备证明会直接返回 20405 Device proof required,也就是最常见的「凭证续期失败」。
一条命令导出全部需要的值:
python trae_get_token.py --export-keys输出 4 个变量,复制到青龙环境变量:
| 变量名 | 说明 |
|---|---|
TRAE_DEVICE_KEY_PEM |
设备 ECDSA 私钥(PEM,换行已写成 \n,整行复制即可) |
TRAE_DEVICE_PUB_PEM |
设备 ECDSA 公钥(同上) |
TRAE_DEVICE_ID |
设备号(16 位数字) |
TRAE_MACHINE_ID |
设备 machineId(建议一起填) |
💡 同机多账号共用同一套设备密钥(和桌面端行为一致),不用每个账号一份。 脚本用的是纯标准库 ECDSA P-256,不需要装 cryptography。
⚙️ 请求里的
ClientID(ono9krqynydwx5)和PlatformCode(IDE_PC)已按桌面端实测值内置, 并对旧 ClientID 做了自动回退,所以导出的 token 无论新旧都能续期,不需要你手动配。
Trae 客户端把登录凭据加密后存在(Windows):
%APPDATA%/Trae CN/User/globalStorage/storage.json
其中键名 iCubeAuthInfo://icube.cloudide 的值就是加密凭据。
解密算法(AES-128-CBC + SHA-512 校验)已内置在 trae_get_token.py 里,
所以直接跑脚本即可,不用自己动手解密。
不想装客户端 / 想给账号换新凭据?用 trae_sms_login.py 走 Trae 官网真实网页登录:
脚本生成带 PKCE 的授权 URL 并打开浏览器,你正常登录(验证码 / 滑块都在官网页面完成),
登录完成后脚本在本机接过回调,用 AuthCode 自动换取新凭据。
python trae_sms_login.py # 打开浏览器 → 完成登录 → 终端打印新 token
python trae_sms_login.py --solo # SOLO 产品线(默认 Trae/IDE 线)
python trae_sms_login.py --no-open # 只打印授权 URL,自己手动打开
python trae_sms_login.py --selftest # 离线自检(不联网、不占用端口)运行后会打印 refreshToken / accessToken(并保存到 trae_sms_accounts.json)。
⚠️ 需要本机装过一次 Trae 客户端:脚本从它的storage.json取设备身份 (device_id / 公钥 / machineId),与授权 URL 同源;回调端口固定17388, 被占提示时先退出 Trae 客户端再跑。✅ 好处:不再直连短信接口 —— 机房 / 代理 IP 也不触发风控滑块, 验证码和滑块都由你在浏览器里正常完成,换取的是可直接续期的 refreshToken。
- 提取前请确保 Trae 客户端已登录,否则读不到凭据。
- 一个账号只在一处刷新(要么青龙,要么其它工具),别同时挂两处,否则 token 会互相顶失效。
① 一键订阅拉取(推荐,自动跟随更新)
在青龙「定时任务」里新建一条任务,命令填:
ql repo "https://github.com/L0NE-6/Trae-AutoCheckin.git" "trae_checkin.py|trae_credit_monitor.py" "" "" "main"手动执行一次,脚本就会拉到 /ql/repo/Trae-AutoCheckin/ 下,之后每次执行都会自动更新到最新版。
② 手动放置(不想用订阅时)
# 把两个脚本放入青龙 scripts 目录
/ql/data/scripts/trae_checkin.py
/ql/data/scripts/trae_credit_monitor.py③ 添加环境变量
在「环境变量」里添加 TRAE_ACCOUNTS 和 QYWX_TOKEN。
④ 新建签到任务
# 订阅方式(路径在 repo 下)
python /ql/repo/Trae-AutoCheckin/trae_checkin.py # 早窗: 23 0 * * * 补签: 7,37 * * * *
python /ql/repo/Trae-AutoCheckin/trae_credit_monitor.py # 定时: 0 * * * *
# 手动放置方式(路径在 scripts 下)
python /ql/data/scripts/trae_checkin.py
python /ql/data/scripts/trae_credit_monitor.pyexport TRAE_ACCOUNTS='[{"accessToken":"...","refreshToken":"...","uid":"账号1"},...]'
export QYWX_TOKEN="你的企业微信机器人 key" # 可选
python trae_checkin.py # 签到
python trae_credit_monitor.py # 查积分| 变量 | 必填 | 说明 |
|---|---|---|
TRAE_ACCOUNTS |
✅ | 多账号 JSON 数组(推荐):每号可给 accessToken / refreshToken / icubeAuth / storagePath |
TRAE_REFRESH_TOKEN[_N] |
➖ | 旧部署兼容:refreshToken(无 TRAE_ACCOUNTS 时生效) |
TRAE_ACCESS_TOKEN[_N] |
➖ | 已有 accessToken 时直接给,省一次续期 |
TRAE_ICUBE_AUTH |
➖ | 桌面端加密凭据串,脚本自动解密(需 cryptography) |
TRAE_STORAGE_PATH |
➖ | 直接指向客户端 storage.json,自动解密取 token |
TRAE_UID[_N] |
➖ | 账号标识,仅用于日志与缓存键 |
TRAE_DEVICE_ID[_N] |
➖ | 设备号;留空则优先用客户端真实设备号,再回退自动生成 |
TRAE_TOKEN_CACHE |
➖ | token 缓存路径,默认 /ql/data/config/ 或脚本同目录 |
TRAE_ACCOUNT_DIR |
➖ | 账号 JSON(trae-<uid>.json)所在目录:读取与回写都用它 |
TRAE_ONLY |
➖ | 只跑指定账号:序号(从 1 起) / uid / name |
TRAE_BATCH |
➖ | 每轮签几个账号,默认 all(一轮全签);设 1 按小时轮换 |
TRAE_JITTER |
➖ | 启动随机抖 0~20s 避开整点同秒,默认开;设 0 关闭 |
TRAE_COOLDOWN_MIN |
➖ | 平时 9074 冷却分钟数,默认 55,冷却内零请求 |
TRAE_PEAK_HOURS |
➖ | 早窗小时,默认 0;支持 0 / 0,23 / 0-1,早窗自动一轮全签 |
TRAE_PEAK_COOLDOWN_MIN |
➖ | 早窗内冷却分钟数,默认 12(好让下轮还在窗口里补签) |
TRAE_CIRCUIT |
➖ | 设 1 恢复旧熔断:一个账号 9074 就全体收工(默认关) |
TRAE_ROTATE |
➖ | 9074 后自动换新设备号,默认开;设 0 关闭 |
TRAE_DEVICE_BRAND |
➖ | 设备品牌请求头(可选,默认不发,与桌面端 device_model 对应) |
TRAE_DEVICE_KEY_PEM |
✅ | 新版续期必需:设备 ECDSA 私钥(trae_get_token.py --export-keys 导出) |
TRAE_DEVICE_PUB_PEM |
✅ | 新版续期必需:设备 ECDSA 公钥(同上) |
TRAE_MACHINE_ID |
➖ | 设备 machineId(同一命令导出,建议一起填) |
TRAE_CLIENT_ID |
➖ | 客户端 ClientID,默认已内置桌面端实测值 ono9krqynydwx5;换 Trae 版本后才需要改 |
TRAE_DEVICE_NAME |
➖ | 设备名(默认取主机名) |
TRAE_DEVICE_MODEL |
➖ | 设备型号(可选,默认不发) |
CLAIM_TRIES |
➖ | 每账号每轮 claim 次数,默认 1(换号才是正解,别调大) |
QYWX_TOKEN |
➖ | 企业微信机器人 key(?key= 后面那段) |
PLUSPLUS_TOKEN |
➖ | PushPlus token |
💡 兼容旧命名:
WECHAT_WEBHOOK与QYWX_TOKEN都能识别。
一个 JSON 数组,一个元素 = 一个账号。最省事的是让脚本自动生成:
# 自动扫描「本机 Trae 登录态 + 账号目录里的 trae-<uid>.json」,直接打印可用的一行 JSON
python trae_get_token.py --accounts
# 账号文件(trae-<uid>.json)在别的目录时,指定一下
TRAE_ACCOUNT_DIR="/your/accounts/dir" python trae_get_token.py --accounts把打印出来的那一行整行复制进 TRAE_ACCOUNTS 就行,不用手动拼。
| 字段 | 必填 | 说明 |
|---|---|---|
refreshToken |
✅ | 账号的 refreshToken。只给这一个也能跑,脚本会自动换取 accessToken |
accessToken |
➖ | 有就直接用,省一次续期;没有脚本自动换 |
uid |
➖ | 账号标识,用于日志和缓存键;不填会用 name 或序号 |
name |
➖ | 备注名,只影响日志显示 |
deviceId |
➖ | 16 位设备号;不填会自动生成并持久化 |
icubeAuth |
➖ | 桌面端加密凭据串(自动解密,需 cryptography),可替代 refreshToken |
storagePath |
➖ | 直接给 storage.json 路径,脚本自己解密取 token |
只有一个 refreshToken 也能直接跑(推荐先这样跑通):
[{"refreshToken":"第1个账号的refreshToken"},{"refreshToken":"第2个账号的refreshToken"}][{"accessToken":"eyJhbGciOi...","refreshToken":"AbCd...=.0123456789abcdef","uid":"账号1","name":"主号"},{"refreshToken":"XyZ...=.fedcba9876543210","uid":"账号2","name":"小号"}]- 必须是一行,中间不能有换行(换行会让 JSON 解析失败)
- 只能用英文双引号
",中文引号“”会报错 - 最后一个
}后面不能有逗号
💡 填完在青龙里点一次「执行」,日志会打印每个账号的状态;有账号报错会单独提示,不影响其它账号。 旧写法
TRAE_REFRESH_TOKEN[_N]仍然兼容,两种任选其一,TRAE_ACCOUNTS优先。
| 模式 | 配置 | 行为 |
|---|---|---|
| 全量签到(默认) | 不设 TRAE_ONLY |
一轮把所有未签账号全签掉,9074 自动换号重签 |
| 指定账号 | TRAE_ONLY=3 |
只跑第 3 个账号,其余跳过 |
| 按 uid 筛选 | TRAE_ONLY=113185... |
只跑匹配 uid 的账号 |
| 重试多次 | CLAIM_TRIES=2 |
单账号 9074 后当场再试(一般不需要,换号已内置) |
💡 配合青龙定时
*/30 * * * *,加上当日状态文件自动跳过已签账号, 9074 的账号会自动换设备号重签,仍不行才冷却等下轮补签。
┌──────────────────────────────────────────────────┐
│ 读取 token 缓存(.trae_token_cache.json) │
│ 已签到账号 → 跳过(当日状态文件) │
└───────────────────────┬──────────────────────────┘
│
┌─────────────────┴─────────────────┐
▼ ▼
✅ 有效期内 / 校验通过 ❌ 过期或未认证(code=1001)
│ │
▼ ▼
直接复用(不刷新) 用 refreshToken 续期
│ │
▼ ▼
查今日是否已签 ──────┬────── 获取新 token + refreshToken
│ │
┌──────────┴──────────┐ │
▼ ▼ ▼
checked_in=true checked_in=false 写回缓存(链式回写)
│ │
▼ ▼
☑️ 今日已签到 发送 claim(每账号仅 1 次)
│
┌────────┴────────┐
▼ ▼
code=0 成功 code=9074 设备号被记住
│ │
▼ ▼
🎉 签到成功 🔄 换新设备号重签 → 仍 9074 才冷却
💡 关于 refreshToken Trae 的
refreshToken是轮换链:每次续期都会产生一个新值,旧值随即失效。 因此本脚本会把最新值回写到缓存与账号文件,避免链停在旧节点导致 401。⚠️ 请勿在多处同时使用同一账号刷新,否则会互相使对方 token 失效。
怎么获取 refreshToken?
推荐用本仓库自带的一键提取工具:先在电脑上登录 Trae 客户端,然后运行
python trae_get_token.py终端会直接打印出 TRAE_REFRESH_TOKEN = xxx,复制到青龙环境变量即可。
该脚本会自动定位并解密客户端凭据,免抓包、零依赖。
详见 🔑 获取 refreshToken。
提示「凭证续期失败 / 401」怎么办?
看日志里的错误码,对应三种情况:
| 错误码 | 含义 | 怎么修 |
|---|---|---|
20405 |
服务端要求设备证明 | 配置 TRAE_DEVICE_KEY_PEM / TRAE_DEVICE_PUB_PEM / TRAE_DEVICE_ID(python trae_get_token.py --export-keys 一键导出) |
20101 |
refreshToken 已失效或被轮换掉 | 重新登录 Trae 客户端,再跑一次 trae_get_token.py --accounts 导出新凭据 |
10101 |
refreshToken 与客户端不匹配 | 确认设备密钥是从签发该 token 的同一台机器导出的;仍报错就重新提取 token |
20403 |
token 与设备不匹配 | 同上 —— 这个 token 是在另一台设备上签发的,需要在那台机器上导出密钥,或重新登录取新 token |
💡 最省事的排查顺序:先确认设备密钥配好了(20405),再确认 token 是不是最新的(20101/10101)。 脚本现在会在日志里直接把这三类错误翻译成中文提示。
9074 到底是什么?
9074 不是限流 —— 是服务端把这个设备号记住了(反复用它请求会越记越死)。
脚本的做法:命中 9074 就自动换一个全新设备号重签一次(实测立刻成功),
仍不行才按账号冷却。另外请求体必须带 {"req_source":1} 和设备头(与桌面端一致),
空请求体也会被拒成 9074 —— 脚本已内置,不需要手动配。
配合青龙定时高频轻量跑 + 当日状态文件跳过已签账号,全天多轮下来每个号都能签上。
💡 实测结论(2026-09-14 更正):9074 不是限流 —— 是这个设备号被服务端记住了 (反复用它请求会越记越死)。换个全新设备号立刻就能签成,跟出口 IP、请求头无关。 另外请求体必须带
{"req_source":1}和设备头(与桌面端一致),空请求体也会被拒成 9074。
为什么有两个脚本?
trae_checkin.py 负责签到(主脚本),trae_credit_monitor.py 负责只读查询积分。
两者共用同一份 token 缓存,互不干扰。
Trae-AutoCheckin/
├── trae_checkin.py # 🎯 多账号签到(主脚本,9074 自动换号)
├── trae_credit_monitor.py # 📊 积分只读监控
├── trae_sms_login.py # 🌐 网页 OAuth 登录换 Token(真浏览器流程)
├── trae_get_token.py # 🔑 refreshToken 提取 + --accounts 一键生成 TRAE_ACCOUNTS
├── .gitignore # 🚫 运行时缓存与账号文件永不入库
├── LICENSE # 📄 MIT
└── README.md # 📖 本文件
本项目仅供个人学习与研究使用,请遵守 Trae 的服务条款。 使用本工具产生的一切后果由使用者自行承担,作者不对任何账号风险负责。