commit 94274abdcf5f2fbe08e0ceb49ae1dfd0d89f0801 Author: 依瑪貓 Date: Mon Jun 8 19:26:06 2026 +0800 Initial commit. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ad6547d --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +# The Wikimedia Taiwan Internation Brief Generator. +# Copyright 2026 imacat. All rights reserved. +# Authors: +# imacat@mail.imacat.idv.tw (imacat), 2026/6/8 + +.DS_Store +.idea +.claude + +excludes diff --git a/README.md b/README.md new file mode 100644 index 0000000..2ff3da4 --- /dev/null +++ b/README.md @@ -0,0 +1,60 @@ +# 維基國際短訊 自動化 + +每週自動產生維基媒體運動「國際短訊」,用本機 `mail` 寄給秘書長過目、篩選後採用至月訊。 +台灣維基媒體協會用。 + +短訊的**產生規則**(來源、挑選、翻譯、格式、收件人、寄送方式)全部寫在 `wmtw-briefs.md`, +本文件不重複,只談簡介、部署與維護。 + +運作方式:cron 每週觸發一次 Claude Code headless(`claude -p`),把 `wmtw-briefs.md` 當提示 +餵進去,它讀 wikimedia-l 過去七天內容、產繁中純文字短訊、用本機 `mail` 寄出,全程無人工介入。 +用訂閱登入憑證執行,不另計付費 API。 + +## 部署 + +### 前置需求 + +執行 cron 的主機需具備: + +- **Claude Code CLI**,且已用會員帳號 `/login` 過(headless 才有訂閱憑證、不另計費); + cron 須掛在這個已登入的使用者底下。 +- **本機 mail**(如 exim4/sendmail,免 SMTP 認證即可送出)。 +- **locale `zh_TW.UTF-8`**(中文主旨與內文才正常)。 + +### 步驟 + +部署位置(系統路徑、crontab)為固定處所,以下用絕對路徑;其餘指涉本專案檔案處皆用相對路徑。 + +1. 把指示檔放到系統位置: + + ``` + sudo cp wmtw-briefs.md /etc/wmtw-briefs.md + ``` + +2. 找出 claude 執行檔的完整路徑(cron 的 PATH 很精簡,必須寫完整路徑): + + ``` + command -v claude + ``` + +3. 在**已登入會員帳號的使用者**底下 `crontab -e`,加入下列一行 + (把 `` 換成上一步結果): + + ``` + 0 18 * * 1 -p "$(cat /etc/wmtw-briefs.md)" --allowedTools WebFetch Bash >> /tmp/wmtw-briefs.log 2>&1 + ``` + + - `0 18 * * 1`:每週一 18:00,可自行調整時段。 + - headless 放行的工具:`WebFetch`、`Bash`。 + - 收件人寫在 `/etc/wmtw-briefs.md` 裡,不在 crontab。 + +## 維護 + +- **改產生規則或收件人**:編輯部署後的 `/etc/wmtw-briefs.md`,不必動 crontab。 +- **沒收到信**:查 crontab 導向的 log;確認郵件佇列沒卡(`mailq`); + 確認 claude 訂閱憑證未過期(在該使用者底下重跑互動式 `claude`,若要求重新登入即為過期)。 +- **中文亂碼**:檢查 crontab 那行有沒有帶 `LANG=zh_TW.UTF-8`。 +- **內容偏少**:wikimedia-l 某些週本來就稀疏,指示檔已交代據實產短、不硬湊,屬正常。 +- **上線前測試**:複製一份指示檔、把收件人改成自己(勿寄秘書長),手動跑 + ` -p "$(cat <測試指示檔>)" --allowedTools WebFetch Bash`, + 確認中文、純文字排版與內容無誤後再正式啟用。 diff --git a/config.example b/config.example new file mode 100644 index 0000000..064fe40 --- /dev/null +++ b/config.example @@ -0,0 +1,16 @@ +# Wikimedia Taiwan International Brief Generator +# Copyright 2026 imacat. All rights reserved. +# Authors: +# imacat@wikimedia.tw (imacat), 2026/6/10 + +# The configuration example for the International Brief Generator. +# Install this file as config in the /etc/wmtw-briefs directory. +# +# sudo mkdir -p /etc/wmtw-briefs +# sudo cp config.example /etc/wmtw-briefs/config +# + +# The recipients. +TO=recipient1@wikimedia.tw,recipient2@wikimedia.tw +# The CC recipients. +CC=cc1@wikimedia.tw,cc2@wikimedia.tw diff --git a/instruction.md b/instruction.md new file mode 100644 index 0000000..5bca6aa --- /dev/null +++ b/instruction.md @@ -0,0 +1,87 @@ +# 維基國際短訊(國際短訊)週度產生器 + +讀 wikimedia-l 郵件論壇過去七天的內容,挑出值得入訊者,譯成繁體中文純文字, +用本機 `mail` 寄給秘書長。秘書長過目、篩選後採用至月訊。 +**唯一來源是 wikimedia-l,不要 WebSearch、也不要抓其他網站。** +全程自動執行到「寄出」為止,不要中途停下來問問題。 + +## 步驟一:時間範圍 + +每週執行,蒐集過去七天有活動的討論串。短訊標題用當週日期範圍,例如「2026/6/1–6/7」。 + +## 步驟二:來源——wikimedia-l 封存頁(HyperKitty 網頁,用 WebFetch 讀) + +- 最近活動(優先): + `https://lists.wikimedia.org/hyperkitty/list/wikimedia-l@lists.wikimedia.org/latest` +- 當月封存(月份不補零,如 6 月為 `/6/`): + `https://lists.wikimedia.org/hyperkitty/list/wikimedia-l@lists.wikimedia.org/{YYYY}/{M}/` +- 執行日落在月初七天內時,一併抓上個月封存頁以涵蓋滿七天。 + +做法:先列出過去七天有活動的討論串(主旨、日期、連結),再對相關者開其討論串頁 +(`.../thread//`)讀內文取得細節與日期。 + +## 步驟三:挑選(以維基會議與期程為主) + +從討論串中挑出會議與活動消息,目標約 8–15 則。每則盡量蒐齊**期程**: +會議日期、地點;補助/獎學金、投稿/提案、報名等各截止日;以及本週(這七天)的新進展。 + +三個範圍維度盡量都照顧(以清單實際有的內容為準): +- **全球性**:Wikimania、Wikimedia Summit、全球徵件與補助等。 +- **地區性(ESEAP)**:ESEAP Conference/Summit、區域內各國活動與徵件。 +- **主題性**:Wikidata、WikiWomen(Women in Red 等)、Wikimedia LGBT+(Wiki Loves Pride 等),及其他維基計畫。 + +各範圍、各則同等重要,不分優先高低。 + +已截止的期程,除非會議本身仍將舉行且具參考價值,否則略過或註明「已截止」; +但務必確保**即將截止**的期程被列出。若該週清單幾乎沒有會議內容,就據實產一份簡短短訊 +說明「本週無重要會議期程消息」,可摘一兩則受關注的討論,不要硬湊。 + +## 步驟四:翻譯與用語 + +全部譯成**繁體中文、台灣用語**;多語內容一律譯為中文。日期一律寫清楚(年/月/日), +不用「下週」「月底」這類相對說法。 + +避免中國大陸用語:軟體(非軟件)、行動(非移動)、應用程式/App、社群(非社區)、 +使用者(非用戶)、專案/計畫(非項目)、資訊(非信息)、影片(非視頻)。 +專有名詞:維基媒體基金會/維基百科/維基數據(Wikidata)/維基共享資源(Commons)等; +Wikimania、ESEAP、Women in Red、Wiki Loves Pride 等慣用原文者保留原文; +不確定的正式譯名保留原文、可加註,不要硬譯。 + +## 步驟五:查證標記 + +- 期程日期說法不一或不確定:於日期後加「(待確認)」。 +- 僅為討論/提議、尚未定案:註明「討論中」。 + +## 步驟六:內容格式(純文字) + +開頭放一段**「近期截止提醒」**:把一兩週內即將截止的投稿/補助/報名期程, +依截止日由近到遠條列(會議名稱 — 期程類別 — 截止日)。本週若無迫近期程,註明即可。 + +其後分三區塊(無內容者可省略),每則連續編號: + +``` +近期截止提醒 +一、全球性會議與活動 +二、地區性(ESEAP)會議與活動 +三、主題性社群活動(Wikidata/WikiWomen/Wikimedia LGBT+ 等) +``` + +每則:**名稱**(範圍標註)/會議日期、地點/重要期程(有哪些列哪些)/ +本週動態(若有)/來源連結(該討論串網址)。 + +純文字排版,用分隔線與編號即可,不要 HTML。 +頂部加一行:「本則由 Claude Code AI 自動整理自 wikimedia-l 郵件論壇過去七天內容。」底部註明「來源:wikimedia-l」。 + +## 步驟七:寄出(純文字,本機 mail) + +不要用 shell 變數存檔名。跑 `mktemp` 後, +記下它印出的**實際檔名**,後續都用那個字面檔名操作: + +1. 跑 `mktemp /tmp/wmtw-brief.XXXXXX`,記下它印出的實際檔名。 +2. 把整理好的純文字短訊寫到該檔名。收件人與副本名單存在 `/etc/wmtw-briefs/config` + (該檔每行一項:`TO=收件人`、`CC=副本`,位址以逗號分隔)。直接讀該檔,取出 `TO` 與 `CC` + 兩行等號後的字面值,再用本機 `mail` 從該檔名寄出(`-c` 帶副本、收件人放最後): + `mail -s "【維基國際短訊】{YYYY/M/D}–{YYYY/M/D}" -c < <實際檔名>` +3. 刪除該檔名:`rm -f <實際檔名>` + +寄出後回報:共幾則、各區塊則數、有哪些即將截止的期程。