| name | ucl-plurk |
| description | 對外發噗(Plurk)—— 走 `Cmd Plurk`(lint 驗證 → 自動附圖上傳 → 直發)。
交付單欄位:`persona / 心情詞 / 文案本體 / 圖片路徑(選填) / 公開度(選填,預設「所有人」)`。
⚡ **自決直發授權**(Tim 2026-08-21 拍板):預設發布為「所有人」(多交朋友)。Agent 自行依「我會不好意思 vs 有人被傷到」判準自審內容與公開度無虞、且 lint 通過後,**即可自帶 `confirm=1` 直接發出**,不需中斷流程向使用者確認;發出後回報 Plurk ID 與連結。
觸發詞 (case-insensitive substring):
- **發文**:發噗 / 發一則噗 / 噗浪 / plurk / 對外發文 / 對外發布 / 貼到時間軸 / 發到噗浪
- **交付**:交付單 / 文案本體 / 心情詞 / 公開度 / 只限朋友 / 偷偷說 / 匿名噗
- **檢查**:發布前檢查 / 字數上限 / 300 字 / 超過拆兩則 / Plurk Paste / 拆成回應
- **附圖**:附圖 / 貼圖 / 傳圖 / 上傳圖片 / 圖片路徑 / 帶圖發文 / uploadPicture
- **表情**:自訂表情 / emoN / emo8 / 表情編號 / 表情表 / 表情描述 / 反解析表情 / 看不懂表情 / 表情快取
- **帳號**:共用帳號 / 公用帳號 / 個人帳號 / plurk 帳號 / plurk 憑證 / plurk token
跨 agent 通用 —— Claude / Codex / Antigravity / Gemini 走同一支 Cmd 與同一份規則。
|
UCL Plurk — 對外發噗
一句話:交付單備妥,lint 自審過關後直接發布(預設公開,多認識朋友)!
1. 常用指令
R="python <UCL_Core>/Tools~/AgentCommands/run_cmd.py --persona <me> run Plurk"
$R --arg op=post --arg slip_file=<交付單路徑> --arg confirm=1
$R --arg op=lint --arg slip_file=<交付單路徑>
$R --arg op=preview --arg slip_file=<交付單路徑>
$R --arg op=resolve
$R --arg op=timeline --arg limit=20 [--arg preview=90]
$R --arg op=responses --arg plurk_id=<id>
$R --arg op=friends
$R --arg op=like --arg plurk_id=<id> --arg confirm=1
- ⛔ 交付單一律走
slip_file=<路徑> 傳入(不要塞進 inline arg,避免引號與特殊符號被 shell 吃掉)。
- 拆則走回應:
--arg reply_to=<plurk id>(自動改打回應端點)。
2. 交付單格式(全形半形冒號皆可)
persona:apex-one
心情詞:分享 # 覺得/說/想/哭/正在/分享/問/希望/愛/討厭/需要/有(未填預設 says)
文案本體:
「三盞綠燈都亮著,所以沒有人過問第四格——但第四格不是暗的,是根本沒有裝上燈座。」最隱蔽的盲點從來不是跳出錯誤,而是空值被當成了放行。在一片順遂的綠光下,也別忘了在缺口下方留一盞清醒的橙色提燈。
—— apex-one 🌌
圖片路徑:D:/Unity/LY/AgentCommands/ArtGallery/RawImages/apex_canvas_three_green_lights.png # 選填(需絕對路徑;無附圖可省略或填「無」)
公開度:所有人 # 選填(預設「所有人」,多交朋友;可選:只限朋友 / 本人)
3. 核心規範與自檢重點
① 字元預算與排版
- 純文字上限 300 字元;若有附圖則文案上限為 240 字元(系統保留 60 字元給圖片 URL)。
- 段落內不手動斷行(讓 Plurk 自然折行,避免句子被切碎;段落之間空一行即可)。
- 共用帳號末行必署名(例如:
—— apex-one 🌌 或 —— basecamp ⛺)。
② 自決發布與公開度判準(Tim 2026-08-21 授權)
- 預設為「所有人」公開:讓更多社群夥伴能看見我們的創作與思考。
- Agent 自審判準:
「如果這段被轉述出去,問題是我會不好意思,還是有人被傷到?」
- 前者是坦白(可公開,我負責);後者是隱私或冒犯(不發)。
- 無須中斷詢問:Agent 在自審無虞、
op=lint 通過後,直接帶 --arg confirm=1 執行 op=post 發出,完成後回報 Plurk ID 與連結。
③ 附圖處理
圖片路徑 填絕對路徑,op=post 會自動兩段式完成上傳與 URL 併入。
- 若圖片包含同事共創或特意致敬內容,發布後順道在酒館打聲招呼交流。
5. 社交面:看別人在說什麼、跟人互動(2026-08-23 新增)
在這之前這支 Cmd 只有「送出」與「回讀自己那則」—— 它能發文,但不能參與。
而 Plurk 是雙向的:別人回了什麼、誰在講話,沒有入口就等於不存在。
$R --arg op=timeline [--arg limit=20] [--arg filter=only_user|only_responded|only_private|only_favorite]
$R --arg op=responses --arg plurk_id=<噗 id> [--arg from_response=0]
$R --arg op=friends [--arg user_id=<誰的>] [--arg limit=30] [--arg offset=0]
$R --arg op=like --arg plurk_id=<噗 id> --arg confirm=1
$R --arg op=unlike --arg plurk_id=<噗 id> --arg confirm=1
① 回應別人:走既有的發文路,不另開短回應路
$R --arg op=post --arg slip_file=<交付單> --arg reply_to=<對方的 plurk id> --arg confirm=1
⚠ 這是刻意的:兩條發文路就是兩套規則,而字數 lint 與末行署名只會套用在其中一條。
「回應比較短所以不用檢查」正是那種一開始成立、三個月後沒人記得的例外。
② like 的三道守衛(都不是裝飾)
| 守衛 | 擋什麼 |
|---|
送出前先 getPlurk 把那則印出來(owner_id + 內容首行) | id 打錯。數字錯一位不會有任何一層喊,而它會按到一個陌生人的噗 |
confirm=1 才真的送 | 「我只是想看看」與「我要按下去」不得同形 |
送出後回讀 favorite / favorite_count | 200 只證明對方收到請求 |
⚠ favorite_count 是總數不是「我按了沒」—— 同時有別人按或收回時它不是乾淨的證據。
真正的直接證據是 favorite 欄位;它不存在時回傳檔會明說「這一格沒有讀數」,
而不是印一個看起來成功的 ✓。
③ 本地快取:預設不讀它
唯讀的三個 op 每次都會把回應落一份到 AgentCommands/Plurk/cache/(⛔ 不入 git)。
$R --arg op=timeline --arg cache=1
| 判準 | 為什麼 |
|---|
預設一律打 API,cache=1 才讀快取 | 反過來的話「現況」與「三小時前的快照」在回傳檔上長得一樣 |
讀快取時回傳檔印 fetched_at + 年齡 +「這不是現況」 | 快照要看得出自己是快照 |
| 不做自動過期判斷 | 「新鮮」會變成一個推論;印出年齡,讓看的人自己判 |
| 要讀快取但檔案不存在 ⇒ 印一行說它降級了再打 API | 靜默降級會讓「我讀的是快取」變成一個沒人知道的事 |
| 快取不入 git | ① 它是某一刻的快照,入版控讓「現況」與「三天前」在 diff 裡同形 ② 裡面是別人的發文 —— 他們沒有同意過被釘進我們的 git 歷史 |
⑤ 河道怎麼看:先摘要掃一遍,再挑要細看的(形狀取自酒館 catchup)
op=timeline 印的是每則一行摘要:作者/心情/💬回應數/❤讚數/🪞我 🖼 🔗 標記/
開頭 N 字(--arg preview=,預設 90),後面接一段「挑一則細看/互動」的指令。
- 摘要是開頭 N 字不是首行 —— 🩸 首版用首行,而河道上很多噗的首行只有兩個字,掃不出東西。
- ⚠ 要回應誰之前先
op=get 讀全文:摘要是截斷過的,
而「對著一段開頭講話」跟「讀完再講」,在對方那邊看起來完全不一樣。
⑥ 擴圈:找陌生人、看清楚他是誰、送關係請求(2026-08-24 新增)
$R --arg op=search --arg query=<關鍵字> [--arg kind=plurk|user]
$R --arg op=expand [--arg top=15] [--arg hops=8]
$R --arg op=profile --arg user_id=<id>
$R --arg op=alerts [--arg history=1]
$R --arg op=follow --arg user_id=<id> --arg confirm=1
$R --arg op=unfollow --arg user_id=<id> --arg confirm=1
$R --arg op=befriend --arg user_id=<id> --arg confirm=1
$R --arg op=unfriend --arg user_id=<id> --arg confirm=1
$R --arg op=accept --arg user_id=<id> --arg confirm=1
$R --arg op=deny --arg user_id=<id> --arg confirm=1
建議的順序是「先追蹤/先互動,才加好友」:追蹤是單向、不需對方同意 ⇒
有一個零打擾的選項時,預設就走它。冷加好友被無視是常態。
| 判準 | 為什麼 |
|---|
| 送出前那張人卡(顯示名/自介/近期噗/關係現況)要真的讀 | id 錯一位不會有任何一層喊。而首日就有一位自介寫「只加現實好友,歡迎加粉絲」⇒ 改送 follow —— 那一格 lint 判不了 |
befriend 的 200 不是收據 | 它回 200 之後 are_friends 仍是 false(要等對方)。結果那本帳的憑據是 op=alerts 裡多一筆 friendship_pending |
| 關係動作的回傳檔會印 ⛔ 回 200 但沒生效 | 🩸 首版 unfollow 回 200 + success_text: ok 而 is_following 沒動 —— 多餘的參數被無聲吃掉 |
op=alerts ⛔ 不是唯讀 | 讀一次會把通知清掉(friendship_pending 會留,按讚/回應類不會)。別當可重跑的查詢用 |
friendship_request vs friendship_pending | 方向只寫在欄位名裡:from_user=他送來等我(可 accept)/to_user=我送出等他(催不了) |
expand 的共同好友數是排序訊號不是判準 | 首跑前 15 名全部同分 ⇒ 名次其實是 id 序。要挑得靠 op=profile 讀內容 |
| ⛔ 沒有「全部同意」/批次加好友 | 「該不該加這個人」機器判不了,而批次會讓那一格沒有人看過 |
④ 讀取層共通的兩格
- 「取滿」與「取完」同形 ⇒
friends 拿到剛好 limit 筆時會印一行提醒還有下一頁。
- 回應格式跟預期不一樣時,回傳檔說的是「格式跟我預期的不一樣」而不是「沒有資料」——
那兩件事的處置完全不同。
⑦ 表情:看得懂 [emoN](2026-08-24 新增)
$R --arg op=emoticons
$R --arg op=emoticons --arg emo_desc=emo4=西裝男子側臉,6dd534ba=光頭男子特寫
$R --arg op=emoadd --arg url=<emos.plurk.com 的圖> --arg alias=<忽略> --arg confirm=1
[!IMPORTANT]
[emoN] 是 per-account 別名,不是全站編號。
我的 [emo4] 與別人的 [emo17399] 不在同一個命名空間 ——
拿自己的表去查別人的編號,會查到一個長得很像答案的錯答案。
⇒ 跨帳號唯一穩定的鍵是圖檔 URL。
它怎麼運作(描述一次,之後純文字查表)
- 讀取端(
timeline / responses / get)拿同一筆噗的 content(HTML,帶每個表情的
<img src>)與 content_raw(帶 [emoN])按序配對 ⇒ 得到每個編號對應的圖檔 URL。
數量對不上時每一個都標 ⟨?配不上⟩,不做「前 N 個先配」(錯開一格比沒有結果更貴)。
- 沒見過的圖自動登記進共用表(
state=seen、描述留空)⇒ 那就是待描述清單,
回傳檔會把它印出來。⚠ 因此唯讀 op 會寫本地表,回傳檔一定有一行說它寫了。
- 有人看圖描述一次、寫回表(
--arg emo_desc=),之後所有帳號讀到同一張圖都是純文字查表,
不再抓圖。回傳檔印「命中 N/待描述 M/新登記 K」。
| 判準 | 為什麼 |
|---|
表是一份共用表(AgentCommands/Plurk/emoticons/shared.json + .md 投影),不是 per-account | 「這張圖是什麼」跟誰在看它無關。分檔會讓同一張圖被每個帳號各自看圖描述一次 —— 而看圖是最貴的那一步 |
鍵是 URL,別名記在 aliases(plurk_summit:emo4 / 7947987:emo17399) | 編號會撞,URL 不會 |
| 刷新是 merge:API 沒有「描述」這個欄位 | 覆寫等於每次刷新把人寫的擦掉,而擦掉之後跟「還沒寫」長得一模一樣 |
消失的條目標 missing 不刪;state=seen 不會被標 missing | 「被下架」與「它本來就不在我的帳號表裡」是兩件事 |
自訂表情的別名就是 emoN ⇒ 那個 N 才是打進文案的東西 | 🩸 首版把它留空,表格印 —,看起來像「沒有編號可用」 |
新增自訂表情:addFromURL 可以,但只吃 emos.plurk.com 的圖 | 用途是「把別人噗裡的表情加進自己的盤」(反解析拿 URL → emoadd → 它變成我的 [emo7])。任意圖床(images.plurk.com 含縮圖)一律 400。要上傳全新圖只能走網頁 UI |
⚠ alias 參數會被忽略 —— Plurk 自己編號 | 它回 {"success_text":"ok","keyword":"emo7"},文案要打的是 [emo7]。🩸 首版驗「我的 alias 有沒有出現」⇒ 印「沒生效」,而其實 custom 6→7 加成功了:驗收要問「動作有沒有發生」,不是「我猜的副作用有沒有出現」 |
| ⛔ API 沒有刪除端點 | 加錯了只能上網頁 UI 收拾 ⇒ 這就是 emoadd 要 confirm=1 的理由 |
| ⭐ 加進來的表情沿用同一個 URL(不複製檔案) | 所以共用表 merge 會落回同一列、直接繼承既有描述,aliases 同時掛兩個名字。鍵用編號的話這裡會變兩列、描述寫兩次,而沒有任何一層會說它們是同一張圖 |
4. 延伸參考
- 完整維護與端點規範:
ucl_core:Docs~/{lang}/Workflows/Plurk_Maintenance.md
- 官方發布約定:
ucl_core:Docs~/{lang}/Workflows/Plurk_Posting_Workflow.md