GLM Desk 是一个本地运行的 GLM Coding 支付运营后台,用来管理多账号导入、套餐同步、自动验证码链路、预览下单、签单出二维码,以及定时启动任务。
当前页面已经不是早期的调试台,而是简约列表后台:
bigmodel_token_productiongetCustomerInfoOrganization / Projectbatch-preview 获取套餐状态collect / eks / powverifypreview 无 bizId 时自动重跑整条链路/biz/pay/create-sign/biz/pay/product/update/sign3 次,失败后回到整条链路重新拿新 bizIddeviceTokenPATH 中说明:
start.bat 首次启动会自动创建 .venv 并安装 Python 依赖.env.example 为 .envstart.bathttp://127.0.0.1:8787默认启动地址:
APP_HOST=127.0.0.1APP_PORT=8787本项目本地默认通过 start.bat 启动:
uvicorn app.main:app --host %APP_HOST% --port %APP_PORT% --reload这意味着正常开发启动时通常会看到:
1 个 uvicorn reload 监控进程1 个实际承载 FastAPI 的应用进程N 个 OCR 进程池 worker 上限,其中 N = TENCENT_OCR_WORKERS说明:
uvicorn --workers,所以 Web 服务本身不是多 worker 部署uvicorn worker1 个 OCR worker,避免首次下载 RapidOCR 模型时多个进程同时抢同一个 .onnx 文件TENCENT_OCR_WORKERS 控制TENCENT_OCR_WORKERS 默认值不是写死 4,而是按 CPU 自动算:
max(1, min(4, os.cpu_count() or 1))举例:
1 核机器默认 12 核机器默认 28 核机器默认 4如果你想强制单路 OCR,直接把:
TENCENT_OCR_WORKERS=1写进 .env 就行。
点击顶部 导入账号,填写:
注意:
XOJGYOGNLN列表页每行展示:
新购 / 升级chrome / edge / firefox每个账号的套餐用下拉框选择,切换后自动保存到本地会话。
每个账号都可以设置是否启用定时任务,以及启动时间。
默认时间:
09:59:58时间格式支持:
HH:MMHH:MM:SS实际保存时会统一格式化成 HH:MM:SS。
点击 立即启动 后,会立即执行该账号的完整支付链路:
preview点击 同步并换指纹 后,会先给该账号分配一个新的账号级伪装指纹,再重新同步账号上下文和套餐。
这适合在上游风控、链路异常、套餐状态异常时主动切换一套新的网络指纹继续尝试。
点击账号名,可以查看当前账号上下文,包括:
customerNumbercustomerName点击 删除账号 后,会删除这个账号的本地数据。
当前删除范围包括:
accounts.json 中该账号记录tasks.json 中该账号的二维码任务data/sessions/{account_id}.jsondata/logs/ 中名字或内容带该 account_id 的文件 / 目录data/test_runs/ 中名字或内容带该 account_id 的文件 / 目录页面状态列会展示两类状态:
unchecked:尚未检查valid:最近一次同步 / 启动检查成功expired:账号态不可用或凭据失效error:接口异常、系统繁忙、链路失败等runningsuccessfailed说明:
valid/products 这一步会根据 batch-preview.isSubscribed 给账号和套餐打标:
new_purchaseupgrade后续二维码签单会按这个模式分流。
使用:
/biz/pay/create-sign使用:
/biz/pay/product/update/sign依赖 preview.lastSubscriptionSummary 中的:
productIdagreementNo3 个,直接刷新验证码重新跑verify 失败会回到整条验证码链路重新开始preview 没拿到 bizId,会无限重跑整条链路拿到 bizId 后:
bizId 重试签单 3 次previewpreview 链路拿新 bizIdGLM Desk 当前不是完整浏览器驱动,而是后端 HTTP 请求链路,所以做的是账号级稳定伪装:
browser_impersonatechrome / edge / firefox这样做的目的:
正式运行数据位于:
data/
accounts.json
tasks.json
sessions/
logs/
runtime/
tdc_cache/
说明:
accounts.json:账号主档tasks.json:最新二维码任务sessions/:账号上下文缓存logs/:运行日志logs/runtime/:正式运行日志tdc_cache/:腾讯 TDC 脚本缓存项目现在已经补了正式运行日志,不再只是控制台里飘几行 INFO。
日志目录:
data/logs/runtime/
app.log
events-YYYY-MM-DD.jsonl
accounts/
{account_id}/
YYYY-MM-DD.jsonl
说明:
app.log:标准文本日志,适合直接翻看服务启动、异常栈、调度器运行情况events-YYYY-MM-DD.jsonl:当天全量结构化流水,适合排查整站任务accounts/{account_id}/YYYY-MM-DD.jsonl:单账号结构化流水,适合盯一个账号复盘结构化日志核心字段:
timestamp:事件时间account_id:账号 IDrun_id:单次运行链路 ID,同一条链路会贯穿 captcha -> preview -> signaction:动作名称,比如 run_payment_flow、bootstrap_accountstage:步骤名称,比如 batch_preview、captcha_verify、preview、signstatus:步骤状态,比如 started、success、retry、failed、pauseddetails:补充字段,包含 OCR 点位数、置信度、bizId、签单轮次等当前正式日志会覆盖这些关键链路:
getCustomerInfo/biz/pay/batch-previewverifypreviewcreate-sign / update-sign敏感字段处理:
tokencookieticketrandstrsigncollect / eks这些字段进入结构化日志时会自动脱敏,不会原样落盘。
服务每次启动时会做两件事:
另外:
7 天,可通过 RUNTIME_LOG_RETENTION_DAYS 调整这意味着:
可选环境变量见 .env.example:
APP_HOST=127.0.0.1
APP_PORT=8787
DATA_DIR=data
BIGMODEL_API_BASE=https://www.bigmodel.cn/api
BIGMODEL_ORIGIN=https://www.bigmodel.cn
BIGMODEL_REFERER=https://www.bigmodel.cn/glm-coding
BROWSER_IMPERSONATE=chrome124
REQUEST_TIMEOUT_SECONDS=20
DEFAULT_LANGUAGE=zh-CN
TENCENT_CAPTCHA_DOMAIN=https://turing.captcha.qcloud.com
TENCENT_CAPTCHA_AID=196026326
TENCENT_CAPTCHA_ENTRY_URL=https://www.bigmodel.cn/glm-coding
TENCENT_CAPTCHA_MAX_RETRIES=3
TENCENT_CAPTCHA_MIN_CONFIDENCE=0.55
TENCENT_CAPTCHA_NODE=node
TENCENT_OCR_ENABLED=1
TENCENT_OCR_INCLUDE_DEBUG=0
TENCENT_OCR_WORKERS=4
TENCENT_OCR_TIMEOUT_SECONDS=6
RUNTIME_LOG_LEVEL=INFO
RUNTIME_LOG_RETENTION_DAYS=7
布尔值参数支持:
1 / true / yes / on 表示开启各参数含义如下:
| 参数 | 默认值 | 含义 |
|---|---|---|
APP_HOST |
127.0.0.1 |
Web 服务监听地址,start.bat 会优先读取这个值来启动 uvicorn |
APP_PORT |
8787 |
Web 服务监听端口,start.bat 会先杀掉当前端口已占用进程再启动 |
DATA_DIR |
data |
本地数据目录,保存账号、会话、任务、日志、TDC 缓存;相对路径会按项目根目录解析 |
BIGMODEL_API_BASE |
https://www.bigmodel.cn/api |
BigModel API 根地址 |
BIGMODEL_ORIGIN |
https://www.bigmodel.cn |
BigModel 请求头 Origin 默认值 |
BIGMODEL_REFERER |
https://www.bigmodel.cn/glm-coding |
BigModel 请求头 Referer 默认值 |
BROWSER_IMPERSONATE |
chrome124 |
curl-cffi 的全局兜底 impersonate 值;账号实际请求优先用账号自己的随机 browser_impersonate |
REQUEST_TIMEOUT_SECONDS |
20 |
上游 HTTP 请求超时时间,单位秒 |
DEFAULT_LANGUAGE |
zh-CN |
默认请求语言,会写入 Accept-Language 和 Set-Language |
TENCENT_CAPTCHA_DOMAIN |
https://turing.captcha.qcloud.com |
腾讯验证码域名 |
TENCENT_CAPTCHA_AID |
196026326 |
腾讯验证码业务 aid |
TENCENT_CAPTCHA_ENTRY_URL |
https://www.bigmodel.cn/glm-coding |
腾讯验证码 entry_url 和默认 Referer |
TENCENT_CAPTCHA_MAX_RETRIES |
3 |
预留的验证码客户端最大重试次数配置,目前主链路重试逻辑由支付服务控制 |
TENCENT_CAPTCHA_MIN_CONFIDENCE |
0.55 |
OCR 点位门禁最低置信度,小于这个值会直接刷新验证码重跑 |
TENCENT_CAPTCHA_NODE |
node |
跑腾讯 TDC VM 时使用的 Node.js 命令 |
TENCENT_OCR_ENABLED |
1 |
是否启用本地 OCR;关闭后自动识别不可用 |
TENCENT_OCR_INCLUDE_DEBUG |
0 |
是否在 OCR 结果中附带调试图像 base64,开启后日志和响应会更重 |
TENCENT_OCR_WORKERS |
自动计算,最大不超过 4 |
OCR 进程池并发上限;建议普通机器配 1-2,高配机器可配 3-4 |
TENCENT_OCR_TIMEOUT_SECONDS |
6 |
单次 OCR worker 超时秒数 |
RUNTIME_LOG_LEVEL |
INFO |
正式运行日志级别 |
RUNTIME_LOG_RETENTION_DAYS |
7 |
app.log 按天轮转保留天数 |
补充说明:
BROWSER_IMPERSONATE 现在主要是全局兜底值和 transport 展示值browser_impersonatebrowser_impersonate 在首次导入账号时随机分配为 chrome / edge / firefoxTENCENT_OCR_WORKERS 配得太高,OCR 并发会更猛,但内存占用也会跟着往上窜,别一上来就梭哈batch-preview、create-sign、update/sign 偶发会返回 555 / 系统繁忙tasks.json 中保存 qr_base64glm-coding-new-purchase-field-map.mdglm-coding-new-purchase-detailed-spec.mdglm-coding-tencent-captcha-verify.md$ claude mcp add glm-coding \
-- python -m otcore.mcp_server <graph>