很久之前一直想为开源社区做贡献,但无奈没有合适的项目,而且很多时候自己太菜,看不太懂,完全不知道从何下手。直到最近,花了点时间,给 RSSHub 写了个路由,提了 PR,缝缝补补,最后终于被合并了。
1. 起因
从去年了解到 RSS 这个概念后,我就一直在用 RSS 阅读器。有人"RSS 最终只是少数人的狂欢"。确实,这是一项很老的技术了,现在用的人很少。在 RSS 流行的年代,社交媒体平台尚未成为主流,大家获取信息的方式主要依赖于直接访问网站或使用 RSS 阅读器。而现在不同了,现在的网站做的越来越好,社交媒体的推荐算法也更能留住用户,内容的发现和获取也变得更加直观,许多网站也不再提供 RSS 订阅,RSS 流行度便一直衰退。
然而,管理的自己的信息流是一种权利,这句话概括了 RSS 的魅力也正是我使用 RSS 的原因。

喜欢 RSS 的用户是因为特立独行吗?当然不是。
于我而言,首先,在这个算法无处不在的时代,我不想被算法裹挟,我希望能够减少一些花费在算法推荐给我的内容上的时间。而且 RSS 订阅加上友好的 RSS 阅读器可以作为一个 All-In-One 的信息收集器,这让我不用一个个收藏我想看的博客,每次想看再去密密麻麻的收藏夹翻,也不用猜它们是否更新。不仅是文字内容,各种其他媒体内容支持渲染也都很不错。
当然,我肯定不可能完全放弃算法推荐的内容,我也会经常去各个网站上浏览,这两者并不冲突。
如果说算法推荐的内容是一个根据真实的你制造的信息茧房,那 RSS 订阅内容可以认为是一个你自己搭建的"信息茧房" ,有时这个信息茧房过于理想化,我总认为自己 RSS 订阅的内容中知识信息的比重应该比娱乐的比重高,但是每次看着 99+的未读数,我总会觉得有些累。这是一个我根据理想中的自己应该喜欢的内容而搭建的信息茧房,实际上我没有那么多精力去消化,99+就不管了。

以上可以看出是我自己的问题。
2. 犹豫和尝试
用了很长一段时间后,直到 Follow 发布内测版,我开始想我也许也能为这个生态贡献点代码。于是,在一个深夜,我打开了我收藏的 NSFW 的网站,正当我欣赏的时候,我突然想到我或许可以写个路由来用 RSSHub 获取这个网站的更新?我也不知道,那试试吧。我找到 RSSHub 的文档,按照上面的步骤,它教我写一个路由,我几乎是照抄式的写,一边写一边问 AI。这实在是新领域,我很多时候都不知道自己在写什么。最后糊完了,跑不起来,要么是看不懂的 bug 要么就是不知从何下手的 403。总之,我在多次询问 AI 无果之后,放弃了,睡觉去了。我觉得自己太菜,还得学。
3. 闪光
是 ChatGPT 的闪光时刻,不是我 😭
又是一个深夜,我还是打开网站,想着我现在应该能看懂一些了,于是试着写写。由于上次的代码懒得保存直接删了,这次从头开始看文档,跟着写。发送请求,从响应的 HTML 结构中提取需要的数据,然后返回,大致就这么简单,过程中还是一直靠 AI 的补全完成了速成了一下语法和框架用法,一些之前报错的符号也能看懂了,都靠 AI 解决了。最后跑起来试试看,首页没有问题,然后访问一下我的路由。好的,403🤡。接着又折腾了半个小时?(不记得了) AI 解决不了,睡觉。
第二天下午,我比较闲,打开 vscode,再试试看。这次真得感谢 ChatGPT 了,它告诉我用 puppeteer 模拟用户请求来避免 403,虽然我完全不懂这个 p7r(原谅我懒得打字,学的 k8s)。经过一番折腾,在它给出代码后,我复制粘贴,等待项目加载和请求响应,几秒钟之后我看到了返回的 RSS 订阅数据,我高兴坏了,总算是修好了。接着我仔细检查了一下这个文件,感觉没问题,格式化一下代码然后休息,到晚上提一个 PR 试试。
之后我小心翼翼的写好 PR 的描述,填好模版,等 CI 跑完,一直等,跑的实在是太久了,这种感觉跟力扣交题一样,紧张死了,跑一半收到邮件说有些测试超时取消了,一看 GitHub Actions,CI 还在跑。好在最后终于跑完了,CI 通过了,我高兴的像个孩子立刻截了个图到处发,跟朋友们炫耀我给开源项目提 PR 了。

4. 反馈和进步
第二天还没有人 review 我代码,我好着急,只能等了。但后来我又发现有个地方要改(具体是啥忘了),然后我改完 rebase 了一下,结果发现我的提交记录加上了好多其他人的还没有被合并的提交,我慌了,这不是把别人的 commit 算到我头上了?这也太尴尬了吧,我关掉了这个 PR,然后重新开了一个,期间又向 ChatGPT 请教了一下 GitHub 多人合作开发的规范工作流,使劲追着问,最后整理出了一份算是简单的规范流程笔记吧。然后我重新开了一个 PR,依然是等 CI 然后等 review,我看到我第一 PR 之后有人等提交已经被合并了,我更急了。
后来不记得什么时候了,有人 review 了我的代码,指出了好几处错误:包的引入,UA,返回的结果字段无效,puppeteer 的使用等,前几个都问题不大,是因为我没仔细看规范文档 😢,最后 puppeteer,他说不需要用,使用项目配置的 UA 就能通过。我有点不太明白,改了前面的,commit 了一次。后来他再次加粗指出不需要用 puppeteer,我这才去改。我一直以为不用就一直无法访问,后来的调试过程中发现说我使用的 UA 是异步赋值的,所以请求时为空。难怪呢,改过来之后把 puppeteer 换成了 ofetch,重新测试路由,看到能够返回 RSS 订阅的 XML 格式数据!太好了,总算是解决了 403。


Review 我代码的人真的太贴心了,全都告诉我该怎么做了,就差直接帮我写了 🥹。
第二天早上醒来收到邮件,我的 PR 被合并了。哇,效率真高!

现在看来,我写的还是个简单的路由,也没多大工作量,但也是我第一给开源项目交代码(虽然之前也给别的项目修过 typo),还是很开心的。
以上就是我的第一次开源经历。在此之前我一直不知道怎么参与开源项目,在网上到处搜,看各种的分享,还是不会,但学到了一点:
"想要参与开源项目,首先成为这个项目/产品的用户。"
今天发现之前的代码有点问题,图片不加载 🤡,又改了一下。