目录
首页 » 博客 » 脚本详解:generate-rss.ps1 [切换主题] [English]

脚本详解:generate-rss.ps1

RSS 2.0 · XML 转义 · 纯文本摘要


RSS 是什么,为什么要提供

RSS(Really Simple Syndication)诞生于 1999 年,是一个内容订阅协议。它用 XML 描述一个"频道"和其中的"条目",阅读器定期拉取这个 XML,发现有新条目就通知你。不需要算法推荐,不需要注册账号,你订阅,你收到。

在 2026 年的今天,大多数内容被锁在封闭平台里,RSS 更显得珍贵。一个 90s 风格的网站提供 RSS,既是功能需要,也是精神上的契合——RSS 本身就是那个时代的产物。

generate-rss.ps1 的代码量是五个脚本中最少的(约 108 行), 但它实现了一个完整的 RSS 2.0 生成器:XML 转义、标题提取、纯文本化、GUID 管理,每一步都很直接。

RSS 2.0 的结构

RSS 2.0 的核心是一个 <channel>(频道)包含多个 <item>(条目)。频道描述网站基本信息(标题、链接、语言),每个条目对应一篇文章(标题、链接、摘要、GUID、发布日期)。

本站选择了 RSS 2.0 而非 Atom(2005 年的替代标准),因为 RSS 2.0 最简单, 在播客和传统博客中最为普及,兼容的阅读器也最多。

XML 转义:五个必须处理的字符

生成 XML 的第一步是确保文章内容不会破坏 XML 结构。脚本定义了一个 Escape-Xml 函数,把五个特殊字符替换为 XML 实体:&&<<>>""''

虽然 XML 1.0 规范只强制要求转义 <&,但转义全部五个字符是更安全的做法,尤其在属性值中。& 必须最先替换,否则会破坏后续已经转义的实体——这是一个常见的坑。

发布日期推导

RSS 的 pubDate 使用 RFC 2822 格式(如 Mon, 28 Apr 2026 12:00:00 GMT)。脚本用了一个三层回退机制来推导日期:

  • 第一层:从文章标题提取年-月-日(如"2026年4月28日")
  • 第二层:从标题提取年-月(如"2026年4月"),默认为当月 1 日
  • 第三层:使用文件修改时间作为兜底
  • PowerShell 的 DateTime.ToString('R') 正好输出 RFC 2822 格式, 不需要手动拼字符串。

    纯文本摘要

    RSS 的 <description> 字段在脚本中使用纯文本而非 HTML。 虽然 RSS 支持用 <![CDATA[]]> 包裹 HTML 内容,但并非所有阅读器 都能正确渲染——尤其是老式阅读器和命令行 RSS 工具。

    生成摘要的流程是三步清洗:正则去标签 → 替换   → 压缩连续空白。最终取前 200 个字符,既能展示足够的预览,又不至于让 RSS 文件过大。

    GUID 与已知限制

    每篇文章用页面路径作为 GUID(isPermaLink="false")。 RSS 阅读器通过 GUID 判断一篇文章是否已经读过——如果文章 slug 变更, 阅读器会将其视为新文章,这通常是期望的行为。

    当前版本有一些可以改进的地方:只扫描中文博客目录(英文文章需要单独生成 RSS)、lastBuildDate 使用脚本运行时间而非最新文章发布时间(会导致每次构建都更新,即使没有新内容)。这些都是"第二版"的待办事项。

    为什么这个脚本值得存在

    在 2026 年,一个只有 108 行的 PowerShell 脚本做的事情,很多平台用一整支工程团队来实现。 RSS 不是前沿技术,但它代表了一个重要的理念——开放标准优于封闭平台,用户拥有自己的订阅列表,不受任何公司控制。

    这个网站的每篇文章都出现在 RSS 里,不需要登录、不需要付费、不需要接受推荐算法。把它加到你的阅读器里,就能知道什么时候有新文章了。和 1999 年一样。


    « 脚本详解:generate-archive.ps1 « 返回主页 脚本详解:generate-sitemap.ps1 »


    资源许可 · © 2004-2026 DragonRSTER · 最后更新于 2026年05月05日 22:35:34