把已登录的 DeepSeek 网页会话变成兼容 OpenAI 的本地接口
30.7/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/18 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add DhruvProgrammer/deepseekWEB-2-API该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
dsh 原生插件 · browser
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 17 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(unknown · 2026/11/1) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0⚪ 扫描:无法判定尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0已尝试扫描但取不到可分析的源码:仓库或包不存在、已删除,或为非 JS/TS 实现、未随包发布源码。无法判定,不代表安全。
- · 包内无可扫 JS
- · TS 源码(可能为非 JS 实现或未发布源码),无法判定
扫描于 2026/11/3(1 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
展开完整介绍(141 字)↓
把 chat.deepseek.com 变成本地、兼容 OpenAI 的 HTTP API。单文件 Python 命令行工具:一次性浏览器登录抓取你的会话,服务器每次请求都复用它。支持 openai SDK、OpenCode、DeepSeek Harness、Claude Code
README
由 DeepSeek 最新模型翻译生成🔄 deepseek-web2api
把 chat.deepseek.com 变成一个本地、兼容 OpenAI 的 HTTP API。
任何 OpenAI 客户端都能跑起来——官方 openai SDK、OpenCode、 DeepSeek Harness、LangChain、 Cursor、Aider、Claude Code(通过 OPENAI_BASE_URL)——直接对接你自己已登录的 DeepSeek 账号,不需要单独的 DeepSeek API key。
灵感来自 Sophomoresty/gemini-web2api。
单文件入口,但针对 DeepSeek 的 Web 协议做了适配(PoW 挑战、 SSE 补丁、localStorage.userToken)。
展开完整文档(README 剩余 1 节)
🔄 deepseek-web2api
把 chat.deepseek.com 变成一个本地、兼容 OpenAI 的 HTTP API。
任何 OpenAI 客户端都能跑起来——官方 openai SDK、OpenCode、 DeepSeek Harness、LangChain、 Cursor、Aider、Claude Code(通过 OPENAI_BASE_URL)——直接对接你自己已登录的 DeepSeek 账号,不需要单独的 DeepSeek API key。
灵感来自 Sophomoresty/gemini-web2api。
单文件入口,但针对 DeepSeek 的 Web 协议做了适配(PoW 挑战、 SSE 补丁、localStorage.userToken)。
┌──────────────┐ OpenAI /v1 ┌──────────────────────┐ chat.deepseek.com ┌────────────┐
│ any client │ ────────────► │ deepseek_web2api.py │ ──────────────────► │ DeepSeek │
│ OpenCode, │ ◄──────────── │ (FastAPI + uvicorn) │ ◄────────────────── │ web │
│ Claude Code, │ SSE │ │ SSE └────────────┘
│ harness... │ └──────────────────────┘
└──────────────┘ ▲
│ captured once via Chromium
▼
┌──────────────┐
│ your login │
└──────────────┘
✨ 特性
- OpenAI Chat Completions API(/v1/chat/completions)——支持流式与非流式
- OpenAI Responses API(/v1/responses)——兼容 Codex CLI
- 自动刷新会话——登录一次之后,后续运行复用持久化的浏览器配置档
- 进程内求解 PoW——用 wasmtime 跑 DeepSeek 自己的 sha3_wasm_bg.wasm,每个请求不必再往返真实浏览器
- 过滤 THINK / RESPONSE 片段——只把面向用户的回复暴露为 content,推理内容会被过滤掉
- 通过 conversation_id 支持多轮——跨请求保留 DeepSeek 的会话线程血缘
- 多个模型 id——deepseek-chat、deepseek-reasoner、deepseek-expert、deepseek-expert-reasoner,外加 OpenAI 风格的别名
- 可选的 API key 鉴权(--api-key)——把代理变成私有中继
- 跨平台——Linux、macOS、Windows;Chromium 由 Playwright 提供
- 零鉴权绕过——这不是免费版 DeepSeek。用的是你的账号、你的额度、你的正常网页登录。
⚠️ 真实状态
| 项目 | 状态 |
| OpenAI Chat Completions 线格式 | ✅ 已验证 —— 用官方 openai Python SDK 跑通 28/28 项检查 |
| OpenAI Responses API(Codex CLI) | ✅ 基础映射(input + instructions + previous_response_id + stream) |
| 单元测试 | ✅ 9 组 / 51 条断言通过 |
| 服务启动、/v1/models、/healthz | ✅ |
| Chromium 登录 + 抓取 cookie/userToken | ✅ 已实现;login 子命令用可见窗口处理 AWS WAF 人机校验 |
| 临时邮箱注册(mail.tm / tempmailc) | ✅ 已实现;signup 子命令驱动 DeepSeek 注册表单 |
| 用真实抓取的会话做端到端 | ⚠️ 需要在桌面环境交互登录(验证码)。已实现,但无法在无头沙箱里自动跑。 |
| 对真实 DeepSeek 做 PoW 往返 | ⚠️ 内置 WASM 就是 DeepSeek 自己的模块。对真实挑战可用;本沙箱里的合成测试无法完全验证。 |
完整且如实的状态清单见 tests/VERIFICATION.md。
📦 安装
需要 Python 3.10+,以及能跑 Chromium 的操作系统(Linux/macOS/Windows;WSL 也可以)。
git clone https://github.com/<you>/deepseek-web2api.git
cd deepseek-web2api
pip install -r requirements.txt
playwright install chromium
requirements.txt
playwright>=1.44
httpx>=0.27
fastapi>=0.111
uvicorn[standard]>=0.30
pydantic>=2.7
curl_cffi>=0.7
wasmtime>=21.0
🚀 用法
1. 一次性:登录
python deepseek_web2api.py login
→ a Chromium window opens on https://chat.deepseek.com/sign_in
log in with your email + password (or Google), solve the AWS WAF human-check
the script polls localStorage.userToken, saves it under data/session.json, exits
之后每次运行都会复用 data/profile/ 里的持久配置档,所以 login 只需做一次(或者会话约 6 小时后过期时再做一次 —— python deepseek_web2api.py refresh 会静默重新抓取)。
2. 启动服务
python deepseek_web2api.py serve --host 127.0.0.1 --port 8082
→ 🚀 DeepSeek Web2API listening on http://127.0.0.1:8082
OpenAI base URL: http://127.0.0.1:8082/v1
参数:
| 参数 | 默认值 | 作用 |
| --host | 127.0.0.1 | 绑定地址(用 0.0.0.0 对外暴露) |
| --port | 8082 | HTTP 端口 |
| --api-key | _(无)_ | 设置后,/v1/ 上要求 Authorization: Bearer <key> |
| --log-level | info | debug / info / warning / error |
| --no-interactive-login | 关闭 | 永不弹出浏览器;没有缓存会话时返回 503 |
3. 让任意 OpenAI 客户端指向它
Python(openai SDK)
from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:8082/v1", api_key="not-needed")
for chunk in client.chat.completions.create(
model="deepseek-chat",
messages=[{"role": "user", "content": "hi"}],
stream=True,
):
print(chunk.choices[0].delta.content or "", end="")
curl
curl http://127.0.0.1:8082/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-reasoner",
"messages": [{"role": "user", "content": "Reply with the word ready."}]
}'
OpenCode — 写入 ~/.config/opencode/opencode.json:
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"deepseek-local": {
"npm": "@ai-sdk/openai-compatible",
"name": "DeepSeek (local web2api)",
"options": {
"baseURL": "http://127.0.0.1:8082/v1",
"apiKey": "anything"
},
"models": {
"deepseek-chat": {},
"deepseek-reasoner": {},
"deepseek-expert": {},
"deepseek-expert-reasoner": {}
}
}
}
}
DeepSeek Harness — 在 $DSH_HOME/settings.yaml 中:
llm-pi-ai:
providers:
deepseek-local:
apiKeyEnv: ANYTHING
api: openai-completions
baseURL: http://127.0.0.1:8082/v1
models:
- id: deepseek-chat
- id: deepseek-reasoner
- id: deepseek-expert
Claude Code — 设置两个环境变量:
export OPENAI_BASE_URL=http://127.0.0.1:8082/v1
export OPENAI_API_KEY=anything
export OPENAI_MODEL=deepseek-chat
📡 API 端点
| 方法 | 路径 | 说明 |
| GET | /healthz | 存活探针 |
| GET | /v1/models | 列出模型 id |
| POST | /v1/chat/completions | OpenAI Chat Completions(流式 + 非流式) |
| POST | /v1/responses | OpenAI Responses API(兼容 Codex CLI) |
响应结构
非流式回复:
{
"id": "chatcmpl-…", "object": "chat.completion", "created": 1700000000, "model": "deepseek-chat",
"choices": [{
"index": 0,
"message": {"role": "assistant", "content": "Hello! How can I help?"},
"finish_reason": "stop"
}],
"usage": {"prompt_tokens": 4, "completion_tokens": 6, "total_tokens": 10},
"conversation_id": "abcd-1234-…:42" }
流式响应遵循标准 OpenAI chat.completion.chunk 结构:一个 role 先发一个 chunk,再发一串内容增量,最后发一个 finish chunk,带上 conversation_id,并以 data: [DONE] 收尾。
模型
| id | DeepSeek model_type | thinking |
| deepseek-chat | default | 关闭 |
| deepseek-reasoner | default | 开启(DeepThink) |
| deepseek-expert | expert | 关闭 |
| deepseek-expert-reasoner | expert | 开启 |
| deepseek-v3 | _deepseek-chat 的别名_ | |
| deepseek-r1 | _deepseek-reasoner 的别名_ | |
未知的模型 id 也接受(回落到 deepseek-chat)——总比因为手滑打错字就直接报错强。要加新 id,改 deepseek_web2api/format.py 里的 MODELS。
多轮对话
每个非流式回复(以及流式回复的最后一个 chunk)都带一个 conversation_id,格式是 <chat_session_id>:<last_message_id>。下次请求时把它放进 conversation_id 字段传回来,就能接着用同一个 DeepSeek 会话——服务端会沿用该会话已有的 parent_message_id 链继续。
reply1 = client.chat.completions.create(
model="deepseek-chat",
messages=[{"role": "user", "content": "Tell me a joke."}],
)
print(reply1.choices[0].message.content)
reply2 = client.chat.completions.create(
model="deepseek-chat",
messages=[{"role": "user", "content": "Another one."}],
extra_body={"conversation_id": reply1.conversation_id},
)
print(reply2.choices[0].message.content)
注意:会话的模型在创建时就固定了。继续对话会沿用原来的模型;续聊时传不同的 model 会被静默忽略。
🧠 工作原理
1. 登录 —— Playwright 在 data/profile/ 打开一个持久化的 Chromium 配置档,导航到 chat.deepseek.com/sign_in,等你登录(过掉 AWS WAF 的人机校验),然后从 localStorage.userToken 读出 bearer token,连同 cookie 一起保存到 data/session.json,权限 0o600。
2. 刷新 —— 后续调用(或服务端第一次请求)会从同一个配置档尝试无头抓取。只有彻底过期(找不到 token,cookie 全没了)才会触发一次可见的重新登录。
3. 对话 —— 服务端的纯 HTTP 客户端调用 DeepSeek 内部 API:
POST /api/v0/chat_session/create → new thread id
POST /api/v0/chat/create_pow_challenge → get a PoW challenge
solve it via the bundled WASM
POST /api/v0/chat/completion → SSE stream (with x-ds-pow-response header)
4. SSE 解析 —— DeepSeek 的流是 JSON-patch 格式:
{"v": {"response": {"fragments": [
{"type": "THINK", "content": "Let me think..."},
{"type": "RESPONSE", "content": "The answer is"}
], "message_id": 42}}}
{"p": "response/fragments/-1/content", "o": "APPEND", "v": " 42"}
{"v": "."}
我们追踪哪些路径指向 RESPONSE 片段,跳过 THINK/SEARCH 内容,这样用户只会看到真正的回复。
5. PoW —— DeepSeek 在 /api/v0/chat/completion 前面加了一道 proof-of-work 头(x-ds-pow-response)。算法(「DeepSeekHashV1」)以 WebAssembly 模块的形式发布在 DeepSeek 自己的 CDN 上(fe-static.deepseek.com/.../sha3_wasm_bg.wasm)。我们把同一个模块打包进 deepseek_web2api/sha3_wasm_bg.wasm,用 wasmtime 运行 —— 跑的是浏览器里同一份代码,不来回请求,也不重新实现。
🗂 文件结构
deepseek_web2api/
├── deepseek_web2api.py # single-file CLI entry point
├── deepseek_web2api/ # package — the actual implementation │ ├── pow.py # PoW solver (runs DeepSeek's WASM via wasmtime) │ ├── auth.py # Chromium login + session capture + CLI │ ├── client.py # pure-HTTP DeepSeek client
│ ├── format.py # OpenAI <-> DeepSeek message conversion
│ ├── server.py # FastAPI app
│ ├── tempmail.py # mail.tm + tempmailc.com helpers (test only)
│ ├── signup.py # browser-driven signup automation (test only)
│ └── sha3_wasm_bg.wasm # DeepSeek's PoW module, bundled
├── tests/
│ ├── test_units.py # 51 unit assertions
│ ├── test_openai_compat.py # 28 OpenAI SDK compat assertions
│ ├── test_orchestration.py # 37 full-code-path assertions with mock client
│ ├── test_e2e.py # signup → capture → serve → query (needs real account)
│ ├── run_all.py # runs all 3 deterministic suites sequentially
│ └── VERIFICATION.md # what works, what doesn't, why
├── data/ # gitignored — your session + browser profile live here ├── README.md ├── requirements.txt └── .gitignore
🧪 开发
运行测试
3 deterministic suites (no DeepSeek account needed)
python -m tests.run_all
individually
python -m tests.test_units # 9 groups / 51 assertions
python -m tests.test_openai_compat # 28 assertions (boots server, drives openai SDK)
python -m tests.test_orchestration # 37 assertions (boots server, mock client)
test_e2e.py 脚本会走一遍真实的 DeepSeek 注册流程(用临时邮箱地址),测试完整链路。它需要真实的 Chromium 环境,能解 AWS WAF 验证码 —— 在无头沙箱里跑不通端到端。
项目约定
- 根目录放单文件命令行(deepseek_web2api.py),带子命令。
- 实现代码放在 deepseek_web2api/ 包里。
- 所有文件 I/O 都写入 data/,凭据材料用 0o600 / 0o700 权限。
- Bearer token 绝不写日志。
- 公开函数带 docstring;类型标注用 PEP 604(X | None)。
- 服务端是 uvicorn 上的 FastAPI,默认不带 CORS(它是本地代理 —— 没有反向代理和鉴权,别把它暴露到公网)。
🔐 安全
- data/session.json 里存着你的 bearer token,别外传。文件创建时权限是 0o600。
- 打包进来的 sha3_wasm_bg.wasm 属于 DeepSeek —— 带上它,只因为跟他们的公开 Web API 通信需要它。
- 默认绑定 127.0.0.1。别把这个服务器直接暴露到公网,除非前面挡一层反向代理(nginx、caddy 之类)再加一层真正的鉴权。
- --api-key 故意做得很简陋 —— 就是一个 Starlette 中间件,检查 Bearer token。它不能替代 TLS、限流或审计日志。
- 每个发往 chat.deepseek.com 的上游请求都会带上 authorization: Bearer <your-token>。要是你开了 log_requests: true(以后的功能),或者把 core dump 分享出去,这个 token 就泄露了。别这么干。
🧯 故障排查
| 现象 | 可能原因 / 解决办法 |
| playwright._impl._errors.Error: Executable doesn't exist | 运行 playwright install chromium |
| LoginRequired: No DeepSeek session found | 运行一次 python deepseek_web2api.py login 抓取会话,或者设置 --no-interactive-login 并加载 data/session.json |
| RuntimeError: PoW solver returned no answer | 打包的 WASM 过期了 —— DeepSeek 发了新的。从 https://fe-static.deepseek.com/chat/static/sha3_wasm_bg..wasm 下载后,设置 DS_POW_WASM=/path/to/new.wasm |
| 上游报 openai.AuthenticationError: 401 | 会话过期了(cookies、token,或者两者都过期)。运行 python deepseek_web2api.py refresh 静默重新抓取,或者再跑一次 login。 |
| chat.deepseek.com 返回 403 Request blocked | AWS WAF 认为你是机器人。在可见窗口里运行 login,完成验证码。 |
| No message arrived for <email> within 120s | DeepSeek 的注册邮件进了垃圾箱,或者邮件服务挂了。换一家临时邮箱服务商试试。 |
| 服务器返回 502 upstream_error | DeepSeek 的协议变了,或者你被限流了。检查 data/session.json 是不是最新的。 |
📜 许可证
MIT —— 见 LICENSE。
打包的 deepseek_web2api/sha3_wasm_bg.wasm 属于 DeepSeek,带上它,只因为跟他们的公开 Web API 通信需要它。
🙏 致谢
- Sophomoresty/gemini-web2api —— 本项目沿用的模式
- kittors/deepseek-web-api —— PoW + 会话流程的 TypeScript 参考实现
- sums001/Deepseek-API — WASM 求解器的纯 Python 参考实现
- mail.tm 和 tempmailc.com — 测试框架使用的临时邮箱服务商
⚖️ 免责声明
本项目非官方,与 DeepSeek 无关联,也未获其认可。
使用风险自负。DeepSeek 网页协议不是公开 API,可能随时变更。
本工具复用你已登录的会话,与你自己的账号通信——它不绕过身份验证,不产生免费的 DeepSeek 用量,也无法支撑工业级负载。
使用前请阅读 DeepSeek 的服务条款。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
DhruvProgrammer/deepseekWEB-2-API
把已登录的 DeepSeek 网页会话变成兼容 OpenAI 的本地接口
相关插件 · 浏览器
智能体插件框架deepseek-ai/deepseek-harness
DeepSeek Harnessdsh是由 DeepSeek AI 开发的开源 agent harness智能体框架。
★ 270,422已汉化DSH
71.9
多设备 Agent 看板YaoApp/yao
✨ 所有 Agent 和工作区集中管理,覆盖你的每一台设备。任务看板追踪进度,桌面端、移动端、浏览器、API…
★ 8,147已汉化DSH
71.2
可扩展侧边栏工作台omdsh-dev/DSH-better-sidebar
DSH 的双工作台:原生右侧栏 + 自绘底部面板,并把 ctx.betterSidebar 服务开放给所有插件
★ 4,761已汉化DSH
71.1
浏览器自动化桥Tencent/BrowserSkill
你的 Agent。你的浏览器。连接,就能协作。
★ 9,967已汉化DSH
71
AI 小说创作工作台EthanYoQ/AI-Novel-Writer
AI 小说作家 / AI Novel Writer
★ 1,591已汉化DSH
70.7
智能体浏览器引擎platonai/Browser4
DeepSeek Harness 集成
★ 1,175已汉化DSH
70.4
这是你的仓库?认领条目