! 本篇文章將會介紹為什麼我讓 Agent 替我寫鐵人賽,期望大家都能把「每天都要記得做的事」交給系統,把自己解放出來 :D
先自首:你現在讀的這篇文章,不是我坐在電腦前一個字一個字打出來的。它是今天傍晚 19:00,由我 Mac 上的一個 launchd 排程叫起 opencode agent,讀完 30 天大綱與寫作規則後生成;20:00 再由另一支腳本操縱瀏覽器,自己走完 iT 邦幫忙的發文流程。而我在做什麼?可能在外面吃飯,可能在家耍廢。
這就是本系列的主題:自我耍廢組——我耍廢,Agent 完賽。
讀完這篇你會學到:
本系列的實作環境長這樣,之後 29 天都以此為準:
整個系統就是一個資料夾,住在 /Users/benben/ai/automations/ironman/:
ls /Users/benben/ai/automations/ironman
# config.sh # 唯一需要動的設定檔:開賽日、模式、時間、tag
# outline.md # 30 天大綱(唯一事實來源)
# prompts/generate.md # 給 agent 的寫作規則
# templates/ # 文章結構模板
# scripts/generate.sh # 每日 19:00 生成文章
# scripts/publish.sh # 每日 20:00 自動發文
# articles/ # 生成產出(你正在讀的這篇就在裡面)
# fallback/ # 三篇保命通用備稿
鐵人賽的規則很殘忍:連續 30 天發文,斷更一天就淘汰。每年都有人前十天意氣風發,第二週開始藉口變多,然後在某個加班的夜晚默默消失。
問題的本質通常不是「不會寫」,而是連續 30 天的「記得」。這件事對人類是意志力考驗,對排程器卻是本能。所以我的策略很簡單:把「想題目 → 寫文章 → 記得發文」整條鏈交給機器,人只負責兩件事——事先把 30 天大綱想好,以及系統出錯時跳出來救火。
先講結論:outline.md 裡的 30 個標題與摘要是我寫的,其餘每一篇的正文都是 agent 生成的。我自己也會讀,讀到怪的地方會修——但那是「審稿」,不是「寫作」,負擔差非常多。說白了,這個系列真正想證明的是:把意志力留給真正需要判斷的事,例行公事就交給你親手搭的系統。而「親手搭」這三個字很重要——你不自己走一遍,就不會知道中間藏了多少坑,這也是我把每一個坑都寫成文章的原因。
整條管線長這樣:
launchd (19:00) → generate.sh → opencode run 讀 outline.md 生成 → articles/
launchd (20:00) → publish.sh → agent-browser 操作 iThelp 發文頁
→ 截圖存證 → Discord 回報
每天 19:00,launchd 準時叫起 generate.sh。它算出今天是第幾天,從 outline.md 抓出當天的標題與摘要,組好 prompt 後交給 opencode run——無人值守模式的 agent。生成失敗不是世界末日:腳本會重試兩次,再不行就啟用 fallback/ 裡的通用備稿,同時發 Discord 告警叫我回去擦屁股。
20:00 換 publish.sh 上場。它找到當天文章,剝掉 frontmatter,用 agent-browser 開 iT 邦幫忙的鐵人賽發文頁,填標題、貼內文、選 tag,按下「發表文章」,截圖存證並回報文章連結。
想親眼看看這兩位員工上班的樣子,可以手動觸發:
# 手動跑某一天的生成(不影響排程)
IRONMAN_DAY=1 ./scripts/generate.sh
# 確認 launchd 排程健在
launchctl list | grep ironman
# ---- 輸出範例 ----
# 0 0 me.benben.ironman.generate
# 0 0 me.benben.ironman.publish
小小小測驗:你知道 macOS 的 launchd 排程如果因為 Mac 睡著而錯過觸發時間,它的「補跑」行為和 cron 有什麼不同嗎?猜錯沒關係,這題是第 9 天的主菜 :D
這個系列最好玩的地方在於:**文章講的,就是產出這篇文章的系統。**每一天的內容,都是把管線的某一段拆開來檢視——
換句話說,如果某天的文章內容怪怪的,你看到的就是系統當下的真實狀態——這比任何 demo 都誠實。更有趣的觀察方式是:把這 30 天當成一場慢直播。你會看到它成功,也可能看到它失敗、重試、啟用備稿;每一種狀況發生時,Discord 那端收到的告警長什麼樣、logs/ 裡留下什麼痕跡,我都會攤開來講。自動化系統最怕的不是出錯,而是出錯了沒人知道——所以這個系列從第一天就把「可觀測性」當成一級公民。
Q:讓 Agent 自動發文,它亂寫怎麼辦?我不怕斷更,怕丟臉丟到全網?
A:兩道保險。第一,寫作規則與結構模板分別寫死在 prompts/ 與 templates/ 裡,agent 是「按劇本演」而不是自由發揮;第二,config.sh 有 MODE 開關,dry-run 模式只存草稿不發佈——正式開賽前我全程用 dry-run 跑了好幾輪才切到 live。
Q:launchd 觸發時總是說找不到 opencode 指令?
A:經典坑。launchd 啟動行程時不會載入 .zshrc,所以 nvm 裝的 node 與 opencode 通通不在 PATH 裡。解法是在腳本開頭手動 export PATH(generate.sh 的前幾行就是做這件事)。完整來龍去脈留在第 11 天。
Q:自動發文為什麼要開一個「有畫面」的瀏覽器?headless 不是更優雅?
A:我原本也這麼想,直到被現實教育:iThelp 伺服器端會直接擋 headless,而且送出前還有 Cloudflare Turnstile 驗證。最後的解法是真 Chrome 加上反偵測參數與 stealth script 的組合拳,這套是第三週的重頭戲。
generate.sh 生成(重試+備稿+告警)→ 20:00 publish.sh 用 agent-browser 發文(截圖存證)下一篇我們要介紹「五分鐘安裝 opencode:打造你的 AI 指揮台」,從零安裝 opencode、登入、跑起第一個對話,並搞懂 CLI agent 與 IDE agent 的差異,敬請期待!
參考資料:
有任何疑問但沒有 iT 邦幫忙帳號,或是想匿名提問?
歡迎到 https://dev.benben.me/q/Z5442T 提問或加油打氣,沒意外的話會在完賽之後一起回答 :D