用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/RonShih/social-media-agent --skill publish-facebook命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | publish-facebook |
| description | 用 Playwright 在 Facebook 個人 timeline / 粉專發一篇含圖貼文。 |
共通規則見
CLAUDE.md「共通行為規則」章節,本檔只描述 FB 特有的步驟。 每步結束都要呼叫scripts/log-click.sh(格式見 CLAUDE.md「Click recording」)。
caption:貼文文字hashtags:list of string(接在 caption 結尾)local_image_path:本地圖檔絕對路徑draft_id / run_id:caller(/publish-now)傳入,用於 click-log{ "post_url": "https://..." }
--step 值必須一字不差用以下、不准自取)| step_id | 必要 | 用途 |
|---|---|---|
1_navigate | 必 | 進粉專首頁(讀 socials.facebook.url) |
2_switch_to_page_if_needed | 條件 | 切換到粉專管理身分(沒「立即切換」就 log 跳過) |
3_click_create_post | 必 | 點「在想些什麼?」開 composer |
4_type_caption | 必 | 輸入 caption + hashtags |
5_click_add_photo | 必 | 點「相片/影片」 |
6_file_upload | 必 | 上傳檔案 |
7_wait_preview | 必 | 等預覽載入完成 |
7b_stage_continue_1 | Reel-only | Reel 三段式第 1 個「繼續」(圖片貼文不會出現,照樣 log skip) |
7c_stage_continue_2 | Reel-only | Reel 三段式第 2 個「繼續」 |
8_click_publish | 必 | 點「發佈」 |
8b_dismiss_post_publish_dialog | 必 | 處理 WhatsApp 推銷 dialog(見下方坑點,發出去後必處理) |
9_extract_post_url | 必 | 抓貼文 URL |
為什麼鎖定:跨平台規則見 OPERATING_RULES §9。簡言之,click-log 統計分析需要 step_id 穩定才看得出 pattern。 「條件 / Reel-only」步驟若當下不適用,仍要 log 一筆
--ok true --ms 0 --args '{"reason":"skipped_not_applicable"}'占位,不要省略。
1_navigate — 讀 config/brand.yaml.socials.facebook.url,browser_navigate 過去2_switch_to_page_if_needed — 用 browser_snapshot 看是否有「立即切換」按鈕(FB 會顯示「切換為 Cuite Bellie 的粉絲專頁並開始管理。」橫幅)。有就 browser_click、等頁面重載;沒有代表已是粉專管理身分,跳過(log 一筆 --ok true --ms 0 標記略過)。這步是粉專身分必要條件 — 沒切換 composer 會以個人身分發文。3_click_create_post — 點「在想些什麼?」開 composer4_type_caption — 文字框輸入 caption + "\n\n" + hashtags.join(" ")5_click_add_photo — 點「相片/影片」6_file_upload — browser_file_upload 傳 local_image_path7_wait_preview — browser_wait_for 等預覽載入完7b_stage_continue_1 — 若 Reel 流程出現「繼續」按鈕(Stage A → B)就點;圖片貼文無此按鈕、log skip7c_stage_continue_2 — 同上、Stage B → C 的「繼續」;圖片貼文 log skip8_click_publish — 點「發佈」(用 name: '發佈', exact: true)8b_dismiss_post_publish_dialog — 點「稍後再說」處理 WhatsApp 推銷 dialog(見下方坑點),沒跳就 log skip9_extract_post_url — 抓新貼文永久連結。雙策略:Business Suite 優先、polling 為 fallback:Strategy 1(主):Meta Business Suite 已發佈 tab
config/brand.yaml.socials.facebook.asset_id
asset_id 欄位 → 跳到 Strategy 2browser_navigate 到 https://business.facebook.com/latest/posts/published_posts?asset_id=<asset_id>https://www.facebook.com/<page_id>/posts/pfbid... 或 https://www.facebook.com/reel/<id>/)getAttribute('href') 直接讀就好{"post_url": "<url>"}、log step 9 --ok true --args '{"strategy": "business_suite"}'Strategy 2(fallback):polling 粉專 timeline 只在 Strategy 1 失敗(asset_id 沒設、Business Suite 進不去、找不到符合的 row)時跑:
browser_navigate 回粉專 URL/reel/<id>/ 或 /posts/pfbid...,up to 90 秒{"post_url": "<url>"}、log --ok true --error "fallback_via_polling"兩個策略都失敗 → log --ok false --error "post not visible in Business Suite or timeline within 90s"、回 {"post_url": null, "error": "url_extraction_failed"}、caller 收到要明確告訴使用者「貼文可能已發出但 URL 抓不到,請手動確認 Business Suite」,不要假裝成功。
當 caller 傳入 mode: dry_run:
8_click_publish、step 9browser_close{"status": "dry_run_ok", "stages_passed": [...], "abort_at_step": "<step name>"}{"status": "dry_run_failed", "step_failed": "<step>", "error": "<原因>"}dry-run 不寫 click-log、不寫
reports/posts/報告。 因為 dry-run 不點最後的「發佈」,所以 WhatsApp 推銷 dialog 不會出現 — 那段邏輯靠 dry-run 驗不到,要靠真實 publish 才驗得到。
以下是已知 case,非 exhaustive list。中間步驟遇到沒列出的 dialog / 元素 drift / 載入慢 → 自己 reasoning 解(OPERATING_RULES §4「過程雜訊 vs 終點驗收」),不要 surface 給使用者。只有終點驗收(post URL、登入態、素材)才老實回 error。
WhatsApp 推銷 dialog(2026-05-05 確認)— 點完 step 8 發佈後 1-2 秒內會跳出:
處理方式(即 8b_dismiss_post_publish_dialog,step 8 之後、step 9 之前必做):
browser_wait_for time=2browser_snapshot 看當前 dialogbrowser_click 點它,log 8b --ok true --args '{"role":"button","name":"稍後再說"}'browser_press_key Escape 關 dialog(禁止點「新增 WhatsApp 按鈕」),log 8b 標 method=key8b --ok true --ms 0 --args '{"reason":"skipped_no_dialog"}'為什麼重要:背景的 Reel 設定 dialog 會顯示「發佈中」status,但若 WhatsApp dialog 沒處理乾淨,FB 在某個內部超時後會把 publish 當作取消,前端不會出 error toast、Meta Business Suite 「已發佈」/ 「草稿」/ 「已排定發佈」三個 tab 都不會出現該貼文。這就是 publish-facebook 過去看似成功實則沒發出去的根因。
密碼洩漏 dialog(FB 偶爾跳)— 點 Not now / 稍後再說 關閉後繼續。同樣不算 step、不 log。
name: '發佈', exact: true — 因為「加強推廣貼文」action 的 nested text 也含「發佈」二字,不 exact 會誤點上傳影片後,FB 不會留在「建立貼文」單一 dialog,會分三段:
caption 在 Stage A 輸入後會自動帶到 Stage B/C,不要重輸。三段都用預設值點「繼續」/「發佈」即可,不要展開或修改任何欄位。