Communitygithub.com

erberkk/social-publishing

用於設定從一個平台跨官方 API 排程發佈行銷內容到 Instagram(Reels、輪播、限時動態)、Threads、X 與 TikTok,並自行託管 Postiz 於 Docker 搭配 Cloudflare Tunnel,同時安全區分個人與品牌帳戶。

social-publishing 是什麼?

這是一個技術性極強的 AI 助手技能,專為需要在多個社群平台(Instagram、Threads、X、TikTok、YouTube)上安排精準發佈的開發者與內容營運團隊設計。它基於開源排程工具 Postiz,並透過 Docker 自行託管,以 Cloudflare Tunnel 取得公開主機名稱。技能詳盡說明了各平台官方 API 的現實限制,例如 Meta 新應用程式的 Business Portfolio 要求、Threads 的 Tester 邀約機制、X 的付費 API 額度、TikTok 的沙盒審核與 YouTube 的合規審查。此外,它還提供了完整的實作步驟,包括 Postiz 的 Docker 組態最佳化(移除不需要的服務、關閉 Elasticsearch、設定資源限制)、Cloudflare Tunnel 的建立與安全考量、Meta 應用程式的正確建立與 OAuth 權限設定、X 的開發者帳戶與認證流程,以及 TikTok 沙盒開發與帳戶轉換的注意事項。此技能特別強調 OAuth 流程中的帳戶安全,避免誤將個人帳戶連接到品牌資產,並要求人類在關鍵決策點(如建立品牌帳戶、購買 API 額度、轉換個人帳戶)進行核准。它也包含一個以真實發佈事件為依據的內容行事曆建議,而非固定的時間表。此技能適用於任何支援官方 API 的排程工具,不僅限於 Postiz。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/erberkk/mobile-app-launch-skills/tree/HEAD/skills/social-publishing

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

社群發佈

用途

從同一個地方依照排程發佈行銷內容,透過每個平台的官方 API,避免個人帳戶與品牌帳戶混淆。這裡使用的工具是 Postiz(開源、自行託管);這些平台步驟適用於任何排程工具。

先決條件

  • 品牌帳戶已建立:Instagram 專業帳戶、Threads 個人檔案(來自 Instagram)、X 帳戶,可選 TikTok。
  • 一個 Cloudflare 上的網域(用於 Tunnel 主機名稱)、Docker Desktop、一台在發佈時間保持開機的電腦(或小型 VPS)。
  • 如果使用瀏覽器驅動主控台,則需 console-automation 設定。
  • 內容行事曆(請參閱「行事曆」一節)。

平台現實(開始前再次確認;這些可能會變更)

平台官方途徑阻礙您的因素
InstagramMeta 應用程式 + Facebook 登入,IG 專業帳戶 連結到一個 Facebook 粉絲專頁新的 Meta 應用程式會取得「統一登入」Instagram 設定,這需要一個 商業投資組合;舊的僅 Instagram 登入設定「不適用於較新的應用程式」。限時動態發佈為單純媒體:透過 API 無法使用投票、連結或倒數計時貼紙。
Threads具有 Threads 使用案例的 Meta 應用程式在應用程式審核通過前,只有具有 Threads 測試者 角色的帳戶才能連線;測試者在 Threads › 設定 › 帳戶 › 網站權限 › 邀請 中接受。
X具有付費 API 存取的開發者帳戶(查看 目前的 X API 定價)需要付款方式;設定消費上限。
TikTok內容發佈 API未經審核的應用程式僅發佈 私人 內容,直到審核通過(審核需要時間)。新帳戶需要 電話驗證,且一個號碼只能屬於一個帳戶。
YouTubeData API 上傳未經驗證的 API 專案上傳為 私人,直到完成合規審核。

根據這些障礙進行規劃:儘早開始審核,在審核通過前,使用 TikTok/YouTube 原生功能(TikTok Studio、YouTube Studio 排程器)發佈,或放棄該平台。

程序

1. 自行託管 Postiz(Docker)

  1. 從官方的 postiz-docker-compose 檔案開始。在執行 up 之前:
    • 移除不需要的服務,以及任何會綁定機器上已使用埠號的服務(上游檔案將 Temporal UI 綁定到 127.0.0.1:8080)。
    • 移除 Elasticsearch:設定 Temporal ENABLE_ES=false 和 SKIP_ADD_CUSTOM_SEARCH_ATTRIBUTES=true(使用 SQL 可見性)。Postiz 僅註冊兩個關鍵字屬性。如果 Temporal 最初是以 ES 啟動的,其資料庫仍會保留預設的文字屬性,導致 Postiz 失敗並顯示「cannot have more than 3 search attribute of type Text」:在排程任何事項之前,請重新建立 Temporal 資料庫磁碟區。
    • 僅將 Postiz 綁定到 127.0.0.1;將 MAIN_URL、FRONTEND_URL、NEXT_PUBLIC_BACKEND_URL 設定為公開的 HTTPS 主機名稱。
    • 將機密資訊(JWT_SECRET、Tunnel token、應用程式金鑰)放入 .env 檔案中(並將其加入 .gitignore),在 compose 檔案中以 ${VAR} 方式引用。
    • 為每個服務加入 mem_limit/cpus 限制。Postiz 將前端、後端和協調器運行在一個容器中;我們觀察到大約 1.5 GB 的使用量,因此 2 GB 的限制可以避免達到上限。在 Windows 上,也需要在 %USERPROFILE%\.wslconfig 中設定 WSL VM 的上限(memory=4GB、processors=4、autoMemoryReclaim=gradual),然後執行 wsl --shutdown 並重新啟動 Docker Desktop。
  2. 在頁面水合完成後,在瀏覽器中建立第一個帳戶(未水合的表單會以 GET 方式提交,並將密碼放入 URL 中)。然後設定 DISABLE_REGISTRATION=true 並重新啟動。
  3. 保持 restart: always 並啟用「登入時啟動 Docker Desktop」;如果該機器是排程器,請停用睡眠模式。

2. 公開主機名稱(Cloudflare Tunnel)

  • 建立一個遠端管理的 Tunnel(API:使用 config_src: cloudflare 的 POST /accounts/{id}/cfd_tunnel、使用 ingress 規則的 PUT .../configurations、指向 <tunnel-id>.cfargotunnel.com 的代理 CNAME、GET .../token)。
  • 在同一個 compose 網路中將 cloudflared 作為服務運行,並將 ingress 指向 http://postiz:5000,而不是 localhost。
  • 核准:Tunnel 會將本地服務暴露到網際網路;請在建立前先申請。可選:在前面加上 Cloudflare Access(需要在帳戶上啟用 Zero Trust;保持 /uploads 可訪問,以便 Meta 擷取媒體)。

3. Meta(Instagram + Threads)

  1. 為發佈功能建立一個獨立的 Meta 應用程式(不要將使用案例加到已經為應用程式內功能提供支援的應用程式,例如 Instagram 限時動態分享)。使用案例:「管理 Instagram 上的訊息傳送與內容」和「存取 Threads API」。
  2. Instagram:
    • 當使用案例要求時,建立一個商業投資組合(免費;名稱、擁有者姓名、公司電子郵件)。只有在需要其他人的資料和應用程式審查時,才需要驗證。
    • 為品牌建立一個 Facebook 粉絲專頁(Meta 廣告也需要),並將 Instagram 專業帳戶連結到該粉絲專頁:粉絲專頁設定 › 連結的帳戶 › Instagram › 連線。OAuth 彈出視窗會使用瀏覽器當前的任何 Instagram 帳戶登入:閱讀「以 … 身份登入」的名稱;如果是個人帳戶,請先切換帳戶(連結個人帳戶會將其轉換為專業帳戶)。
    • 在 Instagram 使用案例中,僅加入排程器要求的確切範圍(Postiz:instagram_basic、pages_show_list、pages_read_engagement、business_management、instagram_content_publish、instagram_manage_comments、instagram_manage_insights)。將 Facebook 用於企業登入的回呼 URI 設定為排程器的回呼地址(Postiz:/integrations/social/instagram)。
    • 應用程式 ID + 密鑰(應用程式設定 › 基本資料;顯示密鑰需要輸入 Facebook 密碼)→ FACEBOOK_APP_ID/SECRET。
  3. Threads:加入 threads_basic、threads_content_publish、threads_manage_replies、threads_manage_insights;設定回呼 URI(/integrations/social/threads)以及取消安裝/刪除回呼 URL;取得單獨的 Threads 應用程式 ID/密鑰;將品牌個人檔案加入為 Threads 測試者並在手機上接受邀請。
  4. 如果 Threads 同意 URL 停留在 Threads 主頁面而非同意畫面,表示瀏覽器工作階段位於 threads.com,而排程器使用 threads.net:在 threads.com 上開啟相同的 URL。
  5. 如果瀏覽器目前以粉絲專頁身份運作(在編輯粉絲專頁後),Facebook 同意畫面會先顯示「您需要切換為 <您的姓名>」;請以個人而非粉絲專頁身份繼續。
  6. 在 Facebook 同意過程中,Meta 預設為「所有當前和未來的粉絲專頁/企業/Instagram 帳戶」。在管理其他品牌的帳戶上,請選擇「僅當前」並選取品牌的資產。

4. X

  1. 開發者主控台入門:帳戶名稱、精確的使用案例描述(僅自己的帳戶、無資料轉售、無自動按讚/追蹤/私訊)、接受條款。
  2. 購買最小的點數包;關閉自動加值並設定帳單週期上限。儀表板的總額可能落後於點數頁面。
  3. 應用程式 › 使用者驗證設定:讀取和寫入、「Web 應用程式、自動化應用程式或機器人」、回呼 URI = 排程器回呼(Postiz:/integrations/social/x)、網站、服務條款和隱私權 URL。儲存後會顯示一次 OAuth 2.0 客戶端密鑰。
  4. Postiz 使用 OAuth 1.0a:重新產生 Consumer Key 並複製金鑰 + 「Consumer Key Secret」(確切標籤)一次 → X_API_KEY/X_API_SECRET。
  5. 授權:勾選「我信任此應用程式」,確認畫面顯示的是品牌帳號,然後點選授權。

5. TikTok(可選)

帳戶:

  • 新帳戶需要電話驗證,且一個號碼只能綁定一個帳戶;網頁註冊可能會停在「在應用程式中繼續」。選項:為品牌帳戶使用第二個號碼,或轉換現有的個人帳戶(新的使用者名稱和顯示名稱、個人頭貼、個人簡介;封存/隱藏舊的個人影片)。
  • 在某些地區,「切換為商業帳戶」的單鍵選項已消失;選單中會出現「成為已驗證的商業帳戶」,這需要公司文件。個人帳戶已足夠:TikTok Studio 排程、分析、Spark Ads 和內容發佈 API 均可與之搭配。主要損失是商業音樂庫。
  • 使用者名稱每 30 天可變更一次,顯示名稱每 7 天可變更一次。網頁個人檔案(名稱、個人簡介、頭貼、計數)可能比應用程式落後一天或更多;請信任應用程式。
  • 帳戶地區在註冊時由 SIM/IP 設定,且在設定中無法更改。

開發者應用程式(用於排程器):

  • developers.tiktok.com 註冊僅顯示「企業開發者」(電子郵件 + 驗證碼 + 密碼),但在建立應用程式時,您可以選擇 個人 擁有權,因此無需公司即可開始。
  • 建立應用程式,然後建立一個 沙盒:基本資訊(圖示 1024²、分類、描述 ≤120 字、服務條款/隱私權 URL、Web 平台 URL)、產品 Login Kit(Web 回呼 URI = 排程器回呼;Postiz /integrations/social/tiktok)和 Content Posting API(開啟 Direct Post),以及排程器要求的所有範圍。Postiz 要求 user.info.basic、user.info.profile、user.info.stats、video.list、video.upload、video.publish;缺少任何一個都會在同意頁面上顯示「Something went wrong … correct the following: scope」。每次編輯後點選「Apply changes」。
  • 將品牌帳戶加入為沙盒 目標使用者(登入彈出視窗接受來自手機應用程式的 QR 碼掃描)。在排程器中使用沙盒客戶端金鑰/密鑰。
  • 透過檔案推送上傳不需要網域驗證;透過 URL 拉取上傳則需要。
  • 在審核之前:UPLOAD 模式將影片發送到帳戶的 TikTok 收件匣作為草稿(在 24 小時內從手機發佈;每 24 小時最多 5 個待處理)。DIRECT_POST 模式可行,但僅以私人方式發佈。提交生產應用程式進行審核,並附上一個示範影片以進行公開直接發佈。
  • 同意步驟可能會要求「驗證是否為您本人」並發送電子郵件驗證碼。在一天內對帳戶進行多次變更(電子郵件、名稱、個人簡介、新登入)後,TikTok 會對這些驗證碼進行速率限制(「已達到最大嘗試次數」):請停止並在第二天重試,而不是持續嘗試。

6. 驗證

  • 排程器頻道清單應顯示每個品牌帳戶(名稱/帳號),且沒有任何一個被停用。
  • 在行事曆開始前,每個平台先發佈一篇私人/低風險的測試貼文或草稿。
  • 一天後的資源使用情況:docker stats --no-stream。

行事曆

  • 將發佈行事曆與真實的發佈事件對齊,而不是固定日期:發佈前(無下載行動呼籲、無價格),然後是每個商店的發佈,最後是兩者都上線。商店審查日期會變動;當它們變更時,請重新錨定行事曆。
  • 檢查貼文中的每一項聲明是否與已出貨的版本相符,以及每一個行動呼籲是否與每個商店上實際提供的內容相符。
  • 包含投票、連結或倒數計時的限時動態無法透過 API 發佈;請在應用程式中發佈。

需要人類核准的決策點

建立品牌帳戶、商業投資組合、Facebook 粉絲專頁;透過 Tunnel 暴露本地服務;購買 API 額度與消費上限;哪個個人帳戶永遠不能連線;轉換個人帳戶;刪除 Docker 磁碟區或資料。

常見陷阱

  • 因為 OAuth 彈出視窗重複使用了瀏覽器的工作階段,而連線了個人 Instagram 帳戶。
  • 假設舊的 Instagram 登入設定存在於新的 Meta 應用程式上。
  • 將發佈使用案例加入行動應用程式內部的 Meta 應用程式。
  • 當 Temporal SQL 可見性已足夠時,仍將 Elasticsearch 留在堆疊中。
  • 上游的 compose 檔案佔用了本地其他服務已使用的埠號。
  • 從錯誤的標籤儲存了 X 金鑰(「Consumer Key Secret」,而不是對話框標題)。
  • 行事曆的編寫方式好像是應用程式在第 1 天就在兩個商店上線。
  • 在同一天完成所有 TikTok 帳戶變更和開發者連線,這會觸發驗證碼的速率限制。

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

erberkk/privacy-and-declarations

Use when filling in or auditing App Store privacy and compliance answers and Google Play App content declarations - Apple App Privacy labels, Play Data safety (CSV import), Health apps declaration and Health Connect permissions, advertising ID, PrivacyInfo.xcprivacy and required-reason APIs, export compliance (ITSAppUsesNonExemptEncryption), age rating, account deletion (in-app, web URL, re-authentication), consent and disclosure for AI features, and rules for health data. Derives every answer from a code and SDK scan so the forms, the privacy policy and the in-app text say the same thing.

erberkk/review-readiness

Use before submitting an app version or a first subscription for App Store or Google Play review, or after receiving a rejection. Runs a go/no-go checklist and writes a report - demo account that signs in with a password (no email one-time code), filled with data and premium unlocked; review notes; in-app purchases visible and purchasable (guideline 2.1(b)); iPad compatibility mode for iPhone-only apps; no placeholders or "coming soon"; metadata matching the app; live privacy URLs; crash-free cold start - and gives a playbook for replying in Resolution Center and deciding when to appeal.

erberkk/store-screenshots

Use when producing or updating App Store and Google Play screenshots and the Play feature graphic - planning a connected "panorama" story across frames, capturing real in-app screens with the app's own test/screenshot harness at each device's logical size and pixel ratio, covering the full device matrix (iPhone 6.9", the required medium Dynamic Island slot, iPhone Duo outer and inner displays, iPad 13" if the app runs on iPad, Play phone, 7" and 10" tablets, 1024x500 feature graphic), checking for alpha channels and wrong sizes, and uploading in order via the App Store Connect and Google Play APIs.

erberkk/web-presence-and-seo

Use when building, checking or deploying the website that a mobile app needs for its store listings and launch - privacy policy, terms, support and web account-deletion pages that work signed-out; hosting apple-app-site-association and assetlinks.json; invite/referral pages (/i/<code>) that open the app or fall back to the store with the Play install referrer; a landing page with store badges and honest per-country prices filled at the edge; Open Graph images; technical SEO (hreflang, canonical, sitemap, robots.txt, JSON-LD); Search Console, Bing Webmaster and IndexNow; AI crawler policy and llms.txt; and a Cloudflare Worker deploy with a production approval gate. Includes a site checker and an IndexNow ping script.

相關技能