Initial commit: grok-free-register-oss

Open-source Grok free registration CLI, xai_enroller auth pipeline,
local auth service, tests and docs.
This commit is contained in:
chaos
2026-07-16 21:04:05 +08:00
commit d10009d639
72 changed files with 18752 additions and 0 deletions

124
.env.example Normal file
View File

@@ -0,0 +1,124 @@
# grok-free-register 配置模板
# 复制为 .env 后按需修改。未填写的项目会使用程序默认值。
# 邮箱模式
# tempmail: 免费临时邮箱,适合快速试跑。
# custom: 自建域名邮箱,需要 Cloudflare Email Routing 和本地收信服务。
EMAIL_MODE=tempmail
# custom 模式专用
# EMAIL_DOMAIN=example.com
# EMAIL_API=http://127.0.0.1:8080
# 认证账号来源
# auto: 配置 SSH 主机时读取远端,否则读取当前项目;一般保持默认即可。
# XAI_AUTH_SERVICE_SOURCE=auto # auto | local | ssh
# XAI_AUTH_SERVICE_REGISTER_ROOT=. # local 模式下的注册项目目录
# 注册与认证不在同一台机器时填写
# XAI_AUTH_SERVICE_SSH_HOST=user@server.example
# XAI_AUTH_SERVICE_SSH_IDENTITY=/path/to/key.pem
# XAI_AUTH_SERVICE_REMOTE_ROOT=/opt/grok-free-register
# XAI_AUTH_SERVICE_SYNC_SEC=30 # 同步新账号的间隔(秒)
# 认证节奏
# XAI_AUTH_SERVICE_MIN_INTERVAL_SEC=10 # 两次认证请求的基础最小间隔(秒)
# # 触发限流后会自动抬高(约18s起最多约90s),成功连串后再缓慢回落
# XAI_AUTH_SERVICE_RETRY_SEC=60 # 被限流后的基础探测间隔(秒);连续撞限会按 1.5x 增长,上限 300s
# XAI_AUTH_SERVICE_LOG_MODE=user # user | debug
# 运行目标
# TARGET=0 # 成功 N 个后停止;0=不限
# 日志显示
# REGISTER_LOG_MODE=user # 默认:任务开始、结果、平均速度和限流等待
# REGISTER_LOG_MODE=debug # 额外显示 T/Q/并发/阶段耗时调试面板
# 浏览器并发容量
# PHYSICAL_CAP=0 # 0=按 CPU/内存自动估算;>0=手动指定
# PHYSICAL_PER_CPU=2 # 自动估算时每个 CPU 核心对应的并发参考值
# PHYSICAL_MEM_MB=512 # 自动估算时每个浏览器任务的内存预算(MB)
# MIN_FREE_MEM_MB=500 # 自动估算时保留的内存(MB)
# CAPACITY_PROFILE= # 可选:离线压测生成的静态 profile(JSON)
# 缓冲容量
# T_SLOT_CAP=8
# Q_SLOT_CAP=8
# Q_PENDING_CAP=12
# Worker 数量
# 通常不需要手动设置。0 表示根据容量自动派生。
# S_WORKERS=0
# P_WORKERS=0
# C_WORKERS=0
# 资源有效期
# T_MAX_AGE=300 # token 最大年龄(秒)
# Q_MAX_AGE=120 # 验证码最大年龄(秒)
# 阶段超时
# P_REQUEST_TIMEOUT=95 # 等待验证码返回超时(秒)
# C_CONSUME_TIMEOUT=60 # 最终提交阶段超时(秒)
# 局部门控和批量发送
# 这些项目默认会按容量派生。只有在压测定位后才建议覆盖。
# T_TARGET=4 # token 缓冲目标
# Q_TARGET=4 # 验证码缓冲目标
# T_HIGH_WATER= # token 生产高水位
# T_LOW_WATER= # token 生产恢复低水位
# Q_HIGH_WATER= # 验证码生产高水位
# Q_LOW_WATER= # 验证码生产恢复低水位
# P_BATCH_MAX=4 # 单个发送页面最多发送的验证码请求数
# P_SEND_CAP=0 # 0=不额外限制;>0=限制发送页面并发
# 页面和 token 获取
# SOLVER_REUSE=1 # token 页面复用
# MAX_SOLVER_REUSE=25 # 单个 token 页面最大复用次数
# SOLVER_INITIAL_WAIT_MS=500 # token 注入后的首次等待
# SOLVER_POLL_INTERVAL_MS=500 # token 轮询间隔
# SOLVER_POLL_ATTEMPTS=100 # token 最大轮询次数
# SOLVER_HARD_TIMEOUT=90 # 单次 solver 全链路硬截止(秒)
# SOLVER_CLEANUP_TIMEOUT=5 # 异常页回收最长等待(秒)
# SOLVER_FAST_CLICK=1 # 没有可见验证框时跳过慢点击
# SOLVER_MOUSE_CLICK_RETRIES=3 # token 验证框中心点击次数;0=关闭
# SOLVER_MOUSE_CLICK_INTERVAL_MS=600 # token 中心点击间隔(ms)
# PAGE_GOTO_WAIT_UNTIL=domcontentloaded # 页面导航等待策略
# PAGE_POST_WAIT_MS=500 # 页面导航后的短等待
# 可选性能开关
# PAGE_BLOCK_STATIC_ASSETS=0 # 阻断部分静态资源,降低页面准备成本
# C_HOT_PAGE_POOL=0 # 复用消费阶段页面,会增加常驻内存
# C_HOT_PAGE_POOL_SIZE=0 # 0=按启动期并发派生;>0=手动指定
# C_SET_COOKIE_VIA_REQUEST=0 # 用浏览器 request 访问 set-cookie URL;热页池开启时默认启用
# ---------------------------------------------------------------------------
# 代理grok-free-register 本进程出口,给 Playwright + httpx
# 与下面 FlareSolverr 清障栈是两套东西,不要混。
# Playwright 不会自动读环境变量,代码里会显式挂到 launch(proxy=...)。
# ---------------------------------------------------------------------------
# REGISTER_PROXY=http://127.0.0.1:40080 # 优先;指向本机 privoxy→WARP 时用这个
# HTTP_PROXY=http://127.0.0.1:7890 # 兜底REGISTER_PROXY 未设时)
# HTTPS_PROXY=http://127.0.0.1:7890
# ---------------------------------------------------------------------------
# Cloudflare 清障预热(调用外部 FlareSolverr不在本仓起 FS
# 默认 FS: docker compose 暴露 127.0.0.1:8191
# 预热根域名(无 path 后缀): accounts.x.ai / x.ai / status.x.ai / console.x.ai / auth.x.ai
# CLEARANCE_PROXY 是 FS *容器内* 浏览器的出口,必须是容器可达地址;
# 不要把 host 的 127.0.0.1 塞进去。走 WARP 时用 docker 网内 privoxy。
# ---------------------------------------------------------------------------
# CLEARANCE_ENABLED=1
# FLARESOLVERR_URL=http://127.0.0.1:8191
# CLEARANCE_URLS=https://accounts.x.ai,https://x.ai,https://status.x.ai,https://console.x.ai,https://auth.x.ai
# CLEARANCE_PROXY=http://privoxy:8118
# CLEARANCE_TIMEOUT_SEC=60
# CLEARANCE_REFRESH_SEC=3000
# ---------------------------------------------------------------------------
# 本机注册 → 推 keys 到远端 auth可选scripts/push_keys_to_auth.sh
# 无内置默认主机,必须显式填写。
# ---------------------------------------------------------------------------
# AUTH_SSH_HOST=user@auth-server.example
# AUTH_REMOTE_ROOT=/opt/grok-free-register
# AUTH_SSH_IDENTITY=
# AUTH_PUSH_INTERVAL=20