Codex 实战 Skills:用 Skill 自动抓取 20 个 RSS 订阅,并用 AI 自动输出中文摘要(TaoToken 统一 Key 接入版)
1. 为什么我要把 20 个 RSS 源塞进 Codex Skill每天打开阅读器20 多个订阅源堆着上百条未读标题党一堆真正值得看的没几条。我试过用传统 RSS 阅读器加规则过滤但规则写起来比读文章还累而且英文源还得自己翻译。后来我把这件事拆成两步抓取交给脚本理解交给 AI中间用 Codex 的 Skill 机制串起来一次配置就能跑通全流程。Codex 的 Skill 本质上是一个可被 Agent 调用的能力单元你可以把它理解成给 AI 装了一只“手”这只手负责去网上把 RSS 拉回来、把正文洗干净再交给模型生成中文摘要。本文要交付的就是这样一个名为rss_aggregator的 Skill包含config.toml与settings.json的关键字段、20 个 RSS 源的抓取逻辑以及摘要输出的验证动作。适合已经会用命令行、想把手动读 RSS 变成自动流水线的开发者。整条链路里AI 调用是最容易卡住的一环不同模型的 Key 格式不一样切换模型要改代码。我用 TaoToken 的统一 Key 通道来解决这个问题一个 Key 走 OpenAI 兼容接口Skill 里只配一个base_url和api_key换模型不用动业务代码。下面从环境准备开始一步步把这条流水线搭起来。2. TaoToken 前置统一 Key 与接口地址在写 Skill 之前先把 AI 通道准备好。TaoToken 提供的是 OpenAI 兼容的 API 通道也就是说你原来用openaiSDK 写的代码只需要改base_url和api_key两个地方就能接上。对 Skill 这种要长期跑的自动化任务来说统一 Key 的好处是抓取脚本、摘要脚本、后续可能加的翻译脚本全都共用一套凭证不用为每个模型单独维护配置。你需要先拿到一个 API Key。登录官网后进入控制台在 API Keys 页面创建一个新 Key复制出来保存好后面写进config.toml。接口地址固定为https://taotoken.net/api注意这个地址不带任何查询参数直接作为base_url使用。注意Key 只显示一次创建后立刻复制。不要把它硬编码进提交到 Git 的脚本里用环境变量或本地配置文件承载。如果你还没决定用哪个模型可以先去模型对话页面手动试几条 RSS 正文看看摘要质量和速度是否符合预期再决定写进配置的模型名。对于长期跑的编码类或 Agent 类任务Coding Plan 的额度模型通常比按次调用更划算具体可以在控制台里对比。3. 可复制配置config.toml 与 settings.jsonSkill 的配置分两层config.toml管运行参数和 AI 通道settings.json管 RSS 源清单和输出行为。这样拆的好处是换模型只动 toml加订阅源只动 json互不干扰。先看config.toml[llm] base_url https://taotoken.net/api api_key sk-你的TaoToken密钥 model gpt-4o-mini temperature 0.2 max_tokens 600 timeout 30 [fetch] concurrency 5 request_timeout 12 retry_times 2 user_agent Mozilla/5.0 (compatible; RSSAggregatorSkill/1.0) [output] result_file aggregated_results.json max_articles_per_run 20 summary_language zh-CNbase_url指向 TaoToken 的 API 地址api_key填你刚创建的 Key。temperature设 0.2 是为了让摘要稳定不要每次跑出来风格差异太大。concurrency控制并发抓取数5 是个比较稳的值太高容易被源站限流。再看settings.json这里放 20 个 RSS 源{ sources: [ { name: Hacker News, url: https://hnrss.org/frontpage, category: Tech }, { name: Ars Technica, url: https://feeds.arstechnica.com/arstechnica/index, category: Tech }, { name: The Verge, url: https://www.theverge.com/rss/index.xml, category: Tech }, { name: TechCrunch, url: https://techcrunch.com/feed/, category: Business }, { name: InfoQ 中文, url: https://www.infoq.cn/feed, category: Backend }, { name: 阮一峰的网络日志, url: https://www.ruanyifeng.com/blog/atom.xml, category: Frontend }, { name: 酷 壳, url: https://coolshell.cn/feed, category: Backend }, { name: 少数派, url: https://sspai.com/feed, category: Product }, { name: 机器之心, url: https://www.jiqizhixin.com/rss, category: AI }, { name: 量子位, url: https://www.qbitai.com/feed, category: AI }, { name: GitHub Blog, url: https://github.blog/feed/, category: DevOps }, { name: Cloudflare Blog, url: https://blog.cloudflare.com/rss/, category: Security }, { name: AWS News, url: https://aws.amazon.com/blogs/aws/feed/, category: Cloud }, { name: Kubernetes Blog, url: https://kubernetes.io/feed.xml, category: DevOps }, { name: React Blog, url: https://react.dev/rss.xml, category: Frontend }, { name: Vue Blog, url: https://blog.vuejs.org/feed.rss, category: Frontend }, { name: Rust Blog, url: https://blog.rust-lang.org/feed.xml, category: Backend }, { name: Python Insider, url: https://pythoninsider.blogspot.com/feeds/posts/default, category: Backend }, { name: OpenAI Blog, url: https://openai.com/blog/rss.xml, category: AI }, { name: Hugging Face Blog, url: https://huggingface.co/blog/feed.xml, category: AI } ], dedup: { by_url: true, by_title_similarity: 0.9 } }这 20 个源覆盖了 AI、前后端、DevOps、安全、产品几个方向中英文都有。dedup段控制去重策略by_url是基础去重by_title_similarity用标题相似度挡掉不同源转载的同一篇文章。4. 抓取与摘要Skill 主流程代码配置就位后写 Skill 的执行逻辑。核心分三步并发拉取 RSS、用 Readability 提取正文、调用 TaoToken 生成中文摘要。下面这段代码可以直接放进rss_aggregator_skill.pyimport json import tomllib import feedparser import requests from concurrent.futures import ThreadPoolExecutor, as_completed from readability import Document from bs4 import BeautifulSoup from openai import OpenAI with open(config.toml, rb) as f: cfg tomllib.load(f) with open(settings.json, r, encodingutf-8) as f: settings json.load(f) client OpenAI( base_urlcfg[llm][base_url], api_keycfg[llm][api_key], ) HEADERS {User-Agent: cfg[fetch][user_agent]} def fetch_rss(source): try: resp requests.get(source[url], headersHEADERS, timeoutcfg[fetch][request_timeout]) resp.raise_for_status() feed feedparser.parse(resp.content) return source, feed.entries[:5] except Exception as e: print(f[RSS失败] {source[name]}: {e}) return source, [] def extract_content(url): try: resp requests.get(url, headersHEADERS, timeoutcfg[fetch][request_timeout]) resp.raise_for_status() doc Document(resp.text) soup BeautifulSoup(doc.summary(html_partialTrue), html.parser) text soup.get_text(separator\n, stripTrue) return text[:4000] except Exception as e: print(f[正文失败] {url}: {e}) return def summarize(title, content, source_name): prompt f你是技术内容编辑。请对下面文章输出严格 JSON不要 Markdown 代码块。 字段category从 AI/前端/后端/DevOps/安全/产品/其他 中选一个、 keywords3-5 个、summary150 字左右简体中文直击技术要点。 标题{title} 来源{source_name} 正文{content} try: resp client.chat.completions.create( modelcfg[llm][model], messages[{role: user, content: prompt}], temperaturecfg[llm][temperature], max_tokenscfg[llm][max_tokens], ) raw resp.choices[0].message.content.strip() if raw.startswith(): raw raw.strip().lstrip(json).strip() return json.loads(raw) except Exception as e: print(f[摘要失败] {title}: {e}) return {category: 其他, keywords: [], summary: 摘要生成失败}主流程把抓取和摘要串起来控制单次运行的文章数def run(): results [] with ThreadPoolExecutor(max_workerscfg[fetch][concurrency]) as pool: futures [pool.submit(fetch_rss, s) for s in settings[sources]] for fut in as_completed(futures): source, entries fut.result() for entry in entries: if len(results) cfg[output][max_articles_per_run]: break content extract_content(entry.link) if not content: continue meta summarize(entry.title, content, source[name]) results.append({ title: entry.title, source: source[name], url: entry.link, category: meta.get(category, 其他), keywords: meta.get(keywords, []), summary: meta.get(summary, ), }) with open(cfg[output][result_file], w, encodingutf-8) as f: json.dump(results, f, ensure_asciiFalse, indent2) print(f完成共 {len(results)} 篇) return results if __name__ __main__: run()这段代码里base_url和api_key全部从config.toml读取业务逻辑里没有任何硬编码的模型信息。想换模型改 toml 里一行model就行抓取和摘要代码不用动。5. 验证请求跑通并检查输出配置和代码都写好后先做一次小规模验证别一上来就跑满 20 个源。把settings.json里的sources临时只留 2 个max_articles_per_run改成 3然后执行python rss_aggregator_skill.py正常的话你会看到类似输出完成共 3 篇打开aggregated_results.json检查每条记录是否包含title、source、url、category、keywords、summary六个字段摘要是不是中文、有没有明显跑题。如果摘要字段是“摘要生成失败”说明 AI 通道没通先单独验证 Keycurl https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的密钥 \ -H Content-Type: application/json \ -d {model:gpt-4o-mini,messages:[{role:user,content:回复ok}]}返回里能看到choices字段就说明 Key 和地址都没问题。确认单源跑通后再把 20 个源恢复max_articles_per_run设回 20完整跑一次。第一次全量跑建议观察日志里有没有大量[RSS失败]或[正文失败]有的话按下一节的排查表处理。6. 本篇常见错排查跑这条流水线时报错基本集中在三类网络抓取、正文提取、AI 调用。下面这张表是我实际踩过的坑和对应处理方式。现象可能原因处理方式[RSS失败]大量出现源站限流或 URL 失效降低concurrency逐个 curl 验证 URL[正文失败]但 RSS 正常目标站反爬或正文在 JS 里换用该源的 RSS 全文或跳过该源摘要返回“生成失败”Key 错误或base_url写错用上面的 curl 单独验证通道摘要非中文Prompt 被截断检查max_tokens是否过小同一篇文章重复出现去重未生效确认dedup.by_url为 true检查 URL 是否带追踪参数运行很慢串行抓取或源站响应慢提高concurrency但别超过 8其中最常见的是base_url多写了/v1或少了/api。TaoToken 的接口地址是https://taotoken.net/apiSDK 会自动补全路径你不需要手动加/v1/chat/completions。如果摘要一直失败先去 API Keys 页面确认 Key 状态是否正常再检查config.toml里有没有多余空格。另一个容易忽略的点是readability对某些中文站点提取效果一般正文可能只剩标题。遇到这种情况可以在extract_content里加一个兜底如果提取出的文本长度小于 200 字就直接用 RSS 条目自带的summary字段作为正文虽然信息量少一点但至少能生成摘要。7. 下一步把 Skill 接进你的工作流跑通之后这个 Skill 可以按你的习惯接进不同环节。想每天定时跑用系统计划任务调用python rss_aggregator_skill.py即可想把结果推到手机读aggregated_results.json再调一个推送接口就行。如果你还想让 Agent 在编码时自动调用这个 Skill可以把脚本注册成 Codex 可发现的工具具体接入方式参考接入文档里的 Skill 注册章节。需要长期跑、文章量大的话建议在控制台里看一下 Coding Plan 的额度模型比单次调用更适合这种每天固定消耗的场景。模型选择上摘要任务用轻量模型就够把省下的额度留给更复杂的推理任务。配置骨架已经给全剩下的就是按你的订阅源清单替换settings.json然后让它自己跑起来。

相关新闻

昇腾Atlas 300V部署YOLOv5实战:模型转换与推理优化

昇腾Atlas 300V部署YOLOv5实战:模型转换与推理优化

1. Atlas到底是什么?先别急着把它当“显卡”我第一次接触Atlas 300V 24G时,第一反应也是打开它的规格表,试图跟手里的NVIDIA显卡做一一对应。核心数、频率、显存带宽、功耗……对着对着就发现不对劲,这东西压根不是按“显卡”的逻…

2026/9/25 13:04:35 阅读更多 →
实时无梯度手部重定向 SBR 算法详解|Smooth Operator 灵巧手遥操作复现指南(TaoToken 配置骨架)

实时无梯度手部重定向 SBR 算法详解|Smooth Operator 灵巧手遥操作复现指南(TaoToken 配置骨架)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 13:04:35 阅读更多 →
Blume 使用指南:用纯 Markdown 快速构建 AI 就绪的文档站点(TaoToken 配置篇)

Blume 使用指南:用纯 Markdown 快速构建 AI 就绪的文档站点(TaoToken 配置篇)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 13:04:35 阅读更多 →

最新新闻

Dart SDK 中的 Dart Development Service(DDS)实战指南:协议转发、SSE 通信与扩展 RPC 深度解析

Dart SDK 中的 Dart Development Service(DDS)实战指南:协议转发、SSE 通信与扩展 RPC 深度解析

编程语言编译器语言运行时标准库开发工具 【免费下载链接】sdk The Dart SDK, including the VM, JS and Wasm compilers, analysis, core libraries, and more. 项目地址: https://gitcode.com/gh_mirrors/sdk1/sdk 点击查看 免费下载 本篇指南以 Dart SDK 仓库中…

2026/9/25 13:46:09 阅读更多 →
为什么 TUI 正在回归:用 TaoToken 统一 Key 打通终端 AI 工作流

为什么 TUI 正在回归:用 TaoToken 统一 Key 打通终端 AI 工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 13:46:09 阅读更多 →
不联网、不注册,OpenClaw 2.7.9 配 TaoToken 自动化处理电脑任务(含安装包)

不联网、不注册,OpenClaw 2.7.9 配 TaoToken 自动化处理电脑任务(含安装包)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 13:46:09 阅读更多 →
通义千问核心能力与实战表现深度评测:从代码生成到长文档理解,TaoToken 统一 Key 接入实测

通义千问核心能力与实战表现深度评测:从代码生成到长文档理解,TaoToken 统一 Key 接入实测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 13:46:08 阅读更多 →
Atlas 300V 24G实战:昇腾推理卡部署YOLO全流程指南

Atlas 300V 24G实战:昇腾推理卡部署YOLO全流程指南

1. 先说结论:Atlas 300V 24G到底是什么卡最近后台好几个做视觉落地的朋友都在问同一个问题:Atlas 300V 24G是不是运算加速卡,能不能拿来部署YOLO。这问题其实暴露了不少人对昇腾产品线的困惑。我直接说结论:Atlas 300V 24G是华为昇…

2026/9/25 13:46:08 阅读更多 →
智能体记忆架构:从草稿笔记到组织级知识

智能体记忆架构:从草稿笔记到组织级知识

智能体记忆架构:从草稿笔记到组织级知识 原文来源:AIForBusiness | 人工智能 | 技术流程 作者:塞巴斯蒂安谢达尔(Sebastian Chedal) 文章目录智能体记忆架构:从草稿笔记到组织级知识为什么AI智能体不能只依…

2026/9/25 13:45:08 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →