需求由來:#
我很喜歡讀博客。但發現總有些很有趣的博客等著發現。所以我關注了些推薦博客的頻道。同時,我也想分享些自己喜歡的博客,但每次去手動複製又顯得太麻煩了。所以就想著做一個自動化的方式,順帶著也可以學習下 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 讓我省去了花費在各種教程和不完善的文檔上所要消費的時間。這比搜索引擎所做到的交互要更自然。