需求由来:#
我很喜欢读博客。但发现总有些很有趣的博客等着发现。所以我关注了些推荐博客的频道。同时,我也想分享些自己喜欢的博客,但每次去手动复制又显得太麻烦了。所以就想着做一个自动化的方式,顺带着也可以学习下 Github Action.
历程#
- 大部分时间是花在了如何获取 opml 文件上。Tiny Tiny RSS 所给的文档较为精简,而网上相关的资料大都仅局限于如何部署。所以这一段只能是自己摸索。
- TinyTinyRSS 的网页版有给一个按钮能导出 OPML,而这个按钮所指向的网址是
http://example.com/tt-rss/backend.php?op=opml&method=export'
。但它是有个鉴权操作的。需要登录。 - 它的示例中有提供了一个登录的 api 调用,所以我开始的想法也是顺着这个来。想着直接添加 data 参数。但尝试了多种添加方式无果。
- 后来注意到登录成功是会返回 session 值的,于是先用 curl 试验了下。
# 登录并获取Session ID SESSION=$(curl -s -d '{"op":"login","user":"user","password":"password"}' http://example.com/tt-rss/api/ | python -c "import sys, json; print(json.load(sys.stdin)['content']['session_id'])") #获得opml文件 curl -o my_tiny_tiny_rss.opml 'http://example.com/tt-rss/backend.php?op=opml&method=export' --cookie "ttrss_sid=${SESSION}"
- 转写成 python 是用的 request。其实现在回头想想,这应该是蛮基础的操作,而且 session 之前也有接触过。如果早点想起来的话是可以少花些时间的。
- TinyTinyRSS 的网页版有给一个按钮能导出 OPML,而这个按钮所指向的网址是
- opml 的解析有现成的库,用就是了。
- 然后就是把一些个人信息抽出来写在配置文件中。这里踩了一个坑。
data = {'op': 'login', 'user': user, 'password': password}
, 我开始的时候是这样写的data = f"{{'op': 'login', 'user': {user}, 'password': {password}}}"
。后者虽然在形式上看着一样,但前者是 json 对象,后者是字符串。这里也给我提了个醒:Python 虽然有动态类型这个特性,但还是要注意类型错误。 - 最后是使用 Github Action。之前也有使用过,但是是直接用的别人写好的 workflow。所以也花了些时间学习了下。遇到的几个问题是
- Yml 文件的格式问题。这个可以用YAML Validator来检查。Vscode 应该也有相应的插件吧。
- 运行时需要用到的变量,是用的 secret。我之前以为 secret 的 value 只能是字符串。但Github Action 中 python 获取仓库的 secrets中提到,可以把一整个 yml 文件放在 value 里面。所以我就想那 json 文件应该也可以。试了下确实能行。这样我的代码需要修改的地方就很少了。
- workflow 的触发方式,要添加手动触发,需加上
workflow_dispatch:
学到的知识#
- pipe 和 python 的结合。下面这段是 ChatGPT 写的,太妙了。
SESSION=$(curl -s -d '{"op":"login","user":"user","password":"password"}' http://example.com/tt-rss/api/ | python -c "import sys, json; print(json.load(sys.stdin)['content']['session_id'])")
- Github Action 的使用
- python request
尾巴#
这个项目算是个很小的项目,但我还是花了半天的时间,而且是在 ChatGPT 的帮助下。之前看到这样一种说法,搜索引擎大幅降低了普通人获取知识的难度,而 ChatGPT 在此基础上更是降低了十分客观的一个量。结合自己这次的经历,我十分认同这个观点。通过我对背景的补充和提问,ChatGPT 让我省去了花费在各种教程和不完善的文档上所要消费的时间。这比搜索引擎所做到的交互要更自然。