十二毫升的爱丽丝 - 过滤
type: channel
link: https://blog.sandtears.com/tag/%E8%BF%87%E6%BB%A4/
items: 一个在线过滤RSS订阅内容的PHP程序

一个在线过滤RSS订阅内容的PHP程序
type: item
date: 2019-04-28T16:04:00+00:00
description: 一般而言过滤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函数匹配。 配置文件的基本格式如下： CnBeta过滤源 https://www.cnbeta.com/backend.php 10 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 false false /Apple/si /iPad/si 2018-12-31 23:59:59 +1200 2020-12-31 23:59:59 +1200 30m 1d 虽然从各个配置名应该能看出一二，不过还是简单的介绍一下。 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