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

公众号草稿生成 alitrack/dsh-wechat-article

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

把 Markdown 转成公众号草稿并推送草稿箱

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · platform
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
暂无时间戳·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 2 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

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

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

可执行外部命令读写/删除本地文件
查看扫描证据(共 23 处,展示前 23 条)
  • 读取本地文件
    index.js:138
    buffer = readFileSync(resolved.path)
  • 读取本地文件
    index.js:203
    return { ok: true, markdown: readFileSync(verdict.path, 'utf8'), source: verdict.path, sourcePath: verdict.path }
  • 写入本地文件
    index.js:375
    writeFileSync(target.path, previewDocument(result.html, title), 'utf8')
  • 写入本地文件
    index.js:470
    writeFileSync(target.path, built.png, { mode: 0o600 })
  • 读取本地文件
    index.js:471
    const readback = readFileSync(target.path)
  • 读取本地文件
    index.js:607
    coverPng = readFileSync(verdict.path)
  • 读取本地文件
    lib/cover.js:44
    if (typeof candidate === 'string' && candidate.length > 0 && existsSync(candidate)) {
  • 读取本地文件
    lib/cover.js:52
    if (existsSync(name)) return name
  • 读取本地文件
    lib/cover.js:57
    if (existsSync(full)) return full
  • 写入本地文件
    lib/cover.js:266
    mkdirSync(baseDir, { recursive: true, mode: 0o700 })
  • 写入本地文件
    lib/cover.js:275
    writeFileSync(htmlPath, html, 'utf8')
  • 执行外部命令来自配置/变量
    lib/cover.js:277
    const result = spawnSync(
  • 读取本地文件
    lib/cover.js:295
    png = readFileSync(pngPath)
  • 写入本地文件
    lib/cover.js:304
    chmodSync(pngPath, 0o600)
  • 删除本地文件递归
    lib/cover.js:317
    rmSync(dir, { recursive: true, force: true })
  • 删除本地文件递归
    lib/cover.js:348
    rmSync(attempt.dir, { recursive: true, force: true })
  • 读取本地文件
    lib/paths.js:50
    stat = statSync(real)
  • 读取本地文件
    lib/paths.js:94
    const stat = statSync(target)
  • 读取本地文件
    lib/credentials.js:56
    raw = readFileSync(path, 'utf8')
  • 读取本地文件
    lib/credentials.js:68
    const mode = statSync(path).mode & 0o777
  • 读取本地文件
    lib/state.js:67
    const parsed = JSON.parse(readFileSync(path, 'utf8'))
  • 写入本地文件
    lib/state.js:80
    mkdirSync(dirname(path), { recursive: true, mode: 0o700 })
  • 写入本地文件
    lib/state.js:87
    writeFileSync(path, JSON.stringify(trimmed, null, 2), { mode: 0o600 })
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-tools
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

在 DeepSeek Harness(dsh)里把 Markdown 转成微信公众号草稿:内联样式 HTML、900x383 封面、推送草稿并回读,零依赖。

README

由 DeepSeek 最新模型翻译生成
dsh-wechat-article 在 DeepSeek Harness(dsh)里把 Markdown 变成微信公众号草稿:内联样式 HTML、2.35:1 封面卡片、推草稿箱并回读验证。零依赖。 这是文章生产链,不是 IM 桥。 生态里另有一个同名包 dsh-wechat,它做的是把 iLink 机器人接到 dsh 上聊天;本插件不碰消息,只把一篇 Markdown 产出成可发布的草稿。 三个工具 | 工具 | 作用 | | wechat_draft | Markdown → 公众号编辑器兼容 HTML:规则全部 inline,无 、无 class,图片居中带图注,表格横向可滚动 | | wechat_cover | 900×383(2.35:1)封面卡片 PNG:小标签 + 自动换行大标题 + 副标题 + 四色色块 | | wechat_push | 建草稿(需要时自动生成并上传封面),把本地/data: 图片上传到微信 CDN(media/uploadimg,按内容哈希去重)并把 src 改写成 mmbiz.qpic.cn,随后回读校验标题与正文长度 | 链条止于草稿箱。本插件不发表——「发表」是账号主人的决定。
展开完整文档(README 剩余 1 节)
dsh-wechat-article

在 DeepSeek Harness(dsh)里把 Markdown 变成微信公众号草稿:内联样式 HTML、2.35:1 封面卡片、推草稿箱并回读验证。零依赖。

这是文章生产链,不是 IM 桥。 生态里另有一个同名包 dsh-wechat,它做的是把 iLink 机器人接到 dsh 上聊天;本插件不碰消息,只把一篇 Markdown 产出成可发布的草稿。

三个工具

| 工具 | 作用 |
| wechat_draft | Markdown → 公众号编辑器兼容 HTML:规则全部 inline,无 、无 class,图片居中带图注,表格横向可滚动 |
| wechat_cover | 900×383(2.35:1)封面卡片 PNG:小标签 + 自动换行大标题 + 副标题 + 四色色块 |
| wechat_push | 建草稿(需要时自动生成并上传封面),把本地/data: 图片上传到微信 CDN(media/uploadimg,按内容哈希去重)并把 src 改写成 mmbiz.qpic.cn,随后回读校验标题与正文长度 |

链条止于草稿箱。本插件不发表——「发表」是账号主人的决定。

安装

dsh plugin --profile web add dsh-wechat-article
或
dsh plugin --profile web add github:alitrack/dsh-wechat-article

凭据

wechat_draft / wechat_cover 完全不需要凭据。wechat_push 需要具备草稿箱权限的 AppID/AppSecret(已认证的订阅号/服务号):

export DSH_WECHAT_APPID=wx...
export DSH_WECHAT_APPSECRET=...
或者(桌面 agent 推荐)
mkdir -p ~/.dsh-wechat
printf '{"appId":"wx...","appSecret":"..."}' > ~/.dsh-wechat/credentials.json
chmod 600 ~/.dsh-wechat/credentials.json

凭据永远不作为工具参数传入。 工具参数会经过模型上下文、会话记录和工具调用日志——一旦允许模型传 AppSecret,这个密钥就同时落在三处。这是设计约束,不是疏忽。

凭据门(只有解析到凭据才注册 push)

wechat_push 只在凭据可用时注册。没有凭据时插件只挂 wechat_draft 与 wechat_cover(这两个是纯本地计算,不碰网络),并在系统提示里加一段说明,点名该改哪个变量/哪个文件。理由和 dsh 自己的 patch 用 disabled: 关行一样:一个永远只会返回 WECHAT_NOT_CONFIGURED 的工具,仍要花模型一个回合去发现这件事,还会跟真正能用的工具抢注意力。少一个工具 + 提示里一句话,胜过永远失败的工具。

(无凭据时的样子) wechat_draft ✓ wechat_cover ✓ wechat_push ✗ 未注册模型被告知:设置 DSH_WECHAT_APPID/DSH_WECHAT_APPSECRET,或写 ~/.dsh-wechat/credentials.json,然后重启 dsh

逃生口:仍然注册 push(CI 里跑 dry_run 校验用)
export DSH_WECHAT_GATE=off

DSH_WECHAT_GATE=off 恢复旧的「总是注册」行为:真推会返回结构化的 WECHAT_NOT_CONFIGURED,而不是工具消失;dry_run: true 照旧可以不联网、不凭据地校验内容/限额/封面。门的判定发生在挂载时一次,加完凭据要重启 dsh(dsh 对插件的工具表面没有热重载)。

公众号还要求调用方 IP 在后台白名单里(开发 → 基本配置 → IP白名单)。报 40164 就是这件事,插件会把原因说清楚,而不是回一句 invalid ip。

用法

1. wechat_draft markdown_path=/ws/article.md out_path=/ws/out/article.html
2. wechat_cover title="一条命令推到草稿箱" out_path=/ws/out/cover.png
3. wechat_push title="…" markdown_path=/ws/article.md

wechat_push 也接受 html=(wechat_draft 返回的片段)、thumb_media_id=(已有封面)或 cover_path=;都不给就自己生成并上传封面。dry_run=true 只做校验:标题/摘要/体积限制与封面,不发任何请求。

支持的 Markdown

标题、段落、强调、行内代码、围栏代码块(带语言标签)、引用块、有序/无序列表(两级嵌套)、GFM 表格(含对齐)、图片、---,以及 :::tip / :::info / :::warning / :::danger 提示框。Frontmatter(title/author/digest/summary)会填进草稿元信息。子集之外的语法退化成文本,不会被静默丢掉。

封面两条渲染路线

1. headless Chrome/Chromium(自动探测)——真字体栈,中文标题能正常渲染。snap 版 Chromium 也能用:渲染器会把文件放到受限 snap 真正可写的目录,并在接受结果前校验 PNG 尺寸。
2. 内置光栅渲染器(lib/png.js + lib/font5x7.js)——没有 Chrome 也能出图,整张卡片都画得出来,但字模只有数字和大写拉丁字母;中文标题会返回 CJK_TEXT_NOT_RENDERED 警告,而不是画一堆方块糊过去。

两条路线都产出真实的 900×383 PNG,且都在微信 64KB 缩略图素材上限之内。

安全边界

- 工作区禁锢:每个路径必须是绝对路径且落在调用会话的工作区内(exec.agent.session.header.cwd)。.. 穿越、指向外部的符号链接、工作区外的绝对路径、目录、不存在的文件,全部按不同错误码拒绝。
- 没有发表通路:只实现了 draft/add 与 draft/get,freepublish 没有。
- 幂等推送:同一标题+内容的哈希在每个工作区只推一次,重试的 agent 不会把草稿箱刷满。状态在 <workspace>/.dsh-wechat/state.json(0600,最多 200 条)。
- 图片上传去重:正文图片走 media/uploadimg(不占永久素材配额),按字节内容的 sha256 缓存——改稿重推不会重复上传没变过的图。图片路径缺失或解析失败一律降级成警告,绝不静默丢弃。
- 限速:连续推送至少间隔 2s;遇到 45009 不循环重试。
- 回读即验收:draft/add 返回 200 只代表「收下了」,不代表「对了」。推完立刻 draft/get 比对标题与可见文本长度(容忍 5%,因为微信会重写 HTML);不一致时 readback_ok=false 并给警告——不假报成功。
- 密钥卫生:错误文本回传模型之前会把 AppSecret 与 access_token 打码,AppID 只显示成 wx12***cd。

发布前体检

wechat_draft 只报告,从不改稿:

- 一张图都没有(纯文字墙);
- 图片不在 mmbiz.qpic.cn 上(编辑器保存时会剥掉外链图);
- 外链 (未认证号发布时会被剥离);
- 超过 4 列的表格(手机上读不了);
- 占位符([[待写]]、TODO、待补);
- 数字口径:同一个量两种写法(1,234 vs 1234)、同一单位下数值相差 ≥1000 倍(通常是「人 vs 人次」「总数 vs 子集」两种口径)、大数字没有单位、以及全文只出现一次因而无法自校的数字。

数字检查是「清单生成器」,不是事实核查器:它把候选摆出来,判断权在人。

本地开发

npm install --no-save @deepseek-ai/dsh-tools@0.0.1-rc.1
node --test # 77 个单测
node tests/e2e/keyless.mjs # 契约与守卫,不需要模型、不联网
bash tests/e2e/run_e2e.sh # 完整 headless e2e(本地 OpenAI 兼容端点,免 key)

版本门

dsh 会拒绝加载 peerDependencies 不匹配的插件。本插件声明 @deepseek-ai/dsh-tools: ^0.0.1-rc.1,并针对 dsh 0.2.1-rc.2 实测。豁免机制是 profile 下的 compatibility.json(精确 name@version → 精确 dsh 版本数组)——报错里提示的 dsh plugin allow-version 并不是真命令。

明确的局限

- 只到草稿箱:不发表;除建稿时那几个开关外不管理留言;不管理素材库。
- 不代取远程图片:本地路径和 data: URL 自动上传;http(s) 图片必须已在 mmbiz.qpic.cn 上——不是的话先下载到本地再引用。upload_images=false 可整体关掉自动上传。
- 没有语法高亮:代码块统一配色,不做逐 token 上色。
- 中文封面依赖 Chrome:没有 Chrome 时出的是干净的卡片 + 拉丁标题,并明确警告。
- 接口限制本地先行校验:64 字标题、16 字作者、120 字摘要、1MB 正文,都在发请求之前拦住。

许可

MIT。
预览分享卡片长什么样 ↓alitrack/dsh-wechat-article
分享 · DeepSeek Harness Hub
alitrack/dsh-wechat-article

把 Markdown 转成公众号草稿并推送草稿箱

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部