一般而言过滤RSS订阅内容都是RSS客户端阅读器的工作,但是有些比较特殊的客户端并不支持过滤——比如PT站常用的下载工具uTorrent等,而网站提供的RSS过滤参数可能无法满足我们的个性化需求,所以有时我们需要一些在线工具对RSS订阅源进行一次过滤,然后使用客户端订阅过滤后的结果。

事实上对于这种需求已经有很多现成的在线工具,比如siftrss,但是公开的服务又存在隐私问题,所以自建RSS过滤服务成了最好的选择。

本文介绍了一款在线过滤RSS订阅内容的PHP程序rss-filter-php,可以方便地部署在VPS或者虚拟主机上。

部署程序

毕竟是PHP,程序的部署相对简单,只需要下载程序对应的zip文件并上传到配置好的站点目录下即可,站点需启用PHP支持,并安装php_curl扩展。

为了提高安全性,所以一个必要的操作就是禁止访问配置文件所在的目录。对于Apache,Cpanel虚拟主机等等其他兼容多级.htaccess文件的站点程序,不需要进行任何配置,上传的文件中已经包含了所需的配置。

对于Nginx用户,则需要在站点对应的配置文件中添加如下内容:

location ^~ /config {
    deny all;
}

location ^~ /class {
    deny all;
}

配置完成之后访问指定url即可获取过滤后的订阅源,url格式为:

http://example.com/index.php?config=<配置文件名>

配置文件详解

配置文件需要放在config/目录下,以.xml为结尾。

配置文件中出现的匹配式是符合PCRE标准的正则表达式,利用PHP中的preg_match函数匹配。

配置文件的基本格式如下:

<config>
    <title>CnBeta过滤源</title>
    <ruleSet>
        <source>https://www.cnbeta.com/backend.php</source>
        <timeout>10</timeout>
        <userAgent>Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36</userAgent>
        <titleDuplicateRemove>false</titleDuplicateRemove>
        <linkDuplicateRemove>false</linkDuplicateRemove>
        <rules>
            <titleMatch>/Apple/si</titleMatch>
            <titleMatchNot>/iPad/si</titleMatchNot>
            <before>2018-12-31 23:59:59 +1200</before>
            <after>2020-12-31 23:59:59 +1200</after>
            <olderThan>30m</olderThan>
            <newerThan>1d</newerThan>
        </rules>
    </ruleSet>
</config>

虽然从各个配置名应该能看出一二,不过还是简单的介绍一下。

  • title
    • 最终输出的订阅源标题名
    • 仅能出现一次
  • ruleSet
    • 可以出现多次,匹配不同ruleSet的条目将会混合输出
  • source
    • 包含一个指向原始源的URL地址
    • 在一个ruleSet中可以出现多次
  • timeout
    • 读取原始源的超时时间
  • titleDuplicateRemove
    • 是否合并相同标题的条目
    • 默认设置为false
  • linkDuplicateRemove
    • 是否合并指向相同链接的条目
    • 默认设置为false
  • titleMatch
    • 匹配标题中出现指定内容的条目
    • 多个匹配之间是OR的关系,出现任何一个都会被匹配
  • titleMatchMust
    • 与titleMatch类似,但是与其他匹配之间是AND的关系,必须全都符合才能匹配
  • titleMatchNot
    • 丢弃标题中出现指定内容的条目
    • 只要符合任何一条titleMatchNot,就会立即丢弃条目
  • before
    • 匹配指定时间之前的内容
    • 指定时间需要能够被strtotime()函数解析
  • after
    • 匹配指定时间之后的内容
    • 指定时间需要能够被strtotime()函数解析
  • olderThan
    • 类似before,但是格式改为相对时间,如7d代表7天
      • s代表秒
      • m代表分
      • h代表小时
      • d代表天
  • newerThan
    • 类似after,其余同上。

防止被人社工或穷举入口目录

配置文件中本身没有对客户端进行鉴权的配置项,而且客户端功能上很可能也不支持验证。

一个可行的替代方案是重命名配置文件,添加一段随机生成的字符串来防止社工或穷举。

比如对于上文的配置文件cnbeta.xml可以改名为H2dKFVUciwJz8sm4IPYMl9R-cnbeta.xml,这样对应的url就变成了:

http://example.com/index.php?config=H2dKFVUciwJz8sm4IPYMl9R-cnbeta

本文由 sandtears 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

楼主残忍的关闭了评论