为博客编写一个RSS订阅功能

2017-02-18 14:56:41 Blog

有读者想要订阅我的博客,但我的博客程序是自己写的,当时并没有考虑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链接,完工。

如果长时间无法加载评论,请对 *.disqus.com 启用代理!