skip to content
Pure Ink

我的第一个开源工具 inkrss

/ 4 min read

inkrss是什么

inkrss是一个开源的工具,借助cloudflare免费的服务,实现了对RSS信息的主动获取

为什么做这个

有这个想法是在Telegram看到一些机器人,例如flowerss-bot。 学生阶段没有付费能力,我部署的许多服务都使用了CloudFlare Workers(一种Serverless服务),所以当cloudflare推出Cron Triggers(定时触发能力)与Workers KV(数据存储能力)时,就想到了开发这样一个服务。

有些小难点

  1. Workers KV限制每天写次数为1000,对比运行在Node上的程序,无服务器函数无法维护状态,强依赖数据存储。
  2. Workers限制单次运行http请求的次数,请求订阅源的次数受限。
  3. Workers限制单次CPU运行时间为10ms,无法做复杂的解析,如解析RSS订阅源XML格式的数据。

方案

流程上,用户输入RSS源的地址进行订阅,数据库中维护这样一个订阅源的数组。定时服务每分钟去查看订阅源是否更新,如果更新则通知给用户。

随机访问

用户可能订阅几十个信息源,但受限于单次网络请求次数,无法一次完成全部访问。而且无法将上次请求了哪些记录在数据库中,因为这样会超过KV的写次数。随机访问保证了每一个信息源都可以被访问到,代价是完成一次循环的周期变长。

更新判断

判断分为两步,第一步是看数据是否有变化,第二步看变化了哪里,找出更新的标题、url等信息。

rss信息源为xml格式的数据,一次运行需要查看许多订阅源,如果使用xml2json这样的库转成对象易于后续判断,但耗时太长,免费额度下的10ms完全不够用。

最终使用了简单的正则,匹配出列表的第一个标题,以此为标识判断是否更新。

各种兼容

基于xml,RSS有有RSS2.0、atom等不同规范,不同的格式需要做对应的处理。

标题匹配时发现有如下多种不同的格式,也需要做兼容

<title>example title</title>
<title type="html">example title</title>
<title><![CDATA[ example title ]]></title>

订阅和通知

开发了前端页面用于订阅信息源,同时也可使用telegram bot订阅。

判断更新后即可将最新的标题通知到用户,基于个人使用场景,支持了Telegram Bot、Bark、微信三种通知方式。 网页

感受

这是我第一个公开发布的项目,很幸运有用户使用、反馈、贡献代码。回头看是是个代码质量很低,还挺折腾的事情,仍然有许多没有考虑到的场景。

现在的我应该不会考虑使用免费的云函数去做服务。但当时还是充满热情,思考解决问题的办法。记得第一天发布得到50 Star还蛮开心的,怀念时间自由的大学时光,希望热情可以延续。