使用的工具
這部分因人而異,我們使用的工具如下
– Obsidian 作為背後的筆記軟體
– gitlab 作為筆記內容的備援與儲存庫
– bluehost 作為網站主機的平台
– gitlab CI/CD 作為筆記發表的手段
主軸會放在 gitlab CI/CD 跟 WordPress 的互動,其他部分可以依據喜好自由調整,像是 gitlab 可以改用 github action
你需要做的事
要完成簡單的自動化發表你只需要兩個步驟,我們會從開發的角度切入
先確認怎麼跟 WordPress 互動
想要透過外部對 WordPress 發文我們有兩個選項
– 使用 email 把文章寄上去
– 使用 REST API 把文章送上去
email 雖然是個方法,但卻不是我們的選擇,作為練習的一個環節我們會採用 REST API 來進行
你可以採用任何一種程式語言,只要他能夠對網站發起 REST API 的請求就可以,這邊我們選用了常見的 python
如果中間有遇到甚麼問題可以先參考官方網站提供的文件
Reference – REST API Handbook | Developer.WordPress.org
基本上在本地使用 python 腳本就可以簡單的實驗了
稍微有點經驗的都知道,我們想要對網站發起 REST API 是不能隨意亂發的,不然世界各地的人都可以使用你的網站進行發文,所以我們需要先拿到授權才能發文
應用程式密碼
你可以在 使用者 -> 個人資料 -> 應用程式密碼 中取得一串文字,這段文字的效用類似 token,你需要在使用 REST API 的時候將這串文字當作 token 來進行互動
測試發文
一個測試時你會需要用到的範本會長的像這樣
import requests
WP_URL = os.getenv("WP_URL") # WordPress 網址
WP_USER = os.getenv("WP_USER") # WordPress 使用者
WP_CREDENTIALS = os.getenv("WP_CREDENTIALS") # WordPress 應用程式密碼
end_point = f"{WP_URL}/posts"
header = {
"Authorization": f"{requests.auth._basic_auth_str(WP_USER, WP_CREDENTIALS)},
"Content-Type": "application/json",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36"
}
data = {
"title": "your_title",
"content": "your_content",
"status": "publish"
}
result = requests.post(end_point, header=header, json=data)
其中你需要設定的包含 網站的網址、網站的使用者、網站的應用程式碼,這些是跟網站有關的訊息
剩下的你需要設定好一個 request 需要的訊息包含 網站的認證、User-Agent、文章標題、文章本身、文章的發布狀態
需要注意的是 User-Agent 是需要的,chatGPT 不見得會在一開始就給你,但等到你自己發 REST API 的時候會發不進去
到這邊你會完成對網站的一個基本互動,當然你也可以先試用其他功能,不需要一開始就使用發文
其他的功能要參考 WordPress REST API document 了,基本上只要修改 end point 就可以使用其他功能
每個功能都會有他自己對應的參數可以使用,有些參數是必須的,有些參數是選用的,可以依照自己的需求進行調整
自動化你的互動
現在你有了測試用的腳本,並且你也在上面輸入了一些訊息
我們需要將整個流程自動化起來,這樣就不用自己手動執行腳本了
設定你手動輸入的訊息
從上面的腳本可以看到,你會需要手動輸入關於網站的一些訊息
你可以在 gitlab 的 Settings -> CI/CD -> Variables 裡面將你的訊息設定上去
這樣你執行腳本的時候 CI/CD 會自動幫你把環境變數設定好,腳本裡面就可以直接使用了
撰寫你的 gitlab-ci
這個步驟很簡單,就是單純的把鉤子掛上去,我們會盡量把所有的邏輯都收斂在你測試的那份腳本裡面,這邊只是負責呼叫而已,下面給出一個基本的範例
image: python:3.10
stages:
- deploy
word_press_posts:
stage: deploy
only:
- schedules # 透過 GitLab Schedule 來觸發
script:
- pip install requests
- python posts_content.py
你設定了一個 stage,並且將一份任務綁定在這個階段,這個階段會透過 schedules 的方式觸發,在觸發後會執行兩條命令,一條處理前置,一條觸發腳本
將這個個 yaml 命名為 .gitlab-ci.yml 放在你的儲存庫裡面就可以了,裡面還有很多設定可以調整,不過如果是簡單發文的話這樣就足夠了
設定觸發的時間
因為我們是設定排程器觸發,所以需要設定排程的時間,其他的觸發方式就需要設定其他的條件
排程器的話你可以在 Build -> Pipeline schedules 裡面新增,並依照 cron 的格式設定你的觸發時間
完成了之後
到這邊你就會有一個簡易功能的自動發文流程
其他可能還會需要,創建分類、創建標籤、文章更新 等等,這些都需要再研究文件,並依照自己的需求調整腳本
我想應該會有很多地方有現成的解決方案可以使用,是否需要這種自動化的流程還是要看個人需求
我們的需求願景有幾個重點
– 未來盡可能的提高網站的掌控度,有機會我們可以自己實作一部份,所以連接方式跟 gitlab 有關聯
– 文章要跟筆記軟體部分同步,用 Notion 或是 Obsidian 官方的做法,這兩種都可以實現一定程度的目標,但我們在筆記軟體上面是自由的,不能過度依賴特定方提供的解決方案
我們將重點放在文本身上,而不是平台上面的功能
如果想要平台上面的功能,我們一樣可以將文本送上平台,一樣可以使用平台的功能
你可以使用別人提供的功能或是整合性的工具,有時候這樣的選擇會讓你變得跟他一樣
你一定有很特別的想法,並且你跟他很可能會不一樣
我們是對差異性擁有期待,所以有時候會選擇較為不穩定,但具備更多可能性的方案
當然,依據需求而定,有時候我們也會想要簡單的處理問題,只求目的可以達到
但永遠要記住,創造好的正循環是打造價值的基礎,想想你需要甚麼