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

网页自动化录制器 kumanana66/dsh-automation

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

录制浏览器操作,自动生成定时执行的爬取脚本

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

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

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

状态速览

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

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

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 77 处,展示前 59 条)
  • 写入本地文件
    lib/index.js:28
    mkdirSync(baseDir, { recursive: true });
  • 发起网络请求
    client/client.js:39
    fetch(path, {
  • 读取本地文件
    lib/storage.js:7
    return JSON.parse(readFileSync(file, 'utf8'));
  • 写入本地文件
    lib/storage.js:17
    writeFileSync(tmp, body, 'utf8');
  • 写入本地文件
    lib/storage.js:18
    renameSync(tmp, file);
  • 写入本地文件
    lib/storage.js:21
    writeFileSync(file, body, 'utf8');
  • 写入本地文件
    lib/storage.js:33
    mkdirSync(baseDir, { recursive: true });
  • 写入本地文件
    lib/storage.js:37
    mkdirSync(tasksDir, { recursive: true });
  • 写入本地文件
    lib/storage.js:38
    mkdirSync(runsDir, { recursive: true });
  • 读取本地文件
    lib/storage.js:73
    return readdirSync(tasksDir)
  • 读取本地文件
    lib/storage.js:87
    if (existsSync(f)) {
  • 删除本地文件
    lib/storage.js:89
    unlinkSync(f);
  • 读取本地文件
    lib/storage.js:97
    if (!existsSync(dir)) return [];
  • 读取本地文件
    lib/storage.js:98
    return readdirSync(dir)
  • 读取本地文件
    lib/storage.js:119
    const ents = readdirSync(cur, { withFileTypes: true });
  • 删除本地文件递归
    lib/storage.js:223
    rmSync(p, { recursive: true, force: true });
  • 执行外部命令固定命令
    lib/storage.js:287
    const child = spawn('cmd.exe', ['/c', 'start', '', 'explorer.exe', target], { detached: true, stdio: 'ignore' });
  • 执行外部命令来自配置/变量
    lib/storage.js:316
    exec(ps, { windowsHide: true, maxBuffer: 1024 }, () => {});
  • 执行外部命令固定命令
    lib/storage.js:324
    const child = spawn('cmd.exe', ['/c', 'start', '', 'explorer.exe', target], { detached: true, stdio: 'ignore' });
  • 写入本地文件
    lib/runner.js:52
    mkdirSync(taskDir, { recursive: true });
  • 写入本地文件
    lib/runner.js:60
    writeFileSync(codeFile, task.code, 'utf8');
  • 执行外部命令来自配置/变量
    lib/runner.js:76
    child = spawn(python, [codeFile], { env, cwd: taskDir, windowsHide: true });
  • 读取本地文件
    lib/runner.js:100
    result = JSON.parse(readFileSync(resultFile, 'utf8'));
  • 写入本地文件
    lib/runner.js:123
    try { mkdirSync(taskDir, { recursive: true }); } catch (e) {}
  • 写入本地文件
    lib/runner.js:126
    try { writeFileSync(codeFile, task.code, 'utf8'); } catch (e) {
  • 执行外部命令来自配置/变量
    lib/runner.js:139
    try { child = spawn(python, [codeFile], { env, cwd: taskDir, windowsHide: true }); }
  • 读取本地文件
    lib/runner.js:160
    try { result = JSON.parse(readFileSync(resultFile, 'utf8')); } catch {}
  • 写入本地文件
    lib/notifier.js:10
    mkdirSync(recordsDir, { recursive: true });
  • 写入本地文件
    lib/notifier.js:38
    writeFileSync(join(recordsDir, safe(run.id) + '.md'), summary, 'utf8');
  • 执行外部命令固定命令
    lib/recorder.js:24
    const r = spawnSync('powershell.exe', ['-NoProfile', '-NonInteractive', '-Command', psCmd],
  • 读取本地文件
    lib/recorder.js:46
    if (!existsSync(p)) return null;
  • 读取本地文件
    lib/recorder.js:47
    return JSON.parse(readFileSync(p, 'utf8'));
  • 写入本地文件
    lib/recorder.js:82
    mkdirSync(dir, { recursive: true });
  • 执行外部命令来自配置/变量
    lib/recorder.js:99
    probe = spawnSync(python, ['-c', probeCode], { timeout: 20000, encoding: 'utf8' });
  • 执行外部命令来自配置/变量
    lib/recorder.js:114
    const child = spawn(
  • 写入本地文件
    lib/recorder.js:128
    writeFileSync(join(dir, 'state.json'), JSON.stringify({
  • 写入本地文件
    lib/recorder.js:165
    writeFileSync(join(dir, 'stop.flag'), 'stop', 'utf8');
  • 读取本地文件
    lib/recorder.js:187
    if (existsSync(doneFile)) {
  • 写入本地文件
    lib/recorder.js:228
    writeFileSync(join(current.dir, 'stop.flag'), 'stop', 'utf8');
  • 执行外部命令来自配置/变量
    lib/recorder.js:251
    proc = spawn(python, args, { stdio: ['ignore', 'pipe', 'pipe'], windowsHide: true });
  • 执行外部命令来自配置/变量
    lib/asr.js:15
    const r = spawnSync(python, ['-c', 'import faster_whisper; print("OK")'], {
  • 读取本地文件
    lib/asr.js:35
    try { entries = readdirSync(dir, { withFileTypes: true }); } catch { return; }
  • 执行外部命令来自配置/变量
    lib/asr.js:65
    const r = spawnSync(python, ['-c',
  • 读取本地文件
    lib/asr.js:84
    if (existsSync(modelDir)) {
  • 执行外部命令来自配置/变量
    lib/asr.js:99
    const child = spawn(cmd, args, { shell: false, windowsHide: true });
  • 读取本地文件
    lib/asr.js:113
    if (existsSync(modelDir)) {
  • 删除本地文件递归
    lib/asr.js:115
    try { rmSync(modelDir, { recursive: true, force: true }); } catch (e) { logs.push('[warn] ' + (e.message || e)); }
  • 读取本地文件
    lib/asr.js:128
    if (existsSync(p)) return p;
  • 读取本地文件
    lib/asr.js:131
    const entries = readdirSync(dir);
  • 读取本地文件
    lib/asr.js:142
    if (!audioPath || !existsSync(audioPath)) return reject(new Error('音频文件不存在: ' + audioPath));
  • 执行外部命令来自配置/变量
    lib/asr.js:156
    child = spawn(python, args, { shell: false, windowsHide: true });
  • 写入本地文件
    lib/asr.js:184
    writeFileSync(tpath, text, 'utf8');
  • 读取本地文件
    lib/routes.js:265
    if (!existsSync(target)) {
  • 读取本地文件
    lib/routes.js:270
    const data = readFileSync(target);
  • 写入本地文件
    lib/routes.js:508
    try { mkdirSync(chunksDir, { recursive: true }); } catch {}
  • 写入本地文件
    lib/routes.js:520
    try { writeFileSync(chunkPath, bytes); } catch (e) {
  • 写入本地文件
    lib/routes.js:535
    try { appendFileSync(join(chunksDir, 'live.txt'), (text ? text + '\n' : '')); } catch {}
  • 读取本地文件
    lib/routes.js:556
    if (existsSync(tpath)) {
  • 读取本地文件
    lib/routes.js:557
    transcript = readFileSync(tpath, 'utf8');
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 录制浏览器操作
  • 生成爬取脚本
  • 定时运行与通知

RPA 式定时网页自动化,为 DeepSeek Harness 打造:录制浏览器操作 → 需求文档 → LLM 生成 Python + Playwright → 定时运行并留存运行记录与邮件通知

README

由 DeepSeek 最新模型翻译生成
dsh-automation DeepSeek Harness 的 RPA 式定时网页自动化插件:录制操作 → 生成需求文档 → LLM 生成 Python+Playwright 代码 → 配置触发器定时执行 → 记录运行结果并邮件通知。 使用流程 1. 打开 Harness Web UI(默认 http://127.0.0.1:3080)→ 设置 → 自动化任务。 2. 点「新建自动化任务」: - 方式 A:录制操作 — 输入起始网址点「开始录制」,会弹出一个可见的 Chrome 窗口,你在里面正常操作(点击/输入/翻页),每一步自动截图。按 F9 或点浮动「停止录制」按钮结束,然后点「生成需求文档」。 - 方式 B:手动写需求 — 跳过录制直接编写需求文档。 3. 微调需求文档(可编辑)。 4. 点「生成自动化代码」→ LLM 生成 Python + Playwright 脚本(可编辑)。 5. 运行配置:下载/获取内容的保存目录、运行记录存储目录、通知邮箱。 6. 触发器:cron(如 0 9 * * 每天 9 点)/ 间隔 / 一次性 / 仅手动。 7. 保存。任务到点自动执行;每次运行生成一份 .md 运行记录,可选 SMTP 邮件通知。
展开完整文档(README 剩余 1 节)
dsh-automation

DeepSeek Harness 的 RPA 式定时网页自动化插件:录制操作 → 生成需求文档 → LLM 生成 Python+Playwright 代码 → 配置触发器定时执行 → 记录运行结果并邮件通知。

使用流程

1. 打开 Harness Web UI(默认 http://127.0.0.1:3080)→ 设置 → 自动化任务。
2. 点「新建自动化任务」:
- 方式 A:录制操作 — 输入起始网址点「开始录制」,会弹出一个可见的 Chrome 窗口,你在里面正常操作(点击/输入/翻页),每一步自动截图。按 F9 或点浮动「停止录制」按钮结束,然后点「生成需求文档」。
- 方式 B:手动写需求 — 跳过录制直接编写需求文档。
3. 微调需求文档(可编辑)。
4. 点「生成自动化代码」→ LLM 生成 Python + Playwright 脚本(可编辑)。
5. 运行配置:下载/获取内容的保存目录、运行记录存储目录、通知邮箱。
6. 触发器:cron(如 0 9 * * 每天 9 点)/ 间隔 / 一次性 / 仅手动。
7. 保存。任务到点自动执行;每次运行生成一份 .md 运行记录,可选 SMTP 邮件通知。

服务端 API(/dsh-automation/)

| 接口 | 说明 |
| GET /status | 插件状态 |
| GET/POST /config | 读写配置(LLM provider/model、Python 路径、SMTP、目录) |
| GET /models | 列出可用 LLM provider 与模型 |
| GET/POST /tasks | 任务列表 / 新建任务 |
| GET/PUT/DELETE /tasks/:id | 任务详情 / 更新 / 删除 |
| POST /tasks/:id/run | 立即运行一次 |
| POST /tasks/:id/enable | 启用 / 停用触发器 |
| GET /tasks/:id/runs | 运行历史 |
| POST /record/start POST /record/stop GET /record/status | 录制器控制 |
| POST /generate/requirement | 录制数据 → 需求文档 |
| POST /generate/code | 需求文档 → Python 代码 |
| POST /notify/test | 发送测试邮件 |

配置

- LLM:复用 harness 的 ctx.llm(provider 如 deepseek-official / ali),不单独消耗 API key;留空自动选择。
- Python:生成脚本用 python 配置的执行(默认 D:\Anaconda3\python.exe),需 pip install playwright 并 playwright install chromium。
- 邮件:SMTP 配置(host/port/账号/授权码)+ 收件邮箱。agent-mail MCP 适配器可后续接入(代码中 notifier.notify 是唯一出口)。

数据存储

$DSH_HOME/profiles/web/data/dsh-automation/:
- tasks/.json 任务定义(需求、代码、触发器、配置)
- runs//.json 结构化运行记录
- recordings/*/ 录制数据(steps + 截图)
- settings.json 插件配置

开发说明

- 服务端:lib/index.js(cordis 插件,inject: ['webServer', 'llm']),HTTP 路由用 ctx.webServer.register({ kind: 'prefix', path: '/dsh-automation', handler })。
- 客户端:client/client.js 通过 window.__ModuleLoader__.load 注入,ctx.slots.inject('settings.section', ...) 挂载设置页。
- 录制器:runner/recorder.py(headed Chromium + 注入录制脚本,F9 停止)。
预览分享卡片长什么样 ↓kumanana66/dsh-automation
分享 · DeepSeek Harness Hub
kumanana66/dsh-automation

录制浏览器操作,自动生成定时执行的爬取脚本

这是你的仓库?认领条目

回到顶部