tech-news-digest技能使用说明
科技新闻摘要
一个自动化的科技新闻摘要系统,包含统一的数据源模型、质量评分流水线和基于模板的输出生成。
快速开始
-
配置设置:默认配置位于
config/defaults/。复制到工作空间以进行自定义:mkdir -p workspace/config cp config/defaults/sources.json workspace/config/tech-news-digest-sources.json cp config/defaults/topics.json workspace/config/tech-news-digest-topics.json -
环境变量:
TWITTERAPI_IO_KEY- twitterapi.io API 密钥(可选,首选)X_BEARER_TOKEN- Twitter/X 官方 API 承载令牌(可选,备用)TAVILY_API_KEY- Tavily 搜索 API 密钥,可作为 Brave 的替代方案(可选)WEB_SEARCH_BACKEND- 网络搜索后端:auto|brave|tavily(可选,默认值:auto)BRAVE_API_KEYS- Brave 搜索 API 密钥,用逗号分隔以便轮换使用(可选)BRAVE_API_KEY- 单一Brave密钥回退机制(可选)GITHUB_TOKEN- GitHub个人访问令牌(可选,可提升速率限制)
-
生成摘要:
# Unified pipeline (recommended) — runs all 6 sources in parallel + merge python3 scripts/run-pipeline.py \ --defaults config/defaults \ --config workspace/config \ --hours 48 --freshness pd \ --archive-dir workspace/archive/tech-news-digest/ \ --output /tmp/td-merged.json --verbose --force -
使用模板:将Discord、电子邮件或PDF模板应用于合并后的输出
配置文件
sources.json- 统一数据源
{
"sources": [
{
"id": "openai-rss",
"type": "rss",
"name": "OpenAI Blog",
"url": "https://openai.com/blog/rss.xml",
"enabled": true,
"priority": true,
"topics": ["llm", "ai-agent"],
"note": "Official OpenAI updates"
},
{
"id": "sama-twitter",
"type": "twitter",
"name": "Sam Altman",
"handle": "sama",
"enabled": true,
"priority": true,
"topics": ["llm", "frontier-tech"],
"note": "OpenAI CEO"
}
]
}
topics.json- 增强型主题定义
{
"topics": [
{
"id": "llm",
"emoji": "🧠",
"label": "LLM / Large Models",
"description": "Large Language Models, foundation models, breakthroughs",
"search": {
"queries": ["LLM latest news", "large language model breakthroughs"],
"must_include": ["LLM", "large language model", "foundation model"],
"exclude": ["tutorial", "beginner guide"]
},
"display": {
"max_items": 8,
"style": "detailed"
}
}
]
}
脚本管道
run-pipeline.py- 统一管道(推荐)
python3 scripts/run-pipeline.py \
--defaults config/defaults [--config CONFIG_DIR] \
--hours 48 --freshness pd \
--archive-dir workspace/archive/tech-news-digest/ \
--output /tmp/td-merged.json --verbose --force
- 特性:并行运行全部6个抓取步骤,随后进行合并、去重和评分
- 输出:最终合并的JSON,可用于报告生成(总计约30秒)
- 元数据:将各步骤的时间统计和计数信息保存至
*.meta.json - GitHub 认证:如果未设置
$GITHUB_TOKEN则自动生成 GitHub App 令牌 - 备选方案:如果上述方法失败,请运行下方的独立脚本
独立脚本(备选方案)
fetch-rss.py- RSS 源抓取器
python3 scripts/fetch-rss.py [--defaults DIR] [--config DIR] [--hours 48] [--output FILE] [--verbose]
- 并行抓取(10个工作线程),带退避重试,feedparser + 正则表达式备选方案
- 超时:每个源30秒,ETag/Last-Modified缓存
fetch-twitter.py- Twitter/X KOL 监控器
python3 scripts/fetch-twitter.py [--defaults DIR] [--config DIR] [--hours 48] [--output FILE] [--backend auto|official|twitterapiio]
- 后端自动检测:如果设置了
TWITTERAPI_IO_KEY则使用 twitterapi.io,否则如果设置了X_BEARER_TOKEN则使用官方 X API v2 - 速率限制处理,互动指标,带退避重试
fetch-web.py- 网络搜索引擎
python3 scripts/fetch-web.py [--defaults DIR] [--config DIR] [--freshness pd] [--output FILE]
- 自动检测Brave API速率限制:付费计划→并行查询,免费→顺序查询
- 无API时:为智能体生成搜索界面
fetch-github.py- GitHub版本发布监控器
python3 scripts/fetch-github.py [--defaults DIR] [--config DIR] [--hours 168] [--output FILE]
- 并行获取(10个工作线程),30秒超时
- 认证优先级:
$GITHUB_TOKEN→ GitHub应用自动生成 →gh命令行界面→未认证(60次请求/小时)
fetch-github.py --trending- GitHub热门仓库
python3 scripts/fetch-github.py --trending [--hours 48] [--output FILE] [--verbose]
- 在GitHub API中搜索4个主题(LLM、AI智能体、加密、前沿科技)的热门仓库
- 质量评分:基础5分 + 预估每日星标数 / 10,最高15分
fetch-reddit.py- Reddit帖子获取器
python3 scripts/fetch-reddit.py [--defaults DIR] [--config DIR] [--hours 48] [--output FILE]
- 并行获取(4个工作线程),公共JSON API(无需认证)
- 13个子版块,带评分过滤
enrich-articles.py- 文章全文增强器
python3 scripts/enrich-articles.py --input merged.json --output enriched.json [--min-score 10] [--max-articles 15] [--verbose]
- 获取高分文章的完整正文
- Cloudflare Markdown for Agents(首选)→ HTML提取(备用)→ 跳过(付费墙/社交内容)
- 博客域名白名单,采用较低分数阈值(≥3)
- 并行获取(5个工作进程,10秒超时)
merge-sources.py- 质量评分与去重
python3 scripts/merge-sources.py --rss FILE --twitter FILE --web FILE --github FILE --reddit FILE
- 质量评分,标题相似度去重(85%),对先前摘要内容进行惩罚性扣分
- 输出:按主题分组并按分数排序的文章
validate-config.py- 配置验证器
python3 scripts/validate-config.py [--defaults DIR] [--config DIR] [--verbose]
- JSON模式验证,主题引用检查,重复ID检测
generate-pdf.py- PDF报告生成器
python3 scripts/generate-pdf.py --input report.md --output digest.pdf [--verbose]
- 将Markdown摘要转换为带中文字体排版(Noto Sans CJK SC)的A4样式PDF
- 表情符号图标,页眉/页脚,蓝色强调主题。需要
weasyprint。
sanitize-html.py- 安全的HTML邮件转换器
python3 scripts/sanitize-html.py --input report.md --output email.html [--verbose]
- 将Markdown转换为内联CSS的XSS安全HTML邮件
- URL白名单(仅限http/https),HTML转义的文本内容
source-health.py- 数据源健康监控
python3 scripts/source-health.py --rss FILE --twitter FILE --github FILE --reddit FILE --web FILE [--verbose]
- 追踪各数据源7天内的成功/失败历史
- 报告异常数据源(失败率>50%)
summarize-merged.py- 合并数据摘要
python3 scripts/summarize-merged.py --input merged.json [--top N] [--topic TOPIC]
- 为LLM使用提供人类可读的合并数据摘要
- 显示每个主题下评分最高的文章及其指标
用户自定义
工作空间配置覆盖
将自定义配置置于workspace/config/目录以覆盖默认设置:
- 数据源:添加新数据源,通过
"enabled": false - 禁用默认数据源主题
- :覆盖主题定义、搜索查询、显示设置具有相同
- 标识符
→ 用户版本优先具有新 - 标识符
→ 追加到默认值后具有相同 - 标识符
→ 用户版本完全替换默认版本工作区覆盖示例
- 标识符
模板与输出
// workspace/config/tech-news-digest-sources.json
{
"sources": [
{
"id": "simonwillison-rss",
"enabled": false,
"note": "Disabled: too noisy for my use case"
},
{
"id": "my-custom-blog",
"type": "rss",
"name": "My Custom Tech Blog",
"url": "https://myblog.com/rss",
"enabled": true,
"priority": true,
"topics": ["frontier-tech"]
}
]
}
Discord 模板 (
references/templates/discord.md)项目符号列表格式,支持链接抑制 (
- <link>
)移动端优化,包含表情符号标题 - 注意 2000 字符限制
- 电子邮件模板 (
references/templates/email.md)丰富的元数据、技术统计信息、存档链接
- Rich metadata, technical stats, archive links
- 执行摘要,热门文章版块
- 兼容HTML的格式
PDF模板 (references/templates/pdf.md)
- 采用A4版面,使用Noto Sans CJK SC字体以支持中文
- 包含表情符号图标、带页码的页眉/页脚
- 通过
scripts/generate-pdf.py生成 (需要weasyprint)
默认来源(总计151个)
- RSS订阅源(62个):人工智能实验室、科技博客、加密新闻、中文科技媒体
- Twitter/X关键意见领袖(48个):人工智能研究员、加密领域领导者、科技公司高管
- GitHub仓库(28个):主要开源项目(LangChain, vLLM, DeepSeek, Llama等)
- Reddit(13个):r/MachineLearning, r/LocalLLaMA, r/CryptoCurrency, r/ChatGPT, r/OpenAI等
- 网络搜索(4个主题):LLM,AI Agent,Crypto,前沿科技
所有来源均已预先配置了相应的主题标签和优先级。
依赖项
pip install -r requirements.txt
可选但推荐:
feedparser>=6.0.0- 更好的RSS解析(如果不可用,则回退到正则表达式)jsonschema>=4.0.0- 配置验证
所有脚本仅使用Python 3.8+的标准库即可运行。
监控与运维
健康检查
# Validate configuration
python3 scripts/validate-config.py --verbose
# Test RSS feeds
python3 scripts/fetch-rss.py --hours 1 --verbose
# Check Twitter API
python3 scripts/fetch-twitter.py --hours 1 --verbose
归档管理
- 摘要自动归档至
<工作空间>/archive/tech-news-digest/ - 使用之前的摘要标题进行重复检测
- 旧归档自动清理(90天以上)
错误处理
- 网络故障:使用指数退避策略进行重试
- 速率限制:通过适当的延迟自动重试
- 内容无效:优雅降级,详细日志记录
- 配置错误:使用有帮助信息的模式验证
API密钥与环境
设置在~/.zshenv或类似文件中:
# Twitter (at least one required for Twitter source)
export TWITTERAPI_IO_KEY="your_key" # twitterapi.io key (preferred)
export X_BEARER_TOKEN="your_bearer_token" # Official X API v2 (fallback)
export TWITTER_API_BACKEND="auto" # auto|twitterapiio|official (default: auto)
# Web Search (optional, enables web search layer)
export WEB_SEARCH_BACKEND="auto" # auto|brave|tavily (default: auto)
export TAVILY_API_KEY="tvly-xxx" # Tavily Search API (free 1000/mo)
# Brave Search (alternative)
export BRAVE_API_KEYS="key1,key2,key3" # Multiple keys, comma-separated rotation
export BRAVE_API_KEY="key1" # Single key fallback
export BRAVE_PLAN="free" # Override rate limit detection: free|pro
# GitHub (optional, improves rate limits)
export GITHUB_TOKEN="ghp_xxx" # PAT (simplest)
export GH_APP_ID="12345" # Or use GitHub App for auto-token
export GH_APP_INSTALL_ID="67890"
export GH_APP_KEY_FILE="/path/to/key.pem"
- Twitter:
首选 TWITTERAPI_IO_KEY(每月3-5美元);X_BEARER_TOKEN作为备用;自动模式首先尝试twitterapiio网络搜索 - :Tavily(自动模式首选)或Brave;可选,若不可用则回退至代理网络搜索GitHub
- :如果未设置PAT,则从GitHub应用自动生成令牌;未认证回退(每小时60次请求)Reddit
- Reddit无需API密钥(使用公共JSON API)
Cron/定时任务集成
OpenClaw Cron(推荐方案)
cron提示词应当避免硬编码流水线步骤。应引用references/digest-prompt.md并仅传递配置参数。这能确保流水线逻辑始终保留在技能仓库中,且在所有部署环境中保持一致。
每日摘要Cron提示词
Read <SKILL_DIR>/references/digest-prompt.md and follow the complete workflow to generate a daily digest.
Replace placeholders with:
- MODE = daily
- TIME_WINDOW = past 1-2 days
- FRESHNESS = pd
- RSS_HOURS = 48
- ITEMS_PER_SECTION = 3-5
- ENRICH = true
- BLOG_PICKS_COUNT = 3
- EXTRA_SECTIONS = (none)
- SUBJECT = Daily Tech Digest - YYYY-MM-DD
- WORKSPACE = <your workspace path>
- SKILL_DIR = <your skill install path>
- DISCORD_CHANNEL_ID = <your channel id>
- EMAIL = (optional)
- LANGUAGE = English
- TEMPLATE = discord
Follow every step in the prompt template strictly. Do not skip any steps.
每周摘要Cron提示词
Read <SKILL_DIR>/references/digest-prompt.md and follow the complete workflow to generate a weekly digest.
Replace placeholders with:
- MODE = weekly
- TIME_WINDOW = past 7 days
- FRESHNESS = pw
- RSS_HOURS = 168
- ITEMS_PER_SECTION = 10-15
- ENRICH = true
- BLOG_PICKS_COUNT = 3-5
- EXTRA_SECTIONS = 📊 Weekly Trend Summary (2-3 sentences summarizing macro trends)
- SUBJECT = Weekly Tech Digest - YYYY-MM-DD
- WORKSPACE = <your workspace path>
- SKILL_DIR = <your skill install path>
- DISCORD_CHANNEL_ID = <your channel id>
- EMAIL = (optional)
- LANGUAGE = English
- TEMPLATE = discord
Follow every step in the prompt template strictly. Do not skip any steps.
为何采用此模式?
- 单一事实来源:流水线逻辑存在于
digest-prompt.md中,而非分散在各cron配置里 - 可移植性:相同技能部署于不同OpenClaw实例时,仅需修改路径和频道ID
- 可维护性:更新技能→所有cron任务自动同步变更
- 反模式切勿将流水线步骤复制到cron提示中——否则会导致不同步
多频道投递限制
OpenClaw强制实施跨供应商隔离:单个会话只能向一个供应商发送消息(例如,Discord 或 Telegram,不能同时发送)。如果您需要将摘要投递到多个平台,请为每个供应商创建独立的cron任务:
# Job 1: Discord + Email
- DISCORD_CHANNEL_ID = <your-discord-channel-id>
- EMAIL = user@example.com
- TEMPLATE = discord
# Job 2: Telegram DM
- DISCORD_CHANNEL_ID = (none)
- EMAIL = (none)
- TEMPLATE = telegram
替换DISCORD_CHANNEL_ID在第二个任务的提示中,使用目标平台的投递方式。
这是一个安全特性,而非缺陷——旨在防止意外的跨上下文数据泄露。
安全说明
执行模型
此技能采用提示模板模式:代理读取digest-prompt.md并遵循其指令。这是标准的OpenClaw技能执行模型——代理程序解析来自技能文件的结构化指令。所有指令都随技能包一同发布,可在安装前进行审核。
网络访问
Python脚本会向以下地址发起出站请求:
- RSS源URL(在
tech-news-digest-sources.json文件中配置 - )
Twitter/X API(api.x.com或api.twitterapi.io - )
Brave搜索API(api.search.brave.com - )
Tavily搜索API(api.tavily.com - )
GitHub API(api.github.com - )
Reddit JSON API(reddit.com
不会向任何其他端点发送数据。所有 API 密钥均从技能元数据中声明的环境变量中读取。
Shell 安全性
邮件发送使用send-email.py该脚本构建包含 HTML 正文和可选 PDF 附件的标准 MIME 多部分消息。主题格式为硬编码(每日技术摘要 - YYYY-MM-DD)。PDF 生成通过weasyprint使用generate-pdf.py脚本完成。提示模板明确禁止将不受信任的内容(文章标题、推文文本等)插入 Shell 参数。电子邮件地址和主题必须仅为静态占位符值。
文件访问
脚本从config/目录读取配置,并向workspace/archive/目录写入文件。不会访问工作区之外的文件。
支持与故障排除
常见问题
- RSS 源获取失败检查网络连接,使用
--verbose以获取详细信息 - Twitter 速率限制:减少来源或增加间隔
- 配置错误:运行
validate-config.py以查找具体问题 - 未找到文章:检查时间窗口(
--hours)和来源启用状态
调试模式
所有脚本都支持--verbose标志,用于详细日志记录和故障排除。
性能调优
- 并行工作器:根据您的系统调整脚本中的
MAX_WORKERS超时设置 - :增加: Increase
超时针对慢速网络 - 文章限制:调整
每个订阅源的最大文章数根据需求调整
安全考量
Shell执行
摘要提示指示代理通过shell命令运行Python脚本。所有脚本路径和参数都是技能定义的常量——没有用户输入被插入到命令中。有两个脚本使用了subprocess:
run-pipeline.py协调子抓取脚本(所有脚本均在scripts/目录内)fetch-github.py包含两个子进程调用:openssl dgst -sha256 -sign用于JWT签名(仅在设置了GH_APP_*环境变量时使用——对自构造的JWT载荷进行签名,不涉及用户内容)gh auth tokenCLI后备方案(仅在gh已安装的情况下——从gh自身的凭据存储中读取)
任何用户提供或获取的内容都绝不会被插入到子进程参数中。邮件发送使用send-email.py,它以编程方式构建MIME消息——无shell插值。PDF生成通过weasyprint使用generate-pdf.py完成。邮件主题仅为静态格式字符串——绝不从获取的数据中构建。
凭据与文件访问
脚本不会直接读取~/.config/、~/.ssh/或任何凭据文件。所有API令牌均从技能元数据中声明的环境变量读取。GitHub身份验证的级联顺序为:
$GITHUB_TOKEN环境变量(由您控制提供的内容)- GitHub App 令牌生成(仅当您设置了
GH_APP_ID、GH_APP_INSTALL_ID和GH_APP_KEY_FILE时使用——通过openssl命令行工具进行内联JWT签名,不涉及外部脚本) gh auth token命令行工具(委托给gh自身的安全凭据存储)- 未验证身份(每小时60次请求,安全的回退方案)
如果您不希望自动发现凭据,只需设置$GITHUB_TOKEN,脚本将直接使用它,而不会尝试步骤2-3。
依赖安装
此技能不会安装任何软件包。requirements.txt列出了可选依赖项(feedparser、jsonschema) 仅供参考。所有脚本均使用 Python 3.8+ 标准库运行。如有需要,用户应在虚拟环境中安装可选依赖项——此功能永远不会运行pip install。
输入净化
- URL解析会拒绝非HTTP(S)协议(如javascript:、data:等)
- RSS备用解析使用简单、非回溯的正则表达式模式(无ReDoS风险)
- 所有获取的内容均被视为不可信数据,仅用于显示
网络访问
脚本会向配置的RSS源、Twitter API、GitHub API、Reddit JSON API、Brave搜索API和Tavily搜索API发起出站HTTP请求。不会创建入站连接或监听器。


微信扫一扫,打赏作者吧~