dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
WeChat Official Account article reader for DeepSeek Harness: parses mp.weixin.qq.com article bodies into clean Markdown
English | 中文
微信公众号文章阅读插件(DeepSeek Harness bundle)。抓取 mp.weixin.qq.com 文章,把正文解析成干净的 Markdown 交给模型。
Harness 内置的 web_fetch 对公众号文章经常拿不到正文:微信会返回环境校验页,正文被大量内联样式与嵌套容器包裹,图片走 data-src 懒加载。本插件专门处理这些情况,并对外只暴露一个窄接口。
一个模型可见的工具 weixin_read:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
url | string | 是 | 文章链接,形如 https://mp.weixin.qq.com/s/xxxxxxxx |
maxChars | integer | 否 | 返回正文的最大字符数,超出则截断;默认取插件配置 |
saveToFile | boolean | 否 | 是否把完整正文写入工作区文件;默认取插件配置 |
返回的规范值含 title、author、publishedAt、sourceUrl、wordCount、imageCount、markdown、truncated、savedTo、bodyChars。模型看到的是渲染后的 Markdown:标题、元信息行,然后是正文。
插件还会注册一个 system-prompt 段落,提示模型读取公众号文章时优先选 weixin_read,而不是 web_fetch。
dsh plugin --profile web add github:jack1545/dsh-weixin-reader
从源码检出运行时,把 dsh 换成 pnpm dsh。装完需要重启 Harness 进程才会加载新层。
先验证层已生效、暂不启动:
dsh --profile web --dump-config # should contain a "# == dsh-weixin-reader" layer
卸载:
dsh plugin --profile web remove dsh-weixin-reader
全部可调项都在 cordis.patch.yml 的 config 里,也可在 profile 自己的 cordis.patch.yml 中按 id 覆盖:
| 键 | 默认值 | 说明 |
|---|---|---|
timeoutMs | 30000 | 单次抓取超时(毫秒) |
maxChars | 60000 | 返回正文的字符上限,超出截断并标注 |
saveToFile | false | 默认是否落盘完整正文 |
saveDir | "" | 保存目录;留空则写到 <工作区>/weixin-articles/ |
systemPromptOrder | 10120 | 提示段落顺序,越晚越靠近生成位置 |
userAgent | "" | 覆盖默认桌面浏览器 UA |
不用子进程抓取。 Harness 的文件沙箱会拦截 Node 对子进程管道的读取,execFileSync 与管道式 spawn 都直接失败(EPERM),因此 url-md.exe 这类外部抓取器在插件内不可用。本插件改用宿主 fetch:它继承进程既有的代理设置,不受该限制。若把子进程的 stdout 重定向到文件描述符而非管道,确实可以绕开,但那会引入临时文件与额外的清理责任,在这里没有收益。
零外部 import。 profile 的 node_modules 不提供 @deepseek-ai/* 运行时依赖,因此插件只使用 Node 内置模块与 ctx,不用 defineTool。代价是参数校验要手工写;该实现已完成,且失败信息与声明的 schema 一致。
mp.weixin.qq.com。 其他 host 一律拒绝,因此无法被改作通用抓取器。dsh-weixin-reader/
├── package.json # declares dsh.bundle
├── cordis.patch.yml # the layer applied on install
├── index.js # plugin entry: registers weixin_read and the prompt section
└── lib/parser.js # zero-dependency parser, testable outside Harness
lib/parser.js 可独立使用:
import { fetchArticle, formatArticle } from './lib/parser.js';
const article = await fetchArticle('https://mp.weixin.qq.com/s/xxxxxxxx');
console.log(article.title, article.author, article.wordCount);
console.log(formatArticle(article));
在本机实测(2026-09-21):
weixin_read 成功抓取并解析一篇真实文章:标题、作者、发布时间均正确,正文 5049 字、16 张图,Markdown 结构干净。url、非对象参数、空字符串、maxChars 非正整数、未声明的多余键。mp.weixin.qq.com 的 host 被拒绝。maxChars 截断生效且带标注;saveToFile 落盘路径与完整 Markdown 内容正确。output.schema 完全一致:必填键齐全,无未声明的键。MIT。本插件与腾讯、微信官方无关,仅用于个人阅读与研究。