Bundle
dsh-deepseek-web
DSH 插件:把 chat.deepseek.com 网页端接进来。模型工具(提问 / 从第 xx 行看到 xx 行分析)、运行时技能 deepseek-web,以及 DSH 设置里的登录面板(一键拉起 Edge 抓取 token)。
- Source
- zgrajdnhj7806-svg
- License
- MIT
- Updated
- Updated 13 hours ago
Readme
# dsh-deepseek-web
把**你自己账号的 DeepSeek 网页版**(chat.deepseek.com)接进 [DeepSeek Harness (dsh)](https://github.com/deepseek-ai/deepseek-harness) 的插件:
模型可以直接调用网页端提问 / **按行区间(第 xx 行到 xx 行)分析文件**,DSH 设置页里带一个一键登录面板,免 API Key、免客户端回环。
> 纯 Node 实现:PoW 用 Node 内置 WebAssembly 跑官方 `sha3_wasm_bg.wasm`,登录用 Edge/CDP 自动抓取,零 Python/Playwright 依赖。
## 特性
| 类型 | 名字 | 说明 |
|---|---|---|
| 模型工具 | `deepseek_web_analyze_lines` | 读文件第 `start_line`–`end_line` 行,交给网页端模型分析;提示词带行号,回答可引用行号 |
| 模型工具 | `deepseek_web_ask` | 直接提问;支持深度思考 / 联网搜索 / 新会话 / 多轮 |
| 模型工具 | `deepseek_web_status` | 登录状态、token 摘要、凭据来源、账号 id |
| 运行时技能 | `deepseek-web` | 告诉模型什么时候该用网页端模型、怎么用行区间分析 |
| 设置分区 | 设置 → **DeepSeek 网页版** | 登录状态 + 一键登录 / 导入 / 手工粘贴 / 测试 / 退出 + 插件设置 |
三个工具都是**串行**的:DeepSeek 免费账号同一时刻只允许一路流式请求。
## ⚠️ 账号安全(务必先读)
本项目直接调用**你本人账号**的 DeepSeek 网页版(chat.deepseek.com),行为与你在浏览器里手动提问完全一样。请务必遵守:
1. **只支持单线程,不支持并发/并行提问**。插件刻意把所有调用做成**全串行**:
三个工具共用同一条流式通道,同一时刻只会有一个网页端请求在线。请**不要**自行并发调用、
「多开」多个实例,或绕过插件并行发请求——免费账号同一时刻只允许一路流式,并发必失败。
2. **不高频轰炸**。请保持接近真人提问的节奏(一次一问、串行推进)。高频、批量、自动化轰炸
会触发 DeepSeek 的风控,可能导致账号被限流、临时冻结甚至封禁,**后果由使用者自负**。
3. **仅限个人学习与自动化**。请遵守 DeepSeek 服务条款,不要用于违反条款的任何用途;
发给网页端的内容会离开本机,敏感代码与凭据不要发送。
> 一句话:**当单线程用,别当 API 用。**
## 环境要求
- Node.js **>= 20**(DeepSeek 官方推荐 >= 22.19 或 >= 24)
- 已安装并初始化 dsh(`npm install -g @deepseek-ai/dsh`,[官方快速开始](https://deepseek-harness.github.io/deepseek-harness/guide/quickstart))
## 一条命令安装
**Windows(PowerShell)**
```powershell
irm https://raw.githubusercontent.com/zgrajdnhj7806-svg/dsh-deepseek-web/main/scripts/install.ps1 | iex
```
**macOS / Linux**
```bash
curl -fsSL https://raw.githubusercontent.com/zgrajdnhj7806-svg/dsh-deepseek-web/main/scripts/install.sh | bash
```
脚本会做两件事:
1. `dsh plugin --profile web add github:zgrajdnhj7806-svg/dsh-deepseek-web`(把插件作为依赖装进 web profile);
2. 把 `dsh-deepseek-web` 追加到 profile 的 `dsh.profile.bundles` 列表(dsh 按层栈加载插件的那一步)。
装完**重启 dsh** 即生效:
```bash
dsh web
```
### 手动安装(等价步骤,不想跑脚本时用)
```bash
dsh plugin --profile web add github:zgrajdnhj7806-svg/dsh-deepseek-web
# 编辑 ~/.dsh/profiles/web/package.json:在 dsh.profile.bundles 数组里追加 "dsh-deepseek-web"
```
## 另一个形态:`v1.0/`(MCP 服务版)
`v1.0/` 是同一套网页端协议的另一份**独立实现**:一个纯 stdio 的 MCP 服务器,不依赖 dsh 的插件体系,
任何支持 MCP 的客户端都能接入;只想把它当「网页端模型代理」用时选这个。
**环境要求**:Node.js **>= 18**(PoW 用 Node 内置 WebAssembly 直跑官方 `sha3_wasm_bg.wasm`,依旧零 Python / 零代理)
```bash
cd v1.0
npm install # 只装 @modelcontextprotocol/sdk
```
> 请**保留仓库目录结构**:`v1.0/src/pow.mjs` 在本目录找不到 wasm 时会向上找 `assets/sha3_wasm_bg.wasm[.b64]`。
> 只把 `v1.0/` 单独拷走的话,要么连 `assets/` 一起拷,要么把 `sha3_wasm_bg.wasm`(或 `.wasm.b64`)放进 `v1.0/src/`。
**注册**:把 [v1.0/cordis.patch.yml](v1.0/cordis.patch.yml) 里的 `- insert:` 段合并进
`<DSH_HOME>/profiles/web/cordis.patch.yml` 的顶层数组,并把 `args` 里的 `<本目录>` 换成 `v1.0/` 的绝对路径:
```yaml
- insert:
- id: mcp-deepseek-web
name: '@deepseek-ai/dsh-mcp-client'
config:
transport: stdio
serverName: deepseek-web
command: node
args:
- '<v1.0 绝对路径>/src/index.mjs'
env:
DEEPSEEK_WEB_TOKEN: '<网页端 userToken>'
DEEPSEEK_WEB_COOKIE: '<网页端 cookie>'
# DWH_ROOT: '<项目根绝对路径>'
# DEEPSEEK_WEB_CREDENTIALS: '<credentials.json 绝对路径>'
```
**环境变量(`env` 段)**
| 变量 | 必填 | 说明 |
|---|---|---|
| `DEEPSEEK_WEB_TOKEN` | 是* | 网页端 userToken(F12 → `/api/v0/chat/completion` → `Authorization: Bearer` 后面的值) |
| `DEEPSEEK_WEB_COOKIE` | 否 | 同一次请求的 `Cookie` |
| `DEEPSEEK_WEB_CREDENTIALS` | 否 | 指向 `{ "token": …, "cookie": … }` 的 JSON 文件 |
| `DWH_ROOTS` | 否 | `fs_*` 工具的允许根目录,逗号 / 分号分隔可配多个 |
| `DWH_ROOT` | 否 | 单个默认根目录;与 `DWH_ROOTS` 都没有时用用户主目录 |
> *凭据取用优先级:`DEEPSEEK_WEB_TOKEN` 环境变量 → `DEEPSEEK_WEB_CREDENTIALS` 指向的文件 → `v1.0/credentials.json`。
**自带 7 个工具**
| 工具 | 说明 |
|---|---|
| `web_analyze_range` | 把内容交给网页端模型分析:给 `file` + `start_line`/`end_line` 读文件区间,或直接给 `code`;支持 `summary`/`analyze`/`explain`/`critique`/`implement`、多轮 `conversation_id`、`search=true` 联网、`save_result` 存档 |
| `critique_workspace` | 对工作区做对抗式审查(挑刺 / 找漏洞) |
| `fs_list` | 列目录(限定在允许根内,防越界) |
| `fs_read` | 读文件(同上) |
| `fs_grep` | 内容检索(同上) |
| `web_conversation_list` | 列出当前会话池里的网页端对话 |
| `web_conversation_clear` | 按 `conversation_id` 删单条,或 `all=true` 清空会话池 |
**直接跑(调试用)**
```bash
node v1.0/src/index.mjs # 按 MCP stdio 协议收发,ready 行打到 stderr
```
> 「⚠️ 账号安全」对 `v1.0/` 同样适用:**单线程、全串行,不要并发调用,不要高频轰炸**。
## 登录(三条路,从省事到兜底)
1. **一键登录(打开 Edge)** —— 设置页按钮。插件拉起本机 Edge(独立 profile,存在 `$DSH_HOME/cache/dsh-deepseek-web/browser_profile`),你在窗口里登录一次,插件用 CDP 读 `localStorage.userToken` 与 cookie 并保存,之后长期免登录。
2. **从 credentials.json 导入** —— 兼容其他工具导出的登录缓存(`{ "token": …, "cookie": … }`);放到插件同级的 `credentials.json`,首次使用会自动**只读**迁移。
3. **手工粘贴 token** —— 浏览器 F12 → 网络 → `/api/v0/chat/completion` 请求头,复制 `Authorization: Bearer` 后面的值。
登录态默认写进 **DSH 凭据服务**(`$DSH_HOME/.credentials.yaml`,目录 0700 / 文件 0600,记录键 `deepseek-web/login`);凭据服务不可用时回退到 `$DSH_HOME/cache/dsh-deepseek-web/credentials.json`(0600)。**token/cookie 不会写进 settings.yaml,也不会出现在任何发往浏览器的响应里**(界面只显示摘要)。
## 设置项(`settings.yaml` 的 `deepseek-web` 段)
| 键 | 默认 | 说明 |
|---|---|---|
| `enabled` | true | 关掉后不注册工具与技能(设置页仍可用,方便修好再开) |
| `autoLogin` | true | 是否允许一键登录拉起浏览器 |
| `browserPath` | '' | Edge/Chrome 路径,留空自动探测 |
| `loginTimeoutMs` | 300000 | 等待用户完成登录的最长时间 |
| `credentialsPath` | '' | 待导入的 credentials.json;留空用插件同级的 `../credentials.json` |
| `wasmPath` | '' | PoW WASM 路径(支持 `.wasm` 或同路径 `.wasm.b64`),留空用插件内置 |
| `defaultThinking` / `defaultSearch` | false | `deepseek_web_ask` 的默认开关 |
| `timeoutMs` | 180000 | 单次网页端请求超时 |
| `maxLines` | 400 | 行区间分析一次最多多少行(超了直接拒绝,避免把整文件塞进去) |
| `maxChars` | 60000 | 行区间分析一次最多多少字符 |
| `conversationsPerSession` | 4 | 每个 DSH 会话最多缓存多少个网页端会话 |
## 自测与独立 CLI
插件带一个脱离 DSH 的独立 CLI `bin/dsweb.mjs`,以及宿主侧集成自测:
```bash
node _selftest.mjs # 12 项:注册、凭据、路由围栏、真实行区间分析
node bin/dsweb.mjs --check
node bin/dsweb.mjs --file lib/pow.js --lines 30-52 --instruction "只关注内存安全"
```
## 文件结构
```
dsh-deepseek-web/
├── lib/
│ ├── index.js 插件入口:设置命名空间 + 工具 + 技能 + 路由
│ ├── config.js schemastery 配置 schema 与默认值
│ ├── service.js 业务层(配置 + 凭据 + 客户端 + 会话池)
│ ├── tools.js 三个模型工具(defineTool)
│ ├── skill.js 运行时技能描述符
│ ├── web.js 宿主 HTTP 路由(同源围栏 + ok/error 信封)
│ ├── client.js 浏览器半边(设置分区,classic script 工厂)
│ ├── client-core.js DeepSeek 网页端客户端(PoW + SSE + 多轮)
│ ├── pow.js Node 版 WASM PoW 解题器(.wasm / .wasm.b64 均可)
│ ├── analyze.js 行区间抽取 + 分析提示词组装
│ ├── login.js Edge + CDP 一键登录
│ └── state.js 凭据存取(凭据服务 / 0600 文件 / 只读导入)
├── assets/sha3_wasm_bg.wasm.b64 官方 PoW 模块的 base64 文本(运行时自动解码)
├── assets/skill/SKILL.md 技能正文
├── bin/dsweb.mjs 独立 CLI(--check / --prompt / --file --lines)
├── cordis.patch.yml bundle patch 行
├── scripts/ install.sh / install.ps1 一键安装
└── v1.0/ 独立的 MCP 服务版(package.json + src/index.mjs + src/pow.mjs + cordis.patch.yml)
```
## 已知限制
- **账号安全**:网页端账号同一时刻只允许一路流式,插件全串行、单线程;请勿并发调用或高频轰炸(详见上方「⚠️ 账号安全」)。
- token 会过期(几天到几周),过期后 `deepseek_web_status` / 报错信息会提示重新登录。
- 只有一层技能目录 / 行区间上限 `maxLines`,超限直接拒绝而不是截断——拆小区间更准。
- 一键登录会**弹出**一个可见浏览器窗口(这是设计如此:需要你手动过验证码/2FA)。
- 仅用于个人学习与自动化,请遵守 DeepSeek 服务条款;发给网页端的内容会离开本机。
## 许可
MIT © 2026 zgrajdnhj7806-svg
`assets/sha3_wasm_bg.wasm.b64` 是 chat.deepseek.com 网页端公开资源(DeepSeekHashV1 PoW 模块)的 base64 文本,版权归 DeepSeek 所有,仅随本插件分发用于协议兼容,请勿用于违反条款的用途。
Install
dsh plugin --profile web add github:zgrajdnhj7806-svg/dsh-deepseek-web
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-deepseek-web from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.