juejin-article-to-markdown — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited juejin-article-to-markdown (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
掘金文章页面包含大量无关内容(导航栏、侧边栏、评论区、推荐文章、代码块按钮等),直接复制粘贴会产生格式问题。此 Skill 提供一套完整的处理流程,将掘金文章转换为干净、规范的 Markdown 文件。
juejin.cn/post/)同时获取 HTML 和 Markdown 两种格式(并行请求):
# 请求 1:HTML 格式(用于提取元信息和图片位置)
mcp__ScraplingServer__stealthy_fetch
- url: 掘金文章链接
- extraction_type: html
- main_content_only: true
- wait: 2000
# 请求 2:Markdown 格式(用于提取正文内容)
mcp__ScraplingServer__stealthy_fetch
- url: 掘金文章链接
- extraction_type: markdown
- main_content_only: true
- wait: 2000从 HTML 或 Markdown 开头提取:
| 字段 | 提取方式 | 说明 |
|---|---|---|
| 标题 | <h1> 或 # 标题 | 文章主标题 |
| 作者 | 作者名称字段 | 作者用户名 |
| 发布日期 | 日期字段 | 格式:YYYY-MM-DD |
| 阅读量 | 阅读数字段 | 可选 |
| 标签 | 标签列表 | 文章标签 |
| 专栏 | 专栏名称 | 可选 |
必须移除的内容:
掘金代码块会包含无关的按钮文字,需要清理:
清理模式:
# 原始(有问题)体验AI代码助手
代码解读
复制代码
git clone https://github.com/xxx
# 清理后git clone https://github.com/xxx
处理规则:
掘金图片特点:
| 域名 | 处理方式 | 说明 |
|---|---|---|
p*-xtjj-sign.byteimg.com | 保留 | 文章正文图片 |
p*-juejin-sign.byteimg.com | 保留 | 文章正文图片 |
p1-juejin.byteimg.com | 保留 | 封面图等 |
lf-web-assets.juejin.cn | 丢弃 | Logo、图标等装饰 |
p*-passport.byteacctimg.com | 丢弃 | 用户头像 |
图片链接格式:
https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/xxx~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:q75.awebp?rk3s=xxx&x-expires=xxx&x-signature=xxx处理方式:
掘金外链跳转格式:
https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Fxxx处理规则:
target 参数,提取真实 URL示例:
# 原始
[GitHub 仓库](https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2F598572%2Fxzll-im-server)
# 处理后
[GitHub 仓库](https://github.com/598572/xzll-im-server)掘金使用标准 Markdown 表格格式,需要确保:
| --- | --- |):---, :---:, ---:)表格示例:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| id | Long | 全局唯一ID |
| name | String | 用户名 |掘金使用 bytemd-mermaid 类渲染 Mermaid 图表,需要特殊处理。
重要发现:原始 Mermaid 代码存储在 `window.__NUXT__` 数据中
掘金在服务端将 Mermaid 代码渲染为 SVG 用于页面显示,但原始 Mermaid 代码保存在页面的 window.__NUXT__ JavaScript 变量中。
#### 方案 A:从 __NUXT__ 提取原始 Mermaid 代码(推荐)
优点:保留可编辑的源码,Obsidian/Typora 等工具可直接渲染
提取方法:
<script>window.__NUXT__= 标签\n → 换行,\uXXXX → Unicode 字符) `mermaid\n...\n` 代码块Python 示例代码:
import re
# 找到 __NUXT__ 脚本
script_match = re.search(r'<script[^>]*>window\.__NUXT__\s*=', html_content)
if script_match:
script_start = script_match.start()
script_end = html_content.find('</script>', script_start)
script_content = html_content[script_start:script_end]
# 解码 Unicode 转义
decoded = re.sub(r'\\u([0-9a-fA-F]{4})',
lambda m: chr(int(m.group(1), 16)), script_content)
decoded = decoded.replace('\\n', '\n')
# 提取 Mermaid 代码块
pattern = r'```mermaid\n(.*?)```'
mermaid_blocks = re.findall(pattern, decoded, re.DOTALL)输出格式:
\`\`\`mermaid
sequenceDiagram
participant C as 客户端
C->>G: 登录请求
\`\`\`#### 方案 B:提取 SVG 并保存为文件(备选)
适用场景:__NUXT__ 中没有 Mermaid 代码时
提取方法:
从 HTML 中查找以下结构:
<div class="bytemd-mermaid" style="line-height: initial;">
<svg aria-roledescription="flowchart-v2" ...>...</svg>
</div>处理步骤:
class="bytemd-mermaid" 元素<svg> 内容<svg>...</svg> 内容.svg 文件,命名为对应章节标题注意事项:
bytemd-mermaid div 可能是空的(作者未添加内容),需要跳过:#### 方案 C:截图保存(备选)
如果无法提取原始代码,可以截图渲染后的 SVG:
// Playwright 截图示例
const element = await page.$('.bytemd-mermaid svg');
await element.screenshot({ path: 'mermaid-diagram.png' });注意:此方法需要额外的图片存储。
#### 处理建议
| 场景 | 推荐方案 |
|---|---|
| 使用 Obsidian/Typora | 方案 A(保留代码) |
| 需要通用兼容 | 方案 B(mermaid.ink 图片) |
| 离线使用 | 方案 C(截图保存) |
有序列表:
1. 第一步
2. 第二步
3. 第三步无序列表:
- 项目一
- 项目二
- 项目三嵌套列表:
1. 主项目
- 子项目一
- 子项目二
2. 下一个主项目处理规则:
-,有序用 1. 2. 等)在文件开头添加 YAML frontmatter:
---
title: 文章标题
author: 作者名称
source: 原始链接
date_saved: 保存日期
tags: [掘金, 其他标签]
---文件命名规则:
YYYY-MM-DD-标题摘要.md2026-03-19-开源分布式IM系统介绍.md原因:掘金代码块包含按钮文字
解决方案:
清理代码块开头的前 3-5 行无关内容
保留实际代码
确保语言标识正确原因:使用掘金跳转链接
解决方案:
解析 link.juejin.cn?target=xxx
提取并解码真实 URL
直接使用真实链接原因:
解决方案:
保留 p*-xtjj-sign.byteimg.com 和 p*-juejin-sign.byteimg.com 域名图片
丢弃 lf-web-assets.juejin.cn 和 passport 相关图片原因:表格前后缺少空行
解决方案:
确保表格前后各有一个空行
检查表头分隔符
确保每行列数一致原因:
window.__NUXT__ 数据中提取原始 Mermaid 代码bytemd-mermaid div 可能为空(作者未添加内容)解决方案:
方案 A:从 __NUXT__ 提取原始 Mermaid 代码(推荐)
- 查找 <script>window.__NUXT__= 标签
- 解码 Unicode 转义序列(\uXXXX)
- 解码换行符(\n → 实际换行)
- 用正则提取 ```mermaid ... ``` 代码块
- 直接嵌入 Markdown 文件
方案 B:提取 SVG 保存为文件(备选)
- 仅当 __NUXT__ 中没有 Mermaid 代码时使用
- 查找 .bytemd-mermaid 内的 <svg> 标签
- 保存为 .svg 文件
方案 C:跳过空图表
- 检查 bytemd-mermaid div 是否包含 SVG
- 如果为空,保留章节标题但不添加图表
- 这是作者原文就没有图表,不是转换问题代码示例(提取 Mermaid 源码):
import re
# 找到 __NUXT__ 脚本
script_match = re.search(r'<script[^>]*>window\.__NUXT__\s*=', html)
if script_match:
script_end = html.find('</script>', script_match.start())
script = html[script_match.start():script_end]
# 解码转义
decoded = re.sub(r'\\u([0-9a-fA-F]{4})',
lambda m: chr(int(m.group(1), 16)), script)
decoded = decoded.replace('\\n', '\n')
# 提取 Mermaid 代码
blocks = re.findall(r'```mermaid\n(.*?)```', decoded, re.DOTALL)
for code in blocks:
print(code) # 输出原始 Mermaid 代码---
title: {{文章标题}}
author: {{作者}}
source: {{原始链接}}
date_saved: {{保存日期}}
tags: [掘金, {{其他标签}}]
---
# {{文章标题}}
> 作者:{{作者名称}}
> 来源:掘金
> 链接:{{原始链接}}
> 发布日期:{{发布日期}}

{{正文内容}}
---
*本文由 [juejin-article-to-markdown] 自动转换*
*保存自掘金文章,仅供个人学习使用*用户输入:
保存这篇掘金文章 https://juejin.cn/post/7549107076905173028处理步骤:
| 特性 | 微信公众号 | 掘金 |
|---|---|---|
| 图片域名 | mmbiz.qpic.cn | byteimg.com |
| 外链处理 | 通常无外链 | 需解析 link.juejin.cn |
| 代码块 | 无特殊按钮 | 需清理按钮文字 |
| Mermaid图表 | 无 | 需提取原始代码或转图片 |
| 评论 | 需移除评论区 | 需移除评论区 |
| 推荐 | 无推荐文章 | 需移除推荐列表 |
| 目录 | 通常无目录 | 可选择性保留 |
bytemd-mermaid div 可能为空(作者未添加内容)wechat-article-to-markdown - 处理微信公众号文章pdf - 处理 PDF 文件docx - 处理 Word 文档~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.