免 API Token 使用大模型 - 通过浏览器登录方式免费使用 ChatGPT、Claude、Gemini、DeepSeek、千问国际版、千问国内版、豆包、Kimi、智谱清言、Grok、小米 MiMo、Manus 等 AI 模型。
本项目通过已开启远程调试的 Chrome 完成各平台 Web 登录、保存会话,并对外提供 OpenAI 兼容的 HTTP 接口(GET /v1/models、POST /v1/chat/completions)。
首句为能力概述;实际已接入、可登录的 Web 站点以下表为准(与 src/cli/login.ts 中 ALL_PROVIDER_IDS 一致,当前共 13 个)。登录时把 <id> 传给 pnpm run login -- <id> 或 make login PROVIDER=<id>。
| 平台(常用名) | 提供方 id |
|---|---|
| ChatGPT | chatgpt-web |
| Claude | claude-web |
| Gemini | gemini-web |
| DeepSeek | deepseek-web |
| 千问(国际版) | qwen-web |
| 千问(国内版) | qwen-cn-web |
| Kimi | kimi-web |
| Grok | grok-web |
| 智谱清言(国内) | glm-web |
| 智谱清言(国际) | glm-intl-web |
| Perplexity(网页) | perplexity-web |
| 豆包 | doubao-web |
| 小米 MiMo | xiaomimo-web |
-
Node.js ≥ 20
-
pnpm(安装);本仓库用
packageManager固定版本,可用 Corepack:corepack enable -
本机可运行的 Google Chrome / Chromium(用于登录与部分「聊天走浏览器」路径)
-
远程调试的 Chrome(
--remote-debugging-port)。推荐用本仓库脚本启动,会单独指定user-data-dir(默认~/.zero-token/chrome-debug-profile),避免和日常自用的 Chrome 个人资料冲突。macOS 下使用应用包内的可执行文件,比通过open --args更稳定。命令示例:make chrome-debug # 无窗口,仍开 CDP(需扫码/网页登录时不要用无头,改用有界面:make chrome-debug): make chrome-debug-headless # 与 make 的静默不同:终端会打印使用说明,且 Chrome 的「DevTools listening…」会出现时: bash scripts/start-chrome-debug.sh # 无头、且终端见说明时: CHROME_HEADLESS=1 bash scripts/start-chrome-debug.sh
make chrome-debug/make chrome-debug-headless在内部均设置CHROME_DEBUG_QUIET=1,不刷屏;需要排查时可手动运行脚本。脚本可用CHROME_DEBUG_PORT、CHROME_USER_DATA_DIR覆盖默认端口与用户目录;无头通过CHROME_HEADLESS=1或make chrome-debug-headless。连接端点用BROWSER_CDP_URL(默认http://127.0.0.1:9222)。若不用脚本,可手写启动,例如(仅示意,不分离用户目录):
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222
git clone https://github.com/linuxhsj/zero-token.git
cd zero-token
make install
make chrome-debug
make login-all
# 启动服务
make start在已开远程调试的 Chrome 中打开目标站点并登录,然后执行(以 chatgpt-web 为例):
make login PROVIDER=chatgpt-web凭据默认写入 ~/.zero-token/credentials.json(可用 ZERO_TOKEN_DATA_DIR 改目录)。
启动网关:
make start
# 或指定端口
PORT=3001 make start健康检查:
make healthMakefile 只是对 pnpm / 脚本的薄封装,可直接用等价命令:
make 用法 |
等价命令 |
|---|---|
make install |
pnpm install |
make start |
PORT=3000 pnpm start(端口可用环境变量 PORT 覆盖,如 PORT=3001 pnpm start) |
make login PROVIDER=<id> |
pnpm run login -- <id> |
make login-all |
pnpm run login -- all |
make typecheck |
pnpm run typecheck |
make health |
curl -sS "http://127.0.0.1:${PORT:-3000}/health"(需服务已启动) |
make chrome-debug |
CHROME_DEBUG_QUIET=1 bash scripts/start-chrome-debug.sh(有界面;无终端提示、子进程不打印;可改端口与目录,见下表环境变量。) |
make chrome-debug-headless |
CHROME_DEBUG_QUIET=1 CHROME_HEADLESS=1 bash scripts/start-chrome-debug.sh(--headless=new,仍暴露 CDP。直接跑脚本时写 CHROME_HEADLESS=1 可相同效果。) |
也可在项目根目录用与脚本相同入口:node --import tsx src/cli/login.ts <id|all>、node --import tsx src/server.ts(启动前建议仍通过 pnpm install 安装依赖)。
依次尝试登录全部已支持的 Web 提供方(与上表及 ALL_PROVIDER_IDS 一致,当前共 13 个)。每个站点仍需你在浏览器中完成该站的登录/授权流程;某一站失败会记录错误并继续下一站,结束时会打印成功/失败汇总。
make login-all
# 等价: pnpm run login -- all| 目标 | 说明 |
|---|---|
make / make help |
打印帮助 |
make install |
pnpm install |
make start |
启动服务;PORT 默认 3000 |
make chrome-debug |
有界面、带 --remote-debugging-port 的 Chrome(供后续 login),与日常 Chrome 使用独立 user-data-dir |
make chrome-debug-headless |
无头(--headless=new)、仍暴露 CDP;需人工登录/扫码时请用 make chrome-debug |
make login PROVIDER=<id> |
运行浏览器登录;<id> 为 src/cli/login.ts 中列出的提供方(如 deepseek-web、chatgpt-web) |
make login-all |
按顺序执行全部提供方登录,单站失败不中断 |
make typecheck |
tsc --noEmit |
make health |
请求 http://127.0.0.1:$PORT/health(可设 PORT) |
make clean |
删除 node_modules 与 pnpm-lock.yaml |
| 变量 | 说明 |
|---|---|
PORT |
网关监听端口,默认 3000 |
BROWSER_CDP_URL |
Chrome 调试端点,默认 http://127.0.0.1:9222 |
CHROME_DEBUG_PORT |
仅 scripts/start-chrome-debug.sh:远程调试端口,默认 9222;若修改,需与 BROWSER_CDP_URL 的端口一致 |
CHROME_USER_DATA_DIR |
仅调试脚本:Chrome 用户数据目录,默认 ~/.zero-token/chrome-debug-profile |
CHROME_DEBUG_QUIET |
为 1 或 true 时脚本不 echo 且 Chrome 的 stdout/stderr 全部丢弃;make chrome-debug / make chrome-debug-headless 会设此值 |
CHROME_HEADLESS |
为 1 或 true 时脚本为 Chrome 增加 --headless=new(无界面,仍开远程调试;make chrome-debug-headless 会设此值) |
ZERO_TOKEN_DATA_DIR |
数据目录(含 credentials.json),默认 ~/.zero-token |
ZERO_TOKEN_API_KEY |
若设置,请求需带 Authorization: Bearer <key> |
ZERO_TOKEN_CHAT_VIA_BROWSER |
对 chatgpt-web / gemini-web / grok-web:设为 0 时关闭「聊天走真实页面 DOM」路径,仍用 Node 内流式实现 |
服务默认监听 http://127.0.0.1:3000(可用 PORT 修改)。以下路径与 OpenAI Chat Completions 用法一致,便于用任意支持自定义 baseURL 的客户端接入。
| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/health |
健康检查(不要求鉴权) |
GET |
/v1/models |
模型列表,返回的 id 即为下方 model 字段可用值 |
POST |
/v1/chat/completions |
聊天补全,支持流式(SSE)与非流式 JSON |
鉴权:若设置了环境变量 ZERO_TOKEN_API_KEY,则请求需带 Authorization: Bearer <与之一致的密钥>,否则返回 401。
模型 id:必须为 提供方/模型 形式(与 GET /v1/models 中每条 id 一致),例如 grok-web/grok-2、chatgpt-web/gpt-4、deepseek-web/deepseek-chat。
user 字段(与 OpenAI 相同,可选):对 qwen-cn-web,网关会按同一 user 同一会话复用千问浏览器/接口侧的 session_id(多轮在能解析到 req_id / parent_req 时还会带上续写)。对 doubao-web 会按同一 user 复用豆包返回的 conversation_id(Samantha 多轮)。不填时进程内会落到默认键,多客户端会共享同一条上游会话,建议为每个终端会话设稳定 user id。
非流式(stream 省略或 false):
curl -sS "http://127.0.0.1:3000/v1/chat/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $ZERO_TOKEN_API_KEY" \
-d '{
"model": "grok-web/grok-2",
"messages": [{ "role": "user", "content": "你好" }]
}'未设置 ZERO_TOKEN_API_KEY 时可去掉 Authorization 行。
流式("stream": true,响应为 SSE,data: {...} 行后接 data: [DONE]):
curl -N -sS "http://127.0.0.1:3000/v1/chat/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $ZERO_TOKEN_API_KEY" \
-d '{
"model": "grok-web/grok-2",
"messages": [{ "role": "user", "content": "你好" }],
"stream": true
}'工具调用(tools):请求体可带与 OpenAI Chat Completions 相同形态的 tools(仅 type: "function"),parameters 为 JSON Schema 对象。网关将工具定义写入对上游网页模型的 tool_json 提示,并把模型在回复中给出的 fenced tool_json 代码块解析为一次工具调用。响应中助手消息为 OpenAI 兼容的 tool_calls(非流式为完整 JSON;流式在结束前输出带 tool_calls 的 delta 与 finish_reason: "tool_calls")。多轮时请在 messages 中依序带上 assistant 的 tool_calls 与 role: "tool" 的工具结果。tool_choice: "none" 可关闭本次请求的工具。perplexity-web / doubao-web 不注入工具提示。若使用 浏览器内对话 路径(gemini-web / grok 默认的 CDP,且未将 ZERO_TOKEN_CHAT_VIA_BROWSER=0),不支持 tools,需改为纯流式后重试;chatgpt-web 默认走本仓库流式,可配合 tools(仍受各站风控与模型能力限制)。
拉取模型列表:
curl -sS "http://127.0.0.1:3000/v1/models" \
-H "Authorization: Bearer $ZERO_TOKEN_API_KEY" | jq .在代码里用 OpenAI 官方 SDK 指向本机(将 apiKey 与网关侧 ZERO_TOKEN_API_KEY 对齐;若未设网关密钥可填任意非空字符串,以通过客户端校验。需安装 SDK:pnpm add openai):
import OpenAI from "openai";
const openai = new OpenAI({
apiKey: process.env.ZERO_TOKEN_API_KEY ?? "unused",
baseURL: "http://127.0.0.1:3000/v1",
});
const r = await openai.chat.completions.create({
model: "grok-web/grok-2",
messages: [{ role: "user", content: "你好" }],
});其它兼容 OpenAI 的 CLI/应用(如部分 IDE 插件、LiteLLM 等)在配置中把 Base URL 填为 http://127.0.0.1:3000/v1 即可,模型名使用 GET /v1/models 返回的 id。
make typecheck
# 等价: pnpm run typecheck以 MIT License 发布。上游或自研扩展若再分发,请同时遵守其各自许可证。