RSS链接其实在去年年底就已经上线,但开发过程一直没有记录。这几天修了一个链接bug并添加了一些悬停说明,趁这个机会补充一下忘记的笔记。
关于RSS
简而言之,RSS(RDF Site Summary or Really Simple Syndication)可以理解为一种格式(format),由网站提供给订阅者,便于订阅者订阅这个网站的更新信息。RSS这一套机制和现在平台常用的主动推送机制大相径庭,用户是主动订阅想要接收的消息并接受RSS软件的更新推送。
这里不是要给主动/被动推送分个高下——对于个人博客网站来说,一个现实问题是存放在自己的网址中,读者很难有耐心每天专门点进博客主页查看是否有更新。所以提供一个方便订阅软件/服务检测帖子更新的RSS链接,显然更容易让读者注意到。
本文主要有两个目的,一是记录如何创建博客网站的RSS,另一个就是分享一下我如何订阅其他博主的RSS链接。
创建网站RSS链接
一般网站提供的RSS链接,点击进入后可以看到一份xml文件,例如:
text复制代码
1<?xml version="1.0" encoding="utf-8"?> 2<feed xmlns="http://www.w3.org/2005/Atom"> 3 <id>https://blog.palemoons.tech</id> 4 <title>Palemoons' Archive</title> 5 <updated>2025-04-15T16:40:16.171Z</updated> 6 <generator>https://github.com/jpmonette/feed</generator> 7 <link rel="alternate" href="https://blog.palemoons.tech"/> 8 <subtitle>Palemoons' personal website</subtitle> 9 <icon>chttps://blog.palemoons.tech/favicon.ico</icon> 10 <rights>All rights reserved 2025, Palemoons</rights> 11 <entry> 12 <title type="html"><![CDATA[TeamSpeak3服务器部署]]></title> 13 <id>https://blog.palemoons.tech/8b6e3f6c</id> 14 <link href="https://blog.palemoons.tech/8b6e3f6c"/> 15 <updated>2025-03-31T00:00:00.000Z</updated> 16 </entry> 17 <entry> 18 ... 19 </entry> 20 ... 21</feed>
RSS订阅软件定时解析这份文件,发现更新后就会推送新文章的相关信息,这个就是RSS订阅的实质。
所以,我们需要创建一个route,当用户访问时响应该文件。我选择放在了/feed
这个路由下,也就是https://blog.palemoons.tech/feed:
ts复制代码1// code of /src/app/route/feed/route.ts
2import { Feed } from "feed";
3import { getSortedPosts } from "@/lib/posts";
4import { IPostHeader } from "@/interfaces/Post";
5
6export async function GET() {
7 const posts: Array<{ key: string; value: IPostHeader }> = getSortedPosts();
8 const feed = new Feed({
9 title: "site title",
10 description: "site description",
11 link: "site url",
12 id: "site id",
13 copyright: "All rights reserved ...",
14 language: "zh-CN",
15 updated: "update time",
16 });
17
18 posts.forEach(({ key: abbrlink, value: post }) => {
19 feed.addItem({
20 title: post.title,
21 id: post.id,
22 link: post.url,
23 description: post.description,
24 date: post.time,
25 });
26 });
27
28 return new Response(feed.atom1(), {
29 headers: {
30 "Content-Type": "application/atom+xml; charset=utf-8",
31 },
32 });
33}
上述代码做了两件事:
- 利用
feed
库声明了一个新的Feed对象feed
,设定了订阅基本信息(如网站标题、描述、url等),接着讲每篇文章的订阅信息添加进feed
中。 - 定义该route的响应内容
feed.atom1()
以及header。
尴尬的是由于GitHub Pages不支持手动更改响应头,在实际部署中点击RSS链接后的响应方式变成了下载xml文件,但并不影响订阅软件添加订阅链接后解析文件。也基于这个毛病,我在网站的footer中实现了个点击复制链接的功能,方便读者直接用链接订阅。
我的RSS订阅方式
由于我的目的只是想要有一个服务能统一提醒我关注的博主发布了新文章,并不需要在一个单独的阅读器里阅读。一番查找后我选择直接在telegram上订阅了一个rss bot(@playrss_bot),利用telegram的推送提醒更新。不需要新软件,看到合适的博客直接添加rss链接即可,对我来说是最方便的方案了。

说句题外话,我订阅的不少作者都是当初在论坛里推广自己的博客被我发现的,遗憾的是往往更新几个月后,这些作者就没了后续,有的连证书都过期了。希望自己还算有些热情,不要重蹈覆辙吧。