Install
openclaw skills install @thcjp/feed-to-md-tool-proopenclaw skills install @thcjp/feed-to-md-tool-pro功能说明: 本技能涵盖 与归档工具 等核心能力。
批量转换+自定义模板+AI增强+定时归档。企业级内容归档全功能覆盖。
将复杂的RSS内容转换与归档任务交给专业工具处理。专业版在免费版单源转换能力之上,新增批量转换、自定义模板、AI内容增强、定时归档、多格式输出、图片下载、全文获取、去重处理八大高级能力,满足企业级场景对内容归档的批量性、定制化与自动化要求.
| 能力维度 | 免费版 | 专业版 |
|---|---|---|
| 单源转换 | 支持 | 支持 |
| 批量转换 | 不支持 | 支持(并发处理) |
| 自定义模板 | 不支持 | 支持(完全自定义) |
| AI内容增强 | 不支持 | 支持(LLM摘要+关键词) |
| 定时归档 | 不支持 | 支持(cron调度) |
| 多格式输出 | 不支持 | 支持(HTML/PDF/EPUB) |
| 图片下载 | 不支持 | 支持(自动下载) |
| 全文获取 | 不支持 | 支持(完整内容) |
| 去重处理 | 不支持 | 支持(跨源去重) |
| 技术支持 | 社区 | 优先工单响应 |
详细代码示例已移至
references/detail.md
处理: 解析批量转换的输入参数,完成核心逻辑,返回结构化响应. 输出: 返回批量转换的响应数据,包含状态码、结果和日志.
处理: 解析自定义模板的输入参数,完成核心逻辑,返回结构化响应. 输出: 返回自定义模板的响应数据,包含状态码、结果和日志.
处理: 解析AI内容增强的输入参数,完成核心逻辑,返回结构化响应. 输出: 返回AI内容增强的响应数据,包含状态码、结果和日志.
处理: 解析定时归档的输入参数,完成核心逻辑,返回结构化响应. 输出: 返回定时归档的响应数据,包含状态码、结果和日志.
处理: 解析多格式输出的输入参数,完成核心逻辑,返回结构化响应. 输出: 返回多格式输出的响应数据,包含状态码、结果和日志. 能力覆盖范围:本skill的核心能力覆盖以下场景关键词:企业级、RSS、Markdown、专业版、含批量转换、助手专业版是面向、企业级场景的完整、内容转换与归档工、在免费版单源转换、能力之上、新增批量转换、图片下载、全文获取、去重处理八大高级、Use、when、模型调用、智能对话、Agent、LLM、应用时使用、不适用于需要、确定性的关键决策等。这些关键词对应description中声明的使用场景,均已在上述能力点中提供对应的操作支持.
场景描述:定时归档企业订阅的技术博客与行业资讯.
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| input | string | 是 | RSS转MD(专业版)处理的输入数据或指令 |
| options | object | 否 | 附加配置选项,如模式选择、格式偏好等 |
| callback_url | string | 否 | 异步处理完成后的回调通知URL |
archiver = ScheduledArchiver()
archiver.add_feed("https://tech-blog.com/feed.xml")
archiver.add_feed("https://industry-news.com/rss")
archiver.add_feed("https://research-papers.com/atom")
archiver.start()
场景描述:将多个WordPress博客的RSS批量转换为Markdown迁移到新平台.
converter = BatchFeedConverter(max_workers=5)
# ...
blogs = [
"https://blog1.com/feed",
"https://blog2.com/feed",
"https://blog3.com/feed",
]
# ...
results = converter.convert_batch(blogs, "./migrated")
场景描述:将技术博客RSS转为带AI摘要的Markdown文档库.
parser = RSSParser()
enhancer = AIContentEnhancer()
template_converter = TemplateBasedConverter("detailed")
# ...
xml = parser.fetch("https://tech-blog.com/feed.xml")
feed = parser.parse(xml)
# ...
enhanced_feed = enhancer.enhance_feed(feed)
# ...
markdown = template_converter.convert(enhanced_feed, template_name="detailed")
# ...
saver = FileSaver("./docs")
saver.save(markdown, feed_title=feed['title'])
python3 batch_convert.py --input feeds.txt --output ./archives
# ...
python3 convert.py --url https://example.com/feed.xml --template detailed --output ./output
pip install requests schedule beautifulsoup4
pip install markdown
cat > feed_to_md_config.yaml <<EOF
feeds:
- https://example.com/feed1.xml
- https://example.com/feed2.xml
# ...
batch:
max_workers: 5
output_dir: ./archives
# ...
template: detailed # default / academic / minimal / detailed
ai_enhancement:
enabled: true
generate_summary: true
extract_keywords: true
generate_tags: true
# ...
schedule:
daily_archive: "0 2 * * *"
# ...
export:
formats: [md, html, pdf]
output_dir: ./exports
EOF
# ...
python3 feed_to_md_service.py --config feed_to_md_config.yaml
feeds:
- url: https://tech-blog.com/feed.xml
name: 技术博客
template: detailed
- url: https://industry-news.com/rss
name: 行业资讯
template: academic
- url: https://research-papers.com/atom
name: 学术论文
template: academic
# ...
batch:
max_workers: 5
cache_enabled: true
cache_dir: ./cache
# ...
templates:
custom_templates:
- name: enterprise
header: "# {title}\n\n## 企业归档\n\n"
item: "
### {title}\n**日期**:{pub_date}\n**摘要**:{ai_summary}\n**关键词**:{keywords}\n\n"
footer: "\n---\n*归档时间:{converted_at}*\n"
# ...
ai_enhancement:
enabled: true
model: gpt-4o
generate_summary: true
summary_max_length: 200
extract_keywords: true
keywords_count: 5
generate_tags: true
tags_count: 3
# ...
schedule:
daily_archive: "0 2 * * *"
weekly_digest: "0 9 * * 1"
# ...
export:
formats: [md, html, pdf]
output_dir: ./exports
include_images: true
image_dir: ./images
# ...
deduplication:
enabled: true
method: title_similarity
threshold: 0.8
class CachedBatchConverter(BatchFeedConverter):
def __init__(self, cache_dir="./cache"):
super().__init__()
self.cache_dir = cache_dir
os.makedirs(cache_dir, exist_ok=True)
# ...
def _convert_single(self, url, output_dir):
import hashlib
cache_key = hashlib.md5(url.encode()).hexdigest()
cache_file = os.path.join(self.cache_dir, f"{cache_key}.json")
# ...
if os.path.exists(cache_file):
import json
with open(cache_file, 'r') as f:
return json.load(f)
# ...
result = super()._convert_single(url, output_dir)
import json
with open(cache_file, 'w') as f:
json.dump(result, f)
return result
TEMPLATE_LIBRARY = {
'default': '默认格式,包含所有基础字段',
'academic': '学术格式,适合论文与研究报告',
'minimal': '极简格式,仅标题和链接',
'detailed': '详细格式,包含所有元信息',
'enterprise': '企业格式,含AI摘要与关键词',
}
# ...
def share_template(team_name, template_name, template_dict):
"""分享模板到团队"""
print(f"已分享模板 {template_name} 到团队 {team_name}")
def cleanup_old_archives(archive_dir, keep_days=30):
"""清理超过N天的归档"""
import os
from datetime import datetime, timedelta
# ...
cutoff = datetime.now() - timedelta(days=keep_days)
for item in os.listdir(archive_dir):
item_path = os.path.join(archive_dir, item)
if os.path.isdir(item_path):
try:
archive_date = datetime.strptime(item, '%Y%m%d')
if archive_date < cutoff:
import shutil
shutil.rmtree(item_path)
print(f"已清理:{item}")
except ValueError:
... # 具体实现请参考上下文文档
专业版完全兼容免费版的所有功能。单源转换、基础解析、Markdown输出在专业版中均可直接使用。升级后原有脚本无需修改,仅新增高级能力可用.
建议根据源站承压能力设置:(1) 大型站点:5-10并发;(2) 中型站点:3-5并发;(3) 小型站点:1-3并发。同时考虑本地CPU/内存限制,单机建议不超过20.
专业版模板支持以下变量:(1) 订阅源信息(title/description/link/last_build_date);(2) 条目信息(title/link/description/pub_date/author/guid);(3) AI增强内容(ai_summary/keywords/tags);(4) 系统信息(converted_at/item_count/template_name).
专业版使用GPT-4o模型路由,提供更强的内容理解与摘要生成能力。支持生成摘要(200字以内)、提取关键词(5个)、生成标签(3个).
专业版支持cron表达式配置定时归档。默认每天凌晨2点执行。可通过配置文件指定不同频率(每小时/每日/每周/每月)。归档结果按日期分目录存储.
专业版支持四种格式:(1) Markdown(默认);(2) HTML(带样式);(3) PDF(需安装wkhtmltopdf);(4) EPUB(需安装pandoc)。可同时输出多种格式.
专业版支持基于标题相似度的去重。使用编辑距离算法计算标题相似度,超过阈值(默认0.8)的条目视为重复,仅保留领先条。可配置阈值与去重方法.
| 依赖项 | 类型 | 是否必需 | 获取方式 |
|---|---|---|---|
| Python 3.8+ | 运行时 | 必需 | 官网下载安装 |
| requests | Python库 | 必需 | pip install requests |
| schedule | Python库 | 必需 | pip install schedule(定时归档) |
| xml.etree.ElementTree | Python库 | 必需 | Python标准库(XML解析) |
| concurrent.futures | Python库 | 必需 | Python标准库(批量转换) |
| wkhtmltopdf | 工具 | 可选 | PDF输出需要 |
| pandoc | 工具 | 可选 | EPUB输出需要 |
| LLM API | API | 必需 | 由Agent平台内置LLM提供 |
本专业版相比免费版新增以下能力:
此外,专业版还提供:
| 版本 | 价格 | 功能 | 适用场景 |
|---|---|---|---|
| 免费体验版 | ¥0 | 单源转换 + 基础解析 + Markdown输出 + 文件保存 | 个人试用、单次转换 |
| 收费专业版 | ¥29/月 | 批量转换 + 自定义模板 + AI增强 + 定时归档 + 多格式 + 图片下载 + 全文获取 + 去重 + 优先支持 | 团队/企业、批量归档 |
专业版通过SkillHub SkillPay发布.
| 错误场景 | 原因 | 处理方式 |
|---|---|---|
| 配置错误 | 参数缺失或格式错误 | 检查依赖说明中的配置要求 |
| 运行时错误 | 运行环境不满足 | 确认运行环境符合依赖说明 |
| 网络错误 | 连接超时或不可达 | 执行ping命令测试网络连通性,检查防火墙和代理设置连接后执行ping命令测试网络连通性,检查防火墙和代理设置连接后重新执行命令,参考国内替代方案 |
输出:返回执行结果,包含操作状态和输出数据
用户: 执行核心功能
Skill: 正在执行核心功能...
Skill: 执行完成,结果如下: 操作成功
{
"success": true,
"data": {
"result": "RSS转MD(专业版)处理结果",
"execution_time": "0.5s",
"metadata": {
"version": "1.0",
"processor": "feed to md pro"
}
},
"execution_log": ["解析输入参数", "执行核心处理", "格式化输出结果"],
"error": null
}
| 风险类型 | 防范措施 |
|---|---|
| API密钥泄露 | 通过环境变量配置,禁止硬编码到代码或配置文件中 |
| 命令执行风险 | 仅执行白名单命令,避免拼接用户输入到命令行参数中 |
| 网络通信安全 | 使用HTTPS协议,验证SSL证书有效性 |
| 敏感数据暴露 | 输出结果中不包含密钥、令牌等敏感信息 |
使用前请确认已阅读依赖说明章节,确保运行环境满足安全要求。