把已登录的 DeepSeek 网页账号包装成 OpenAI / Anthropic 兼容接口,支持工具调用、图片输入、账号池与本地管理台。首次使用需在插件目录手动运行一次 `node scripts/fetch-assets.mjs`,从 DeepSeek 官方 CDN 拉取 PoW 运行时;未拉取时反代能启动,但所有上游请求都会失败。
安装
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:keb-ght/dsh-web-proxy
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
把 chat.deepseek.com 网页版包装成 OpenAI / Anthropic 兼容 API,并作为 DeepSeek Harness(DSH)插件运行。 自带账号池、PoW 求解、工具调用协议、多模态图片输入、管理界面与热加载。
⚠️ 项目状态:实验性(Experimental)
功能仍在测试阶段,协议实现随时可能因为上游变动而失效,接口也不保证向后兼容。 不建议用于生产环境,不建议绑定主账号,不建议给多人共用。 想验证功能请用小号,并且随时做好账号状态变化的准备。
⚠️ 先读这一段:这不是给所有人用的
这个项目做的事,本质上是「用网页版的额度,冒充 API」。 在你动手之前,请把下面每一条都读一遍。
1. 这是非官方接入,可能与平台策略冲突
DeepSeek 网页版的用户协议对自动化访问有明确限制。本项目通过复现前端协议 (PoW 挑战、设备指纹、SSE 增量格式)达成自动化访问,属于条款边缘地带。
实际风险包括:
- 请求被限流(
40029 IP_ACCESS_RESTRICTED,前端提示「操作太快」) - 账号功能受到限制(
40012 USER_IS_BANNED/is_muted状态) - 同一网络出口下的其他账号可能被一并影响
请只用小号验证功能,不要绑定主账号。 这是实验性项目,不承诺任何稳定性。
2. 你的 token 等同于账号登录态
反代需要你的 userToken。持有它的人可以:
- 读取你的全部会话历史
- 以你的身份发消息(消耗你的额度)
- 看到你的账号基本信息
它不能改密码、不能看支付信息、不能删除账号——但这已经足够危险。
本项目把 token 明文存在 ~/.dsh/dsh-web-proxy/accounts.json,权限 0600。
如果你在共享机器、多用户环境、或者会备份整个 home 目录的场景下使用,先想清楚。
想立刻作废:DeepSeek 网页版 → 设置 → 退出所有设备。
3. token 可能随时失效
测试中观察到 token 会在使用一段时间后失效,原因可能包括:
- 网页版登录态本身有有效期
- 多设备登录互顶
- 平台侧的会话管理策略
失效后请求会返回 INVALID_TOKEN,账号状态变成 needs_login,需要重新走一次网页登录。
本项目不提供自动登录(那是另一回事,见下方「不做什么」)。
4. 别把它暴露到公网
默认只监听 127.0.0.1,管理 API 用独立 token 校验,CORS 只放行回环来源。
不要改成 0.0.0.0 然后端口映射出去——那等于把你账号的免费额度开放给整个互联网,
并且管理界面的导出功能会泄露明文 token。
5. 上游随时可能改协议
这不是官方 API,没有版本承诺。DeepSeek 前端改一次 PoW 算法、改一次 SSE 格式、 改一次工具调用标记,本项目就可能整体失效。
项目里的 scripts/fetch-assets.mjs 会从线上拉最新的静态资源,
但如果协议本身变了,需要重新逆向——这部分维护成本由使用者承担。
它到底是什么
┌──────────────┐ OpenAI / Anthropic 协议 ┌──────────────┐
│ 你的客户端 │ ──────────────────────────▶ │ dsh-web-proxy│
│ (SDK / DSH) │ │ :8787 │
└──────────────┘ ◀────────────────────────── └──────┬───────┘
SSE / JSON │
│ 复现网页版协议
▼
┌────────────────────┐
│ chat.deepseek.com │
│ PoW 挑战 / SSE 流 │
└────────────────────┘
中间那一层做的事情:
- 协议翻译 —— 把 OpenAI 的
messages拍平成网页版单输入框的 prompt - PoW 求解 —— 每个请求现取挑战,用官方 wasm 算出
X-DS-PoW-Response - SSE 解析 —— 网页版的增量是
{p,o,v}补丁 +{"v":"字"}简写,翻译成标准 chunk - 工具调用 —— 网页版没有原生 function calling,靠提示词协议 + 6 种格式兜底解析
- 多模态 —— 图片先上传拿
file_id,再带ref_file_ids发对话 - 账号管理 —— 轮转、冷却、限速、熔断、定时探活
功能状态
| 能力 | 状态 | 备注 |
|---|---|---|
OpenAI /v1/chat/completions |
✅ | 流式 / 非流式 |
Anthropic /v1/messages |
✅ | 含 message_start/delta/stop 全事件 |
| DeepSeekHashV1 PoW | ✅ | 复用官方 worker + wasm,不重写算法 |
| SSE 增量解析 | ✅ | 全量包 + {p,o,v} 补丁 + {"v":"x"} 简写 + BATCH |
| 工具调用(function calling) | ✅ | 标记协议 + 6 种自然格式兜底 |
| 多模态图片输入 | ✅ | base64 / http URL,单图 8MB 上限 |
| 账号池 | ✅ | 轮转 / 冷却 / 限速 / 熔断 / 每小时探活 |
| 管理界面 | ✅ | 账号池 / 请求日志 / 模型映射 / 设置 |
| 网页登录(自动抓 token) | ✅ | 同源代理登录页,密码不经过本项目代码 |
| 热加载 | ✅ | 改代码自动重启子进程,端口稳定 |
| 自动登录 / 刷新 token | ❌ | 见下方「不做什么」 |
| 多模态图片输出 | ❌ | 网页版本身不支持 |
安装
作为 DSH 插件
dsh plugin --profile web add link:/path/to/dsh-web-proxy
重启 DSH 后:
- 插件页出现
dsh-web-proxy - 设置 → 反代 里是完整管理界面
独立运行
npm run fetch-assets # 首次:拉 PoW 依赖(第三方 CDN 产物,不随仓库分发)
cp config.example.json config.json
npm start # → http://127.0.0.1:8787
导入账号
方式一:网页登录(推荐)
打开 http://127.0.0.1:8787/login,在里面正常登录。
页面被同源代理到本机,登录成功后脚本读 localStorage.userToken 自动入库。
你的密码只在这个页面里流转,不经过本项目的任何代码。
方式二:手动粘贴
浏览器登录 chat.deepseek.com → F12 → Application → Local Storage → userToken
→ 复制里面对应的 token → 管理界面「导入账号」。
使用
curl -s http://127.0.0.1:8787/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"deepseek-chat","messages":[{"role":"user","content":"你好"}],"stream":true}'
from openai import OpenAI
c = OpenAI(base_url="http://127.0.0.1:8787/v1", api_key="any")
print(c.chat.completions.create(
model="deepseek-chat",
messages=[{"role": "user", "content": "1+1"}],
).choices[0].message.content)
图片:
c.chat.completions.create(model="deepseek-chat", messages=[{
"role": "user",
"content": [
{"type": "text", "text": "这张图什么颜色?"},
{"type": "image_url", "image_url": {"url": "data:image/png;base64,..."}},
],
}])
模型:deepseek-chat(快速)/ deepseek-reasoner(深度思考)。
思考强度只有开/关两态(上游限制),reasoning_effort: "off" 才真正关闭。
架构
dsp/
├── server.mjs HTTP 服务 + 路由 + 管理 API
├── upstream.mjs 上游请求、header 整形、PoW 调度、SSE 直读
├── chat.mjs 会话编排、prompt 拼装、工具协议、重试熔断
├── sse.mjs SSE 解析 + 补丁应用 + 文本抽取
├── tool-parser.mjs 工具调用解析(移植自 ds-free-api,GPL-3.0)
├── vision.mjs 图片上传 + 状态轮询
├── anthropic.mjs Anthropic Messages 兼容层
├── accounts.mjs 账号池
├── models.mjs 模型映射
├── metrics.mjs 运行指标
├── errors.mjs 上游错误码 → 语义 + 动作
├── browser.mjs 慢路径(Playwright,可选)
├── providers/ 凭证获取扩展点
├── pow/ PoW 求解(worker_threads + 官方 wasm)
└── admin/ 管理界面(单文件 HTML + 登录页注入脚本)
不做什么
明确不提供的能力,PR 也不会接受:
- 自动登录、批量注册、验证码识别
- 任何硬编码的第三方密钥、公钥、证书
- 账号池以外的凭证获取方式
dsp/providers/ 是留给扩展的接口,你想接自己的凭证获取方式,写在本地,不要提交。
已知问题
| 问题 | 说明 |
|---|---|
| token 可能随时失效 | 需重新登录,暂无自动续期 |
| 8MB body 上限 | 对应原图约 6MB |
| 大图解析慢 | 上传后轮询最长 25s |
| 上游改版即失效 | 非官方 API,无兼容承诺 |
许可证
GPL-3.0
dsp/tool-parser.mjs 移植自 NIyueeE/ds-free-api(GPL-3.0)
的 src/openai_adapter/response/tool_parser.rs。依 GPL-3.0 第 5 条,本作品整体以 GPL-3.0 发布。
若你需要宽松许可证,可以删除该文件并自行实现工具解析——其余部分是独立编写的。
免责声明
本项目仅供个人学习与本地便利使用。
作者不对以下情况承担任何责任:账号被封、额度损失、数据泄露、服务中断、 以及因违反第三方服务条款而产生的任何后果。
使用即表示你已知悉上述全部风险,并自行承担。
链接
同类插件
Ebony-Vinyl/dsh-our-free-model★ 55971
为 dsh 接入免费模型车道(含 DeepSeek V4.1 Flash、Kimi K3 等),无需登录、注册或填写 API Key,并提供本地 OpenAI 兼容网关、降级路由与用量看板。
dingminhua/dsh-connect-workbuddy★ 993
将本机登录的 WorkBuddy 模型(国内版与国际版)接入 DSH,每次刷新按上游目录读取每个模型的积分倍率,支持逐模型图片输入开关、带自动换号的账号池、手动每日签到,以及卡片与输入框里的只读积分胶囊读数。
Alice-Marx/dsh-model-router★ 603
为 DeepSeek Harness 规划有依赖的工作包,将其分配给已配置的模型 API 或支持的厂商 CLI,并提供费用预览。
V1ki/dsh-plugin-subscriptions★ 546
把 ChatGPT(Codex)、Claude、Grok 订阅当作 DeepSeek Harness 的 LLM 提供方:设置页登录、模型目录、用量展示,以及 image_generate、video_generate 与 x_search 工具。
Mars-Sea/dsh-commandcode-provider★ 446
非官方 Command Code 模型接入插件:注册 `commandcode` 路由,带实时模型目录与推理强度支持。
FishBottle7/opencode2dsh★ 384
将 OpenCode Zen 免费模型接入 DeepSeek Harness,无需 API Key。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。