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

Gemini 网页接入 dtsummery/dsh-gemini-web

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

Gemini 网页端(gemini.google.com)接入 DeepSeek Harness 的插件:设置里一键免粘贴登录,托管反代内核并注册 gemini-web provider

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

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

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dtsummery/dsh-gemini-web
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

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

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dsh-gemini-web(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=22.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/31 04:49:16

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 54 处,展示前 53 条)
  • 写入本地文件
    lib/index.js:159
    mkdirSync(dir, { recursive: true })
  • 读取本地文件
    lib/index.js:231
    if (!existsSync(binPath)) {
  • 执行外部命令来自配置/变量
    lib/index.js:260
    execFile(file, args, { windowsHide: true, timeout: 20000 }, (error, stdout, stderr) => {
  • 读取本地文件
    lib/index.js:455
    if (userDataDir === undefined || !existsSync(userDataDir)) {
  • 读取本地文件
    lib/index.js:682
    kernelExists: existsSync(kernelPath()),
  • 删除本地文件
    lib/index.js:963
    rmSync(`${target}.part`, { force: true })
  • 读取本地文件
    lib/index.js:1035
    if (!existsSync(path)) return {}
  • 读取本地文件
    lib/index.js:1047
    return existsSync(path) ? readFileSync(path, 'utf8') : ''
  • 读取本地文件
    lib/index.js:1047
    return existsSync(path) ? readFileSync(path, 'utf8') : ''
  • 发起网络请求
    lib/client.js:101
    return fetch(API + path, {
  • 发起网络请求
    lib/kernel.js:51
    if (!proxyUrl) return fetch(url)
  • 发起网络请求
    lib/kernel.js:54
    return fetch(url, { dispatcher: new ProxyAgent(proxyUrl) })
  • 发起网络请求
    lib/kernel.js:57
    return fetch(url)
  • 写入本地文件
    lib/kernel.js:68
    mkdirSync(join(destPath, '..'), { recursive: true })
  • 写入本地文件
    lib/kernel.js:72
    const out = createWriteStream(partPath)
  • 删除本地文件
    lib/kernel.js:80
    rmSync(destPath, { force: true })
  • 写入本地文件
    lib/kernel.js:81
    renameSync(partPath, destPath)
  • 删除本地文件
    lib/kernel.js:84
    rmSync(partPath, { force: true })
  • 写入本地文件
    lib/kernel.js:87
    try { chmodSync(destPath, 0o755) } catch {}
  • 发起网络请求
    lib/kernel.js:110
    const res = await fetch(`${this.base}/`, { signal: AbortSignal.timeout(3000) })
  • 读取本地文件
    lib/kernel.js:129
    if (!binPath || !existsSync(binPath)) throw new Error(`内核不存在:${binPath}`)
  • 写入本地文件
    lib/kernel.js:130
    mkdirSync(join(dbPath, '..'), { recursive: true })
  • 执行外部命令来自配置/变量
    lib/kernel.js:140
    this.child = spawn(binPath, args, { stdio: ['ignore', 'pipe', 'pipe'], windowsHide: true })
  • 执行外部命令固定命令
    lib/kernel.js:206
    execFile('netstat', ['-ano', '-p', 'tcp'], { windowsHide: true, timeout: 15000 }, (_error, out) => resolve(String(out ?? '')))
  • 执行外部命令固定命令
    lib/kernel.js:213
    execFile('taskkill', ['/PID', pid, '/T', '/F'], { windowsHide: true, timeout: 15000 }, () => resolve(undefined))
  • 发起网络请求
    lib/kernel.js:225
    const res = await fetch(`${this.base}/admin/api${path}`, {
  • 发起网络请求
    lib/kernel.js:258
    const res = await fetch(`${this.base}/v1/models`, {
  • 读取本地文件
    lib/kernel.js:270
    if (!existsSync(path)) return {}
  • 读取本地文件
    lib/kernel.js:272
    for (const line of readFileSync(path, 'utf8').split(/ ? /)) {
  • 写入本地文件
    lib/kernel.js:281
    mkdirSync(join(path, '..'), { recursive: true })
  • 读取本地文件
    lib/edge-login.js:37
    for (const candidate of candidates) if (existsSync(candidate)) return candidate
  • 执行外部命令固定命令
    lib/edge-login.js:86
    spawn('taskkill', ['/PID', String(child.pid), '/T', '/F'], { stdio: 'ignore', windowsHide: true })
  • 执行外部命令固定命令
    lib/edge-login.js:105
    spawn('taskkill', ['/PID', String(child.pid), '/T'], { stdio: 'ignore', windowsHide: true })
  • 写入本地文件
    lib/edge-login.js:144
    mkdirSync(this.opts.profileDir, { recursive: true })
  • 执行外部命令来自配置/变量
    lib/edge-login.js:145
    this.loginChild = spawn(bin, [`--user-data-dir=${this.opts.profileDir}`, url], {
  • 写入本地文件
    lib/edge-login.js:172
    mkdirSync(this.opts.profileDir, { recursive: true })
  • 删除本地文件
    lib/edge-login.js:174
    rmSync(portFile, { force: true })
  • 执行外部命令来自配置/变量
    lib/edge-login.js:176
    this.readChild = spawn(
  • 读取本地文件
    lib/edge-login.js:193
    if (existsSync(portFile)) {
  • 读取本地文件
    lib/edge-login.js:194
    const first = readFileSync(portFile, 'utf8').trim().split(/ ? /)[0]
  • 发起网络请求
    lib/edge-login.js:205
    const version = await (await fetch(`http://127.0.0.1:${port}/json/version`)).json()
  • 删除本地文件
    lib/edge-login.js:227
    rmSync(portFile, { force: true })
  • 写入本地文件
    lib/keepalive.js:76
    mkdirSync(this.opts.profileDir, { recursive: true })
  • 删除本地文件
    lib/keepalive.js:79
    rmSync(portFile, { force: true })
  • 执行外部命令来自配置/变量
    lib/keepalive.js:81
    this.child = spawn(
  • 读取本地文件
    lib/keepalive.js:98
    if (existsSync(portFile)) {
  • 读取本地文件
    lib/keepalive.js:99
    const parsed = Number(readFileSync(portFile, 'utf8').trim().split(/ ? /)[0])
  • 发起网络请求
    lib/keepalive.js:109
    const version = await (await fetch(`http://127.0.0.1:${port}/json/version`, { signal: AbortSignal.timeout(10000) })).json()
  • 执行外部命令固定命令
    lib/keepalive.js:161
    spawn('taskkill', ['/PID', String(child.pid), '/T', '/F'], { stdio: 'ignore', windowsHide: true })
  • 删除本地文件
    lib/keepalive.js:168
    rmSync(join(this.opts.profileDir, 'DevToolsActivePort'), { force: true })
  • 执行外部命令固定命令
    lib/keepalive.js:184
    execFile('powershell', ['-NoProfile', '-NonInteractive', '-Command', script], { windowsHide: true, timeout: 20000 }, () => resolve(undefined))
  • 发起网络请求
    lib/adapter.js:189
    const res = await fetch(`${this.deps.getBaseUrl()}/models`, {
  • 发起网络请求
    lib/adapter.js:297
    res = await fetch(`${baseUrl}/chat/completions`, {
扫描于 2026/10/31(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-llm@deepseek-ai/dsh-settings@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

README

由 DeepSeek 最新模型翻译生成
dsh-gemini-web 把 Google Gemini 网页端(gemini.google.com) 接进 DeepSeek Harness:在 DSH 设置里点一下「登录 Google」即可完成登录,插件自动把登录态写入内置反代内核,并注册原生 gemini-web provider。不需要手工跑程序、不需要复制粘贴 cookie。 内核一共提供 14 个模型:gemini-3.8 / 3.7 / 3.6 Flash 与 3.5 Flash Lite(各带扩展思考版)、gemini-3.1-pro(含思考版),以及生图 / 音乐 / 画布 / 视频。暴露哪些给 DSH 由设置页勾选,没勾选就不会出现在会话窗口的模型选择器里。 安装 用 dsh 自带的插件命令从 GitHub 安装: dsh plugin --profile web add github:dtsummery/dsh-gemini-web - web 是目标 profile 名(DSH Desktop 默认 profile 就叫 web)。 - 这个命令会顺带把插件登记进该 profile package.json 的 dsh.profile.bundles,不需要手工改配置。
展开完整文档(README 剩余 1 节)
dsh-gemini-web

把 Google Gemini 网页端(gemini.google.com) 接进 DeepSeek Harness:在 DSH 设置里点一下「登录 Google」即可完成登录,插件自动把登录态写入内置反代内核,并注册原生 gemini-web provider。不需要手工跑程序、不需要复制粘贴 cookie。

内核一共提供 14 个模型:gemini-3.8 / 3.7 / 3.6 Flash 与 3.5 Flash Lite(各带扩展思考版)、gemini-3.1-pro(含思考版),以及生图 / 音乐 / 画布 / 视频。暴露哪些给 DSH 由设置页勾选,没勾选就不会出现在会话窗口的模型选择器里。

安装

用 dsh 自带的插件命令从 GitHub 安装:

dsh plugin --profile web add github:dtsummery/dsh-gemini-web

- web 是目标 profile 名(DSH Desktop 默认 profile 就叫 web)。
- 这个命令会顺带把插件登记进该 profile package.json 的 dsh.profile.bundles,不需要手工改配置。
- 输出里出现 + dsh-gemini-web github:dtsummery/dsh-gemini-web 即为成功,然后重启 DSH Desktop。

卸载用同一套命令:

dsh plugin --profile web remove dsh-gemini-web

环境要求:DSH 0.2.x(dsh --version 可查版本;设置页走 0.2 的 Config / configForms 模型,0.1.x 上会因 @deepseek-ai/dsh-settings 没有 installSettingsSection 而整包加载失败)、已安装 dsh CLI、Node ≥ 22;dsh plugin 内部使用 pnpm。

更新插件

GitHub 依赖重复执行 add 不会拉到新版本(pnpm 会报 Already up to date),要先卸再装:

dsh plugin --profile web remove dsh-gemini-web
dsh plugin --profile web add github:dtsummery/dsh-gemini-web

装完必须重启 DSH Desktop:host 端代码只在启动时装配,刷新页面只会更新浏览器端(界面),所以会出现「新界面 + host 还是旧逻辑」的错位。

插件的数据都放在 ~/.dsh/gemini-web/:

| 路径 | 用途 |
| bin/gemini-web2api-go.exe | 反代内核,首次使用在设置页点「下载 / 更新内核」 |
| kernel.db | 内核数据(Cookie 池、代理池、请求记录) |
| kernel.env | 内核凭据与监听端口 |
| browser-profile/ | 插件专属浏览器 profile,登录态保存在这里 |

使用

1. 重启 DSH Desktop。
2. 打开 设置 → Gemini 网页端(插件自带一页独立设置),确认「启用 Gemini 网页端 provider」已勾选。
3. 首次使用点 下载 / 更新内核,等页面显示「内核 运行中」。
4. 点 登录 Google,在弹出的浏览器窗口里正常登录 Gemini,然后回到设置页点 我已完成登录。
5. 在 模型 卡片里勾选要暴露给 DSH 的模型(默认 gemini-3.8-flash、gemini-3.1-pro;可多选,内核提供的 14 个都在列表里,也可以「全选 / 默认 / 撤销」),点 保存模型选择 —— 保存即时生效,会话窗口的模型选择器马上能选到,不需要重启。
6. 模型列表里出现 Gemini 网页端 下的模型即可直接使用。

登录成功后插件会自动开启 cookie 保活,设置页显示「保活 运行中」:Google 换发登录票时会自动回写内核,正常情况下不需要再手动登录;想立刻检查可点 立即保活。

保活会常驻一个无窗口的 headless 浏览器(用来维持 Google 的设备绑定会话轮转),看不到窗口、只占少量内存。不需要就取消「自动保活 cookie」,代价是 Google 换票后需要重新登录。

配置项

| 字段 | 说明 |
| 启用 Gemini 网页端 provider | 关掉则不注册 provider、不起内核 |
| 模型 | 勾选要暴露给 DSH 的模型(内核一共提供 14 个,含扩展思考版与生图/音乐/画布/视频);保存后会话窗口的模型选择器即可选 |
| 自动保活 cookie | 常驻无窗口浏览器维持登录票轮转并回写内核;关掉后 Google 一换票就会掉登录 |
| 保活检查间隔(分钟) | 多久读一次浏览器 cookie 并比对登录票,1–120,默认 5 |
| 出口代理 | 内核访问 Google 用的代理;留空沿用 DSH 进程的 HTTPS_PROXY / HTTP_PROXY |
| 浏览器路径 | 留空自动探测 Chrome / Edge |
| 反代内核路径 | 留空用 ~/.dsh/gemini-web/bin/ |
| 内核端口 | 0 = 首次启动自动挑一个空闲端口并记住 |

排障

| 现象 | 处理 |
| 页面显示「尚未下载反代内核」 | 点「下载 / 更新内核」(走配置的出口代理) |
| 设置页改了没反应 / 模型列表变回原样 | 先确认已重启 DSH Desktop:host 端代码只在启动时装配,只刷新页面会出现「新界面 + 旧逻辑」;确实是新版仍不生效就带 ~/.dsh/settings.yaml 里 gemini-web: 段一起反馈 |
| 连通性测试失败 | 多为出口代理不可用;换代理地址或确认代理软件在运行,然后点「重启内核」 |
| 选 Pro 报错 | 未登录或登录态失效,重新走一次「登录 Google → 我已完成登录」 |
| 「登录」行显示「未登录」但实际能正常对话 | 该行在没有进行中的登录交互时改看内核 Cookie 池(账号行显示「登录态正常」即正常)。若账号行异常或本行仍报错,再重新走一次「登录 Google → 我已完成登录」 |
| 页面显示「保活 待命 / 保活失败」 | 看该行备注里的原因:还没登录、保活浏览器起不来、或 profile 被别的窗口占用;点「立即保活」重试 |
| 模型请求报 502 | 内核出口被 Google 拦或代理挂了;换代理后点「重启内核」 |
| 登录窗口提示「此浏览器或应用可能不安全」 | 登录窗口带了自动化参数;确认浏览器路径指向普通 Chrome/Edge,且没有别的进程占用同一个 profile 目录 |
| 点「我已完成登录」提示缺少登录态 cookie | 窗口里其实还没登录成功;在窗口里打开 gemini.google.com 确认能正常对话,再点一次 |

使用注意

- 没有真正的 function calling:内核是 prompt 级实现,工具调用不如原生 provider 稳,建议作为问答 / 生图线路使用。
- 上下文硬墙约 13 万 UTF-8 字节:超了上游会从尾部静默截断,长对话请自行压缩。
- 单 IP 风控:同一出口突发 80–180 次请求会被 Google 拦约 2 小时;高频使用建议在内核面板(http://127.0.0.1:<端口>/admin)里加代理池。
- 登录态是设备绑定的:新版 Chrome/Edge 的 Google 会话绑定设备,登录票只有浏览器能续期——插件靠常驻保活解决,所以不要关掉保活,也不要在保活运行时用别的窗口去占用它的 profile。
预览分享卡片长什么样 ↓dtsummery/dsh-gemini-web
分享 · DeepSeek Harness Hub
dtsummery/dsh-gemini-web

Gemini 网页端(gemini.google.com)接入 DeepSeek Harness 的插件:设置里一键免粘贴登录,托管反代内核并注册 gemini-web provider

回到顶部