为博客编写一个RSS订阅功能
2017-02-18 14:56:41
有读者想要订阅我的博客,但我的博客程序是自己写的,当时并没有考虑RSS订阅功能,因为毕竟用RSS的人还是比较少的。但现在既然有需求,而且RSS也是博客必不可少的一个组成部分,所以干脆把这个功能做了出来。
事实上RSS功能做起来很简单,下面介绍一下应该如何编写。
观察
首先,查一下RSS的维基百科,我们知道了RSS目前主流的是2.0版本,并从中得到了这份官方说明文档,了解了RSS的主体结构。接下来就需要找点例子来照葫芦画瓢了。WordPress作为博客程序的龙头老大,首先要观察一下它是怎么写的。随便找个WordPress的博客,观察一下,比如这个。再找个别的RSS,比如这个百度新闻的RSS。有了这两个做参考基本上就没什么问题了。
分析
经过简单的观察和阅读文档,可以知道RSS的主要结构是这样的(以本博客为例):
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title><![CDATA[FanZheng's Blog]]></title>
<link>https://fanzheng.org/</link>
<description><![CDATA[FanZheng's Blog]]></description>
<lastBuildDate>博客生成时间</lastBuildDate>
<language>zh-CN</language>
<item>
<title>文章标题</title>
<link>https://fanzheng.org/archives/$id</link>
<comments>https://fanzheng.org/archives/$id#comments</comments>
<pubDate>文章发布时间</pubDate>
<category><![CDATA[分类或标签]]></category>
<guid isPermaLink="false">https://fanzheng.org/archives/$id</guid>
<description><![CDATA[文章摘要]]></description>
<content:encoded><![CDATA[文章内容]]></content:encoded>
</item>
</channel>
</rss>
简单解释一下。首先,RSS是一个xml文档。
- 这个xml引入了一个名为content的命名空间,以便在RSS中提供文章的完整内容(使用
<content:encoded>
标签),RSS本身不提供这个功能,而只有描述(或摘要)。 - 为防止内容被当成xml解析,xml使用
<![CDATA[]]>
将内容括起来,以便保护内容。 - 按照标准RSS中所有的时间都遵循RFC822规范,所以
<lastBuildDate>
和<pubDate>
都需要使用RFC822格式的时间,实际上使用RFC2822和一些其他的时间表示方法也是可以的。WordPress用的是RFC2822所以我用的也是它。例如Sun, 12 Feb 2017 11:25:52 +0800
。 - 一个
<item>
即为一篇文章,博客的RSS一般提供10篇文章,因此我们需要输出10个<item>
。 - 一篇文章可以有多个
<category>
。 - 其他的链接性的东西根据实际情况修改即可。
开工
之前是用C++写的博客程序,再用C++写这种功能效率实在是太低了,尤其是时间转换这种东西。所以我用PHP单独写了这个功能。
读取最近10篇文章的信息,按照格式输出xml即可,非常简单。
最后在主页上加一个RSS链接,完工。