inkrss是什么
inkrss是一个开源的工具,借助cloudflare免费的服务,实现了对RSS信息的主动获取
为什么做这个
有这个想法是在Telegram看到一些机器人,例如flowerss-bot。 学生阶段没有付费能力,我部署的许多服务都使用了CloudFlare Workers(一种Serverless服务),所以当cloudflare推出Cron Triggers(定时触发能力)与Workers KV(数据存储能力)时,就想到了开发这样一个服务。
有些小难点
- Workers KV限制每天写次数为1000,对比运行在Node上的程序,无服务器函数无法维护状态,强依赖数据存储。
- Workers限制单次运行http请求的次数,请求订阅源的次数受限。
- Workers限制单次CPU运行时间为10ms,无法做复杂的解析,如解析RSS订阅源XML格式的数据。
方案
流程上,用户输入RSS源的地址进行订阅,数据库中维护这样一个订阅源的数组。定时服务每分钟去查看订阅源是否更新,如果更新则通知给用户。
随机访问
用户可能订阅几十个信息源,但受限于单次网络请求次数,无法一次完成全部访问。而且无法将上次请求了哪些记录在数据库中,因为这样会超过KV的写次数。随机访问保证了每一个信息源都可以被访问到,代价是完成一次循环的周期变长。
更新判断
判断分为两步,第一步是看数据是否有变化,第二步看变化了哪里,找出更新的标题、url等信息。
rss信息源为xml格式的数据,一次运行需要查看许多订阅源,如果使用xml2json这样的库转成对象易于后续判断,但耗时太长,免费额度下的10ms完全不够用。
最终使用了简单的正则,匹配出列表的第一个标题,以此为标识判断是否更新。
各种兼容
基于xml,RSS有有RSS2.0、atom等不同规范,不同的格式需要做对应的处理。
标题匹配时发现有如下多种不同的格式,也需要做兼容
订阅和通知
开发了前端页面用于订阅信息源,同时也可使用telegram bot订阅。
判断更新后即可将最新的标题通知到用户,基于个人使用场景,支持了Telegram Bot、Bark、微信三种通知方式。
感受
这是我第一个公开发布的项目,很幸运有用户使用、反馈、贡献代码。回头看是是个代码质量很低,还挺折腾的事情,仍然有许多没有考虑到的场景。
现在的我应该不会考虑使用免费的云函数去做服务。但当时还是充满热情,思考解决问题的办法。记得第一天发布得到50 Star还蛮开心的,怀念时间自由的大学时光,希望热情可以延续。