使用的工具

這部分因人而異,我們使用的工具如下
– 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 官方的做法,這兩種都可以實現一定程度的目標,但我們在筆記軟體上面是自由的,不能過度依賴特定方提供的解決方案

我們將重點放在文本身上,而不是平台上面的功能
如果想要平台上面的功能,我們一樣可以將文本送上平台,一樣可以使用平台的功能

你可以使用別人提供的功能或是整合性的工具,有時候這樣的選擇會讓你變得跟他一樣
你一定有很特別的想法,並且你跟他很可能會不一樣
我們是對差異性擁有期待,所以有時候會選擇較為不穩定,但具備更多可能性的方案
當然,依據需求而定,有時候我們也會想要簡單的處理問題,只求目的可以達到

但永遠要記住,創造好的正循環是打造價值的基礎,想想你需要甚麼

最後修改日期: 2025-03-10