bestblogs-process-articles
BestBlogs 文章批量深度分析与翻译工作流。适用场景:(1) 查询等待分析的文章列表,(2) 批量分析文章并生成结构化评分,(3) 自动评分、分类、提取观点和金句,(4) 文章内容预处理工作流,(5) 快捷处理全部文章(无需确认),(6) 快捷处理前 N 篇文章,(7) 分析后自动翻译高分文章(≥80 分),(8) 翻译待翻译文章的分析结果,(9) 中译英/英译中文章分析结果。触发短语:'处理文章'、'文章分析'、'分析并更新'、'预处理文章'、'批量分析'、'文章工作流'、'BestBlogs 文章'、'等待分析'、'文章评分'、'结构化分析'、'处理待分析文章'、'处理全部文章'、'处理前 10 篇文章'、'处理前 5 篇'、'翻译文章结果'、'翻译分析结果'、'文章翻译'、'翻译摘要'、'中译英'、'英译中'、'翻译成英文'、'翻译成中文'、'批量翻译'、'翻译待处理'、'BestBlogs 翻译'、'处理翻译'、'翻译全部文章'、'翻译前 10 篇'、'翻译前 5 篇'。
分类
文档处理安装
下载并解压到你的 skills 目录
复制命令,发送给 OpenClaw 自动安装:
文章批量深度分析与翻译 (Process Articles)
查询 BestBlogs 中等待分析的文章 → 用户选择 → 逐篇获取正文、深度分析并更新 → ≥80 分自动翻译 → 更新翻译结果。若无待分析文章,自动查询待翻译文章并处理。
评分体系基于统一评分规则(docs/scoring-rubric.md),文章类型的评估维度和输出格式见 references/analysis_rubric.md。完整 API 参数详情见 references/api_reference.md。
认证
需要以下环境变量:
| 变量 | 用途 | 使用场景 |
|---|---|---|
BESTBLOGS_ADMIN_USER_ID | 管理员用户 ID | 查询文章列表、保存分析/翻译结果 |
BESTBLOGS_ADMIN_JWT_TOKEN | 管理员 JWT Token | 查询文章列表、保存分析/翻译结果 |
BESTBLOGS_API_KEY | OpenAPI 密钥 | 获取文章 Markdown 正文 |
Admin API 请求:
-H "Authorization: Bearer $BESTBLOGS_ADMIN_JWT_TOKEN"
-H "User-Id: $BESTBLOGS_ADMIN_USER_ID"
-H "Content-Type: application/json"OpenAPI 请求:
-H "X-API-KEY: $BESTBLOGS_API_KEY"若环境变量未设置,提示用户配置。
接口地址:https://api.bestblogs.dev
可用端点
| 端点 | 方法 | 类型 | 用途 |
|---|---|---|---|
/api/admin/article/list | POST | 读取 | 查询等待分析/翻译的文章列表 |
/openapi/v1/resource/markdown | GET | 读取 | 获取文章 Markdown 正文 |
/dify/resource/markdown | GET | 读取 | 获取文章正文和已分析的结果(翻译阶段用) |
/api/admin/article/runPrepareFlow?id={id} | POST | 写入 | 空内容兜底预处理(触发正文抓取/修复) |
/api/admin/article/saveAnalysisResult?id={id} | POST | 写入 | 保存分析结果(评分、摘要、标签等) |
/api/admin/article/saveTranslateResult?id={id} | POST | 写入 | 保存翻译后的分析结果 |
工作流概览(5 个阶段)
阶段一(查询文章列表)→ 阶段二(用户选择)→ 阶段三(逐篇分析)→ 阶段四(翻译高分文章)→ 阶段五(输出结果)两种运行模式
模式 A — 分析 + 翻译一体化(默认):
WAIT_PREPARE / WAIT_ANALYSIS 状态文章模式 B — 仅翻译(无待分析文章时自动进入,或用户直接触发翻译相关短语):
WAIT_TRANSLATE 状态文章快捷模式
当用户在触发 skill 时已明确指定处理范围,跳过阶段二的确认,直接进入阶段三:
| 用户输入 | 行为 |
|---|---|
| "处理全部文章" / "process all articles" | 查询后直接处理全部文章 |
| "处理前 N 篇文章" / "处理前 10 篇" | 查询后按列表顺序取前 N 篇处理 |
| "翻译全部文章" / "translate all articles" | 查询待翻译文章后直接翻译全部 |
| "翻译前 N 篇" | 查询待翻译文章后取前 N 篇翻译 |
快捷模式下仍然输出文章列表摘要(总数、优先级/语言分布),但不等待用户选择,立即开始处理。若查询结果为空,正常提示"暂无等待处理的文章"并结束。
阶段一:查询文章列表
分析模式(默认)
优先使用 WAIT_PREPARE 查询,若结果为空则回退到 WAIT_ANALYSIS:
curl -s -X POST https://api.bestblogs.dev/api/admin/article/list \
-H "Authorization: Bearer $BESTBLOGS_ADMIN_JWT_TOKEN" \
-H "User-Id: $BESTBLOGS_ADMIN_USER_ID" \
-H "Content-Type: application/json" \
-d '{
"currentPage": 1,
"pageSize": 50,
"type": "ARTICLE",
"flowStatusFilter": "WAIT_PREPARE",
"startDate": "YYYY-MM-DD",
"endDate": "YYYY-MM-DD"
}'startDate = 今天 -7 天,endDate = 今天)WAIT_PREPARE 结果为空,自动用 flowStatusFilter: "WAIT_ANALYSIS" 重试totalCount > 50,自动翻页拉取全部(每页 50,最多 200 篇)自动降级为翻译模式
若 WAIT_PREPARE 和 WAIT_ANALYSIS 均为空,自动查询 WAIT_TRANSLATE:
curl -s -X POST https://api.bestblogs.dev/api/admin/article/list \
-H "Authorization: Bearer $BESTBLOGS_ADMIN_JWT_TOKEN" \
-H "User-Id: $BESTBLOGS_ADMIN_USER_ID" \
-H "Content-Type: application/json" \
-d '{
"currentPage": 1,
"pageSize": 50,
"type": "ARTICLE",
"flowStatusFilter": "WAIT_TRANSLATE",
"startDate": "YYYY-MM-DD",
"endDate": "YYYY-MM-DD"
}'若待翻译文章也为空,提示"暂无等待处理的文章(分析和翻译均无待处理)"并结束。
始终检查 success 字段。
阶段二:用户选择
展示文章列表:
## 等待分析的文章(共 N 篇) ← 或"等待翻译的文章"
| # | ID | 标题 | 来源 | 优先级 | 语言 | 评分 | 发布日期 |
|---|-----|------|------|--------|------|------|---------|
| 1 | RAW_xxx | 文章标题 1 | 来源 A | HIGH | 中文 | - | 2026-03-13 |
| 2 | RAW_yyy | 文章标题 2 | 来源 B | MEDIUM | English | 85 | 2026-03-12 |
请选择要处理的文章:
- "全部" — 处理所有文章
- "1, 3, 5" — 处理指定编号的文章等待用户选择后继续。
阶段三:逐篇分析
> 仅在分析模式下执行。 翻译模式直接跳到阶段四。
严格串行处理。 每篇文章必须完成以下 3 步后,再处理下一篇:
步骤 A: 获取正文 → 步骤 B: 深度分析 → 步骤 C: 保存结果ID-内容关联安全
{id} 和内容的对应关系saveAnalysisResult 必须使用与获取正文相同的 {id}步骤 A: 获取文章正文(含空内容兜底预处理)
curl -s "https://api.bestblogs.dev/openapi/v1/resource/markdown?id=RAW_xxx" \
-H "X-API-KEY: $BESTBLOGS_API_KEY"响应 data 字段为 Markdown 字符串。
若返回 null 或空字符串,执行兜底预处理:
curl -s -X POST "https://api.bestblogs.dev/api/admin/article/runPrepareFlow?id=RAW_xxx" \
-H "Authorization: Bearer $BESTBLOGS_ADMIN_JWT_TOKEN" \
-H "User-Id: $BESTBLOGS_ADMIN_USER_ID" \
-H "Content-Type: application/json"兜底规则(必须按顺序):
runPrepareFlow 返回 success: true 且 data: true 时,等待 2-3 秒后重试获取 markdowndata 后,继续步骤 B 分析runPrepareFlow 返回失败,标注 ❌ 预处理失败,跳过该篇继续下一篇步骤 B: 深度分析
使用文章元数据(来自阶段一列表)和正文(步骤 A)构造分析输入,按照 references/analysis_rubric.md 中的评分体系进行深度分析。
构造分析输入 XML:
<article>
<metadata>
<title>文章标题(来自列表的 title 字段)</title>
<source>来源名称(来自列表的 sourceName 字段)</source>
<url>原文链接(来自列表的 url 字段)</url>
</metadata>
<content>
<![CDATA[
Markdown 正文内容(来自步骤 A)
]]>
</content>
</article>分析要求:
priority 字段)和原创性对评分的影响> 完整评分标准、分布指导、减分项、领域分类、示例均在 references/analysis_rubric.md 中,分析时必须加载并遵循。
输出语言规则(重要):
oneSentenceSummary、summary、tags、mainPoints、keyQuotes 等内容字段必须与原文语言一致- 英文文章 → 全部用英文输出
- 中文文章 → 全部用中文输出
domain、aiSubcategory 使用 API 枚举值(见下方),与语言无关remark 始终用中文(评分依据供内部审核使用)references/analysis_rubric.md分析输出 JSON:
{
"title": "可选:仅在标题含网站名称等冗余信息时填写清理后的标题,否则省略",
"oneSentenceSummary": "一句话核心总结,与原文同语言",
"summary": "核心内容概要(200-400 字),与原文同语言",
"domain": "一级分类代码:Artificial_Intelligence / Programming_Technology / Product_Development / Business_Tech / Productivity_Growth / Finance_Economy / News_Media / Lifestyle_Culture",
"aiSubcategory": "二级分类代码(核心分类必填,通用分类留空):AI→MODELS/AI_CODING/DEV/PRODUCT/NEWS;SE→SE_FRONTEND/SE_BACKEND/SE_DEVOPS/SE_TOOLS/SE_PRACTICE;PD→PD_PM/PD_DESIGN/PD_CREATIVE;BT→BT_STARTUP/BT_NEWS/BT_INSIGHT/BT_PEOPLE;PG→PG_TOOLS/PG_CAREER/PG_LEARNING",
"tags": ["与原文同语言的标签(3-8 个)"],
"mainPoints": [{"point": "主要观点(3-5 条,与原文同语言)", "explanation": "观点解释(与原文同语言)"}],
"keyQuotes": ["原文金句,必须逐字引用原文(3-5 句)"],
"score": 85,
"remark": "中文评分依据、分析和推荐等级"
}步骤 C: 保存分析结果
端点:POST /api/admin/article/saveAnalysisResult?id={id},id 为 query 参数。
一级分类枚举值(domain 字段):
| 领域 | 枚举值 | 类型 |
|---|---|---|
| 人工智能 | Artificial_Intelligence | 核心 |
| 软件编程 | Programming_Technology | 核心 |
| 产品设计 | Product_Development | 核心 |
| 商业科技 | Business_Tech | 核心 |
| 个人成长 | Productivity_Growth | 核心 |
| 投资财经 | Finance_Economy | 通用 |
| 媒体资讯 | News_Media | 通用 |
| 生活文化 | Lifestyle_Culture | 通用 |
二级分类枚举值(aiSubcategory 字段,5 个核心分类必填,3 个通用分类留空):
| 一级分类 | 二级分类 | 枚举值 |
|---|---|---|
| 人工智能 | AI 模型与研究 | MODELS |
| 人工智能 | AI 编程 | AI_CODING |
| 人工智能 | AI 应用开发 | DEV |
| 人工智能 | AI 产品与工具 | PRODUCT |
| 人工智能 | AI 行业动态 | NEWS |
| 软件编程 | 前端开发 | SE_FRONTEND |
| 软件编程 | 后端与架构 | SE_BACKEND |
| 软件编程 | DevOps 与云 | SE_DEVOPS |
| 软件编程 | 开源与工具 | SE_TOOLS |
| 软件编程 | 工程实践 | SE_PRACTICE |
| 产品设计 | 产品管理 | PD_PM |
| 产品设计 | UX/UI 设计 | PD_DESIGN |
| 产品设计 | 创意与视觉 | PD_CREATIVE |
| 商业科技 | 创业与投资 | BT_STARTUP |
| 商业科技 | 科技资讯 | BT_NEWS |
| 商业科技 | 商业洞察 | BT_INSIGHT |
| 商业科技 | 人物与访谈 | BT_PEOPLE |
| 个人成长 | 效率工具 | PG_TOOLS |
| 个人成长 | 职业发展 | PG_CAREER |
| 个人成长 | 思维与学习 | PG_LEARNING |
分类判断关键边界:
curl -s -X POST "https://api.bestblogs.dev/api/admin/article/saveAnalysisResult?id=RAW_xxx" \
-H "Authorization: Bearer $BESTBLOGS_ADMIN_JWT_TOKEN" \
-H "User-Id: $BESTBLOGS_ADMIN_USER_ID" \
-H "Content-Type: application/json" \
-d '{
"oneSentenceSummary": "一句话总结(与原文同语言)",
"summary": "核心内容概要(与原文同语言)",
"domain": "Artificial_Intelligence",
"aiSubcategory": "DEV",
"tags": ["Tag1", "Tag2"],
"mainPoints": [
{"point": "观点1(与原文同语言)", "explanation": "解释1"},
{"point": "观点2", "explanation": "解释2"}
],
"keyQuotes": ["原文金句1", "原文金句2", "原文金句3"],
"score": 85,
"remark": "中文评分依据和推荐等级"
}'> 重要:步骤 B(分析)和步骤 C(保存)必须作为独立步骤分开执行。先确保分析结果完整、JSON 合法,再调用保存 API。
输出进度
每处理完一篇文章,更新进度:
- [1/5] ✅ RAW_xxx — 文章标题 1 (85 分,已保存) → 🔄 翻译中...
- [2/5] ✅ RAW_yyy — 文章标题 2 (72 分,已保存) → ⏭️ 跳过翻译(<80 分)
- [3/5] ⏳ RAW_zzz — 文章标题 3单篇文章任一步骤失败时,记录错误并继续处理下一篇。
阶段四:翻译
模式 A — 分析后自动翻译
分析阶段完成后,自动对 ≥80 分 的文章执行翻译。无需用户二次确认。
对每篇高分文章执行:
步骤 D: 获取分析结果 → 步骤 E: 翻译 → 步骤 F: 保存翻译结果模式 B — 独立翻译
当无待分析文章(或用户直接触发翻译短语)时,对阶段一查询到的 WAIT_TRANSLATE 文章逐篇执行步骤 D → E → F。
步骤 D: 获取文章内容和分析结果
模式 A(分析后翻译):直接复用阶段三步骤 B 的分析结果 JSON,无需再次请求 API。
模式 B(独立翻译):使用 /dify/resource/markdown 端点获取:
curl -s "https://api.bestblogs.dev/dify/resource/markdown?id=RAW_xxx&language=zh"> 注意:此端点无需认证头,language 参数影响 languageName 和 destLanguageName 的显示语言。
响应字段详见 references/api_reference.md。关键字段:
languageName — 原始语言(如"中文"、"English")destLanguageName — 目标翻译语言analysisResult — 已分析的结构化结果(JSON 字符串,需解析)若 success 为 "false" 或 analysisResult 为空,跳过该篇。
步骤 E: 翻译分析结果
语言方向判断:
language 字段(zh_CN → 中译英,en_US → 英译中)/dify/resource/markdown 返回的 languageName 和 destLanguageName翻译要求(AI 翻译专家角色):
- 常见技术术语直接使用,不加括号注释:AI、Agent、RAG、LLM、API、SDK、UI、UX、ML、NLP、GPT 等
- 禁止写成「人工智能(AI)」「AI Agent(AI 智能体)」等冗余形式
- AI 领域翻译(英译中时):Agent → 智能体,Memory → 记忆
- 人名、公司名、产品名保持原文或直接翻译,不加括号注释
- 全文术语翻译保持一致
- 意译而非直译,使用更为地道的表述方式,确保内容准确、逻辑连贯、表达流畅
- 尽量减少使用引号和破折号
- 中文引号使用「」替换""
- 保持原文语气和风格
- 面向技术人员的阅读需求
- 中文与英文、数字之间添加空格
- 可适当使用基础 Markdown 语法(强调、
代码),但不要过多使用- 保持原 JSON 结构和 key 名称不变
- 只输出翻译后的 JSON,不输出任何其他内容
- 禁止:解释说明、括号注释、术语列表、JSON 前后的文本
翻译输出:与输入结构完全相同的 JSON,所有文本字段翻译为目标语言:
{
"title": "翻译后的标题",
"oneSentenceSummary": "翻译后的一句话总结",
"summary": "翻译后的全文摘要",
"tags": ["翻译后标签1", "翻译后标签2"],
"mainPoints": [
{"point": "翻译后的观点 1", "explanation": "翻译后的解释 1"}
],
"keyQuotes": ["翻译后的金句 1", "翻译后的金句 2"]
}步骤 F: 保存翻译结果
curl -s -X POST "https://api.bestblogs.dev/api/admin/article/saveTranslateResult?id=RAW_xxx" \
-H "Authorization: Bearer $BESTBLOGS_ADMIN_JWT_TOKEN" \
-H "User-Id: $BESTBLOGS_ADMIN_USER_ID" \
-H "Content-Type: application/json" \
-d '{
"title": "翻译后的标题",
"oneSentenceSummary": "翻译后的一句话总结",
"summary": "翻译后的全文摘要",
"tags": ["翻译后标签1", "翻译后标签2"],
"mainPoints": [
{"point": "翻译后的观点 1", "explanation": "翻译后的解释 1"}
],
"keyQuotes": ["翻译后的金句 1", "翻译后的金句 2"]
}'注意:score、remark、domain、aiSubcategory、content 不传 — 保持分析阶段的原值。
> 步骤 E(翻译)和步骤 F(保存)必须作为独立步骤分开执行。
阶段五:输出最终结果
## 处理结果
| # | ID | 标题 | 来源 | 评分 | 领域 | 分析 | 翻译 |
|---|-----|------|------|------|------|------|------|
| 1 | RAW_xxx | 标题 1 | 来源 A | 85 | 人工智能 | ✅ | ✅ 中文→English |
| 2 | RAW_yyy | 标题 2 | 来源 B | 72 | 软件编程 | ✅ | ⏭️ <80分 |
| 3 | RAW_zzz | 标题 3 | 来源 C | - | - | ❌ 正文不可用 | - |
### 统计
- 分析成功:2 / 失败:1
- 翻译成功:1 / 跳过:1(<80 分)
### 评分分布
- 90+ 分:0 篇
- 80-89 分:1 篇(已翻译)
- 70-79 分:1 篇
- <70 分:0 篇错误处理
| 错误 | 原因 | 处理 |
|---|---|---|
success: false | API 返回错误 | 读取 code 和 message,告知用户 |
401 / 403 | Token 过期或无权限 | 立即暂停,提示用户更新认证信息 |
markdown 返回 null/空字符串 | 正文未抓取或抓取异常 | 先调用 runPrepareFlow,成功后重试 markdown(最多 3 次),仍失败再跳过 |
runPrepareFlow 失败 | 预处理接口异常或参数错误 | 记录失败并跳过该文章,继续下一篇 |
| 分析 JSON 格式错误 | 分析输出不符合预期格式 | 重试分析一次,仍失败则跳过 |
| saveAnalysisResult 失败 | 参数错误或服务端异常 | 记录失败,输出分析 JSON 供手动重试 |
/dify/resource/markdown 返回 success: "false" | 文章内容不可用 | 跳过翻译,继续下一篇 |
analysisResult 为空 | 文章尚未分析 | 跳过翻译,继续下一篇 |
| 翻译 JSON 格式错误 | 翻译输出不符合预期格式 | 重试翻译一次,仍失败则跳过 |
| saveTranslateResult 失败 | 参数错误或服务端异常 | 记录失败,输出翻译 JSON 供手动重试 |
| 环境变量未设置 | 缺少认证信息 | 提示配置 BESTBLOGS_ADMIN_USER_ID、BESTBLOGS_ADMIN_JWT_TOKEN、BESTBLOGS_API_KEY |