🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

网页版接入 ZHANG-923-ZE/dsh-freetoken

DeepSeek Harness
ZHANG-923-ZE5 天前有提交已提供中文文档扫描:含敏感能力

非官方 DSH 插件,把 chat.deepseek.com 网页接入 DeepSeek Harness,作为…

31.5/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/27 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add ZHANG-923-ZE/dsh-freetoken
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · model
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 5 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 42 处,展示前 42 条)
  • 写入剪贴板
    src/client.ts:165
    try { navigator.clipboard.writeText(String(text)); } catch {}
  • 发起网络请求
    src/client.ts:240
    const res = await fetch(API, { headers: { accept: "application/json" }, cache: "no-store" });
  • 写入本地文件
    src/lifecycle.ts:35
    mkdirSync(dir, { recursive: true })
  • 写入本地文件
    src/lifecycle.ts:36
    writeFileSync(
  • 读取本地文件
    src/session/journal.ts:91
    if (!existsSync(file)) return []
  • 读取本地文件
    src/session/journal.ts:92
    const parsed: unknown = JSON.parse(readFileSync(file, 'utf8'))
  • 写入本地文件
    src/session/journal.ts:111
    mkdirSync(dirname(file), { recursive: true })
  • 写入本地文件
    src/session/journal.ts:117
    writeFileSync(temp, payload, { encoding: 'utf8', mode: FILE_MODE })
  • 写入本地文件
    src/session/journal.ts:119
    renameSync(temp, file)
  • 写入本地文件
    src/session/journal.ts:122
    writeFileSync(file, payload, { encoding: 'utf8', mode: FILE_MODE })
  • 删除本地文件
    src/session/journal.ts:124
    unlinkSync(temp)
  • 删除本地文件
    src/session/journal.ts:131
    unlinkSync(temp)
  • 读取本地文件
    src/session/mapping.ts:108
    if (!existsSync(this.file)) return
  • 读取本地文件
    src/session/mapping.ts:109
    const raw = JSON.parse(readFileSync(this.file, 'utf8')) as PersistedState
  • 写入本地文件
    src/session/mapping.ts:136
    mkdirSync(dirname(this.file), { recursive: true })
  • 写入本地文件
    src/session/mapping.ts:138
    writeFileSync(temp, `${JSON.stringify(state, null, 2)}\n`)
  • 写入本地文件
    src/session/mapping.ts:139
    renameSync(temp, this.file)
  • 读取本地文件
    src/transport/auth.ts:101
    if (!existsSync(file)) return undefined
  • 读取本地文件
    src/transport/auth.ts:102
    return sanitize(JSON.parse(readFileSync(file, 'utf8')))
  • 写入本地文件
    src/transport/auth.ts:114
    mkdirSync(dirname(file), { recursive: true })
  • 写入本地文件
    src/transport/auth.ts:115
    writeFileSync(temp, `${JSON.stringify(checked, null, 2)}\n`, { mode: 0o600 })
  • 写入本地文件
    src/transport/auth.ts:116
    renameSync(temp, file)
  • 读取本地文件
    src/transport/auth.ts:123
    if (!existsSync(file)) return false
  • 删除本地文件
    src/transport/auth.ts:124
    unlinkSync(file)
  • 读取本地文件
    src/transport/halt.ts:28
    if (!existsSync(file)) return undefined
  • 读取本地文件
    src/transport/halt.ts:29
    const raw = JSON.parse(readFileSync(file, 'utf8'))
  • 写入本地文件
    src/transport/halt.ts:47
    mkdirSync(dirname(file), { recursive: true })
  • 写入本地文件
    src/transport/halt.ts:48
    writeFileSync(temp, `${JSON.stringify({ ...state, at: state.at || Date.now() }, null, 2)}\n`, { encoding: 'utf8', mode: 0o600 })
  • 写入本地文件
    src/transport/halt.ts:49
    renameSync(temp, file)
  • 删除本地文件
    src/transport/halt.ts:57
    unlinkSync(haltPath(env))
  • 读取本地文件
    src/transport/identity.ts:30
    if (!existsSync(file)) return undefined
  • 读取本地文件
    src/transport/identity.ts:31
    return JSON.parse(readFileSync(file, 'utf8')) as T
  • 写入本地文件
    src/transport/identity.ts:39
    mkdirSync(dirname(file), { recursive: true })
  • 写入本地文件
    src/transport/identity.ts:40
    writeFileSync(temp, `${JSON.stringify(value, null, 2)}\n`)
  • 写入本地文件
    src/transport/identity.ts:41
    renameSync(temp, file)
  • 删除本地文件
    src/transport/identity.ts:137
    unlinkSync(file)
  • 发起网络请求
    src/transport/probe.ts:40
    const doFetch = fetchImpl ?? ((input: any, init?: any) => fetch(input, init))
  • 读取本地文件
    src/transport/usage.ts:32
    if (!existsSync(file)) return undefined
  • 读取本地文件
    src/transport/usage.ts:33
    const raw = JSON.parse(readFileSync(file, 'utf8'))
  • 写入本地文件
    src/transport/usage.ts:49
    mkdirSync(dirname(file), { recursive: true })
  • 写入本地文件
    src/transport/usage.ts:50
    writeFileSync(temp, `${JSON.stringify({ day: localDayKey(now), count: Math.max(0, Math.floor(count)), at: now }, null, 2)}\n`, {
  • 写入本地文件
    src/transport/usage.ts:54
    renameSync(temp, file)
扫描于 2026/11/1(0 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
展开完整介绍(78 字)↓

非官方 DSH 插件:把 chat.deepseek.com 网页接入 DeepSeek Harness,作为 deepseek-web 服务商。默认关闭。

README

由 DeepSeek 最新模型翻译生成
dsh-freetoken 非官方 DSH 插件,把 chat.deepseek.com 网页接入 DeepSeek Harness,作为 deepseek-web 服务商。仅作开发辅助;默认关闭。 ⚠️ 风险声明本插件驱动 chat.deepseek.com 的私有网页接口。这可能违反 DeepSeek 的服务条款,并导致限流或封号。它与 DeepSeek 没有任何隶属关系,也未获其认可。请只用可弃用(非关键)账号,并自行承担全部责任。「免费 token」不等于「没有风险」。 状态 | 项 | 值 | | 版本 | 0.3.2(真实链路已打通:登录/文本/工具/图片) | | provider id | deepseek-web(显示名 DeepSeek 网页) | | 配置命名空间 / 日志前缀 | freetoken / freetoken: | | 默认 | enabled: false(零副作用) | | 构建 | tsc → lib/(逐文件 ESM,保留懒加载边界);client 面板同目录 classic script | | 验证 | 构建 0 错;离线 30/30;真实 E2E:文本/文件读写+grep/图片理解 | 验证口径为作者本地环境的最后一次实测记录,不构成对所有环境的保证。
展开完整文档(README 剩余 1 节)
dsh-freetoken

非官方 DSH 插件,把 chat.deepseek.com 网页接入 DeepSeek Harness,作为 deepseek-web 服务商。仅作开发辅助;默认关闭。

⚠️ 风险声明本插件驱动 chat.deepseek.com 的私有网页接口。这可能违反 DeepSeek 的服务条款,并导致限流或封号。它与 DeepSeek 没有任何隶属关系,也未获其认可。请只用可弃用(非关键)账号,并自行承担全部责任。「免费 token」不等于「没有风险」。

状态

| 项 | 值 |
| 版本 | 0.3.2(真实链路已打通:登录/文本/工具/图片) |
| provider id | deepseek-web(显示名 DeepSeek 网页) |
| 配置命名空间 / 日志前缀 | freetoken / freetoken: |
| 默认 | enabled: false(零副作用) |
| 构建 | tsc → lib/(逐文件 ESM,保留懒加载边界);client 面板同目录 classic script |
| 验证 | 构建 0 错;离线 30/30;真实 E2E:文本/文件读写+grep/图片理解 |

验证口径为作者本地环境的最后一次实测记录,不构成对所有环境的保证。

环境要求

| 项 | 要求 |
| DSH | Desktop 0.2.1-rc.2 或更新 |
| Node | ^22.18.0 \|\| >=24.11.0 |
| 浏览器 | Edge 或 Chrome(需支持 CDP;登录与 PoW 求解都在真实浏览器页内完成) |
| 平台 | Windows x64 已实测;macOS / Linux 未实测 |

构建与测试

npm install
node scripts/build.mjs
node tests/run-offline.mjs

安装

插件可从 GitHub 地址、本地目录或 npm 包名三种方式安装(DSH 的 dsh plugin add / 设置页「添加插件」均支持)。

方式一:从 GitHub 安装(推荐,无需手动构建)

dsh plugin --profile freetoken-web add https://github.com/ZHANG-923-ZE/dsh-freetoken

DSH 会自行 clone 并以 pnpm 安装该仓库(仓库根即 npm 包根,main 分支为默认分支)。

方式二:本地目录安装

git clone https://github.com/ZHANG-923-ZE/dsh-freetoken.git
cd dsh-freetoken
npm install
node scripts/build.mjs # 必须先构建:lib/ 是产物,不入库
dsh plugin --profile freetoken-web add "link:<你的绝对路径>\dsh-freetoken"

lib/ 不在版本库里(见 .gitignore),所以走本地目录时必须先跑一次构建,否则插件装上后没有 lib/index.js 可加载。

方式三:桌面端图形界面

DSH 设置 → 插件 → 「添加插件」,输入框直接填 https://github.com/ZHANG-923-ZE/dsh-freetoken(界面接受包名 / GitHub 仓库地址 / 本地目录路径)。

启用

插件默认关闭(enabled: false,零副作用)。启用有两种方式:

- 在 profile 的 cordis.patch.yml 里覆盖:

- id: freetoken
config:
enabled: true

- 或在 DSH 设置 → dsh-Freetoken 面板中启用(面板本身在关闭态也可打开,用于查看状态)。

启用后用 /freetoken login 完成登录(见下方「命令」)。

隔离 profile(推荐先用隔离环境试跑)

$env:DSH_HOME="C:\Users\<you>\AppData\Local\Temp\freetoken-test-home"
dsh plugin --profile freetoken-web add https://github.com/ZHANG-923-ZE/dsh-freetoken
在 profile 的 cordis.patch.yml 里 - id: freetoken config.enabled: true
dsh --profile freetoken-web --no-open --port 61888

desktop profile 安装前先备份 package.json / pnpm-lock.yaml / cordis.patch.yml,并禁用基座插件 dsh-deepseek-web-login(同 provider id 会 DUPLICATE_ADAPTER)。

卸载与回滚

1. dsh plugin --profile <name> remove dsh-freetoken;
2. 删除 cordis.patch.yml 里 id: freetoken 的覆盖项(否则 compose 仍报缺包);
3. Windows/pnpm 有时留下 node_modules/dsh-freetoken 悬空 junction —— 手工删除;
4. 需要恢复原状时还原步骤 0 的三个快照文件;freetoken/ 状态目录可保留或整目录删除。

配置(profile 的 cordis.patch.yml 覆盖)

- id: freetokenyaml
config:
enabled: true
transport: browser # 仅 browser;PoW 必须在真实浏览器页内完成 backend: cdp # cdp 已实现;dom 为长期可插拔选项(明确报错)
narration: { enabled: true, dedupeWindowMs: 90000, maxRepeats: 2 }
localTitle: { enabled: true, maxChars: 32 }
rhythm:
jitterMs: { min: 2000, max: 5000 } # 对数正态,禁止固定周期
maxCallsPerTurn: 1 # 一轮只发一次(0.5.0 起,阻止连发)
silenceMs: { min: 60000, max: 120000 }
silenceScale: { perRequests: 5, stepMs: 120000, capMs: 600000 }
dailyBudget: 20 # 硬性日上限(0 = 不限制)

滚动窗口限速:任意 rateWindowMs 内最多 rateMaxInWindow 次。

比日预算精细 —— 日预算防总量,这条防"短时突发"(封禁的真实形态)。

rateWindowMs: 1800000
rateMaxInWindow: 6

连续请求长休:连续 N 次后强制休息 3–5 分钟("连续跑"比"总量多"更像脚本)。

longRunThreshold: 5
longRunBreakMs: { min: 180000, max: 300000 }
retry: { maxRetries: 3, baseDelayMs: 5000, factor: 2, maxDelayMs: 120000, jitterRatio: 0.3 }
safety: { testAccountOnly: true, haltOnMute: true, minRequestGapMs: 60000 }
protocol: { autoContinue: false } # 不自动续写(每轮续写都是一次真实请求)
session:
reuseTurns: 20
cleanup: deferred

上下文投喂方式(0.4.0 起默认 chained)

chained:每轮只发增量,且不轮换会话 ⇒ 一个 DSH 会话长期对应同一条网页版会话。

代价:工具协议只存在于链首那条消息里,服务端丢早期上下文时模型可能不按

约定格式发工具调用(插件遇不确定会自动退回全量重发)。

full :每轮重发全量,最稳但请求体随对话线性增长(实测单轮可达 21 万字符)。

contextMode: chained

凭证年龄预检(0 = 关闭)。超过它就先用页面续签一次,避免任务中途撞 401。

credentialRefreshAgeMs: 5400000

启用且已有凭证时预热并常驻传输层会话(站点自己的 JS 会维持登录态)。

false = 退回旧行为(第一次真实请求才懒启动)。

autoStartWarmSession: true

命令

- /freetoken status — 只读:登录/锁/队列/静默/今日请求/最近拦截/最近失败/旁白/指标。
- /freetoken login — 拉起独立 Edge 窗口手动登录,自动捕获 token/cookie/指纹头到 ~/.dsh/freetoken/auth.json。
- /freetoken logout — 清除本地凭证。
- /freetoken probe — 只读探活(页面内 fetch,零额度;会懒启动浏览器)。

命令必须在输入框以 /freetoken ... 形式执行;它声明了 input,不会当聊天文本发出去。

与其他 provider 并存(网页版 / 官方 API)

本插件不占用任何已有的 provider:它只是新增一个 deepseek-web(显示名「DeepSeek 网页」),和宿主自带的 deepseek-account(官方 API)以及其它第三方 provider 并列共存。
在模型选择器里各自独立列出,随时切换,互不影响。

| | deepseek-web(本插件) | deepseek-account(官方 API) |
| 入口 | 模型选择器 → 「DeepSeek 网页」 | 模型选择器 → 官方 DeepSeek |
| 凭证 | 浏览器登录态(/freetoken login) | API key |
| 额度 | 网页版免费额度,有速率限制 | 按量计费 |
| 稳定性 | 约 2 小时需重登;有风控风险 | 稳定 |
| 适合 | 偶尔问几句、非关键任务 | 长任务、工具循环、agent 工作负载 |

什么时候用哪个(建议):

- 日常随手问 → 用「DeepSeek 网页」(免费)
- 要跑工具循环 / 长任务 / 无人值守 → 用官方 API(网页版会被风控盯上)
- 网页版被限流或掉登录 → 直接切官方 API,不用改任何配置

注意:两个 provider 的会话上下文互不相通(各自独立的历史)。同一个 DSH 会话里切换 provider,等于换了一个模型后端,之前网页版链式投喂的上下文不会被官方 API 继承。
需要连续上下文时,整个会话用一个 provider 跑完。

模型 id 撞名提醒:网页版的两个模型沿用 deepseek-chat / deepseek-reasoner,与官方 API 的 id 相同 —— 这不影响选择(宿主按 provider + model 二元组区分),但有两处要留意:

- 走网页版时如果传了未收录的模型 id(例如官方 API 的 deepseek-v3.2),插件会回退到快速模式(resolveSpec 的兜底),不会报错但也不是你选的那个;需要「深度思考」请显式选 deepseek-reasoner。
- 反过来,官方 API 不认识网页版的两个 id 时按它自己的规则处理,与本插件无关。

数据与安全
- 所有状态都放在 ${DSH_HOME:-~/.dsh}/freetoken/:auth.json、device.json、browser-profile/、 transport-profile/、sessions-in-use.json、resume-state.json、diagnostics/。
- 凭证不进仓库、日志、提示词;日志里只出现掩码。
- 默认节奏:发送前 2–5s 对数正态抖动,失败从 5s 起指数退避加抖动,AUTH/mute/QUOTA 不重试,每 20 次请求后静默 30–60s。出现 AUTH/mute 立即停止,不自动换号。

会话常驻与登录态(0.4.0)

这一版把「凭证快照 + 跨浏览器重放」改成「单一会话本体」,目的是让后台的网页版登录持续在线,而不是到点就断:

- 传输层配置档不再每次重建:站点写给这个浏览器的 cookie/localStorage 会跨启动保留(只清运行时句柄 DevToolsActivePort / lockfile / Singleton,不动登录态)。
- autoStartWarmSession:启用且已有凭证时就把后台浏览器拉起来常驻,由站点自己的 JS 维持会话(不再等第一次请求)。设 false 可退回旧的懒启动行为。
- 常驻守护(keep-alive):每 60s×[0.7,1.3] 做一次本地 CDP 探测(零网络),判定 alive / off-origin / logged-out / dead:
- 页面被导航走 ⇒ 拉回站点(同一情况最多试 2 次);
- 页面丢登录态 ⇒ 作废页面签名,下一次请求自动重装;
- 浏览器被关掉/崩了 ⇒ 连续 3 次探测失败后自动重新拉起(误关也能自愈),失败按 60s×2ⁿ 退避(上限 30 分钟),连续 5 次仍失败则停表等下一次真实请求;
- ⚠️ 有请求在飞时绝不重启浏览器(否则会掐断正在输出的回答)。
- /freetoken status 会显示 session: mode=... | keep-alive=...,面板可据此判断「后台会话是否常驻」。

懒加载与关闭态

- 轻模块:index.ts / config.ts / status.ts / commands.ts / lifecycle.ts。
- 重模块(浏览器、webapi、PoW、SSE、协议解析、节奏控制器、会话清理)只能经 src/lazy/load.ts 动态加载;关闭态不加载、不注册服务商、不发请求、不起进程。
- 验收:tests/check-disabled-audit.mjs、tests/check-lazy-import.mjs。

面板

启用后:设置 → dsh-Freetoken。显示登录/身份/浏览器/锁队列/节奏与静默倒计时/今日请求/ 最近请求与拦截/重试退避/熔断/最近失败/旁白/指标/懒加载模块;host API 为 GET /freetoken/api/status(只读、无凭证)。关闭态显示「已关闭(未启用)」且不轮询。

许可

Apache-2.0,衍生自 cv-superding/dsh-deepseek-web-login(Apache-2.0,commit cfd684d),署名见 NOTICE 与 src/transport/vendor/NOTICE.md。
与 DeepSeek 无关联;网页私有接口可能变更、可能导致账号受限,风险自担;只用非关键账号测试。

贡献与反馈

- Issue:https://github.com/ZHANG-923-ZE/dsh-freetoken/issues
- 报告问题时请附上 freetoken: 前缀日志片段(先掩码 token / cookie)与你的 DSH 版本、Node 版本、平台;不要贴任何凭证。
- 改动请保持既有工程约束:关闭态零副作用、重模块只能经 src/lazy/load.ts 懒加载、日志前缀统一 freetoken:、transport/egress.ts 是唯一 fetch 出口。
- 提交前请跑通 node scripts/build.mjs 与 node tests/run-offline.mjs。
- 完整工程约定见 CONTRIBUTING.md。
- 安全问题请勿公开开 issue,见 SECURITY.md(含私下报告渠道)。

仓库结构

src/ TypeScript 源码(按 adapter / protocol / rhythm / session / transport 分层) lazy/load.ts 唯一的动态 import 入口(重模块懒加载边界) transport/vendor/ 来自上游基座的衍生代码,署名见该目录 NOTICE.md tests/ 离线用例(check-.mjs),总入口 run-offline.mjs scripts/build.mjs tsc 逐文件 ESM 构建到 lib/ .github/workflows/ci.yml CI:ubuntu + windows 构建与测试

CI 在每次 push / PR 时自动跑 npm ci → npm run build → npm test, Windows 与 Linux 双平台。
预览分享卡片长什么样 ↓ZHANG-923-ZE/dsh-freetoken
分享 · DeepSeek Harness Hub
ZHANG-923-ZE/dsh-freetoken

非官方 DSH 插件,把 chat.deepseek.com 网页接入 DeepSeek Harness,作为…

回到顶部