社群發佈
用途
從同一個地方依照排程發佈行銷內容,透過每個平台的官方 API,避免個人帳戶與品牌帳戶混淆。這裡使用的工具是 Postiz(開源、自行託管);這些平台步驟適用於任何排程工具。
先決條件
- 品牌帳戶已建立:Instagram 專業帳戶、Threads 個人檔案(來自 Instagram)、X 帳戶,可選 TikTok。
- 一個 Cloudflare 上的網域(用於 Tunnel 主機名稱)、Docker Desktop、一台在發佈時間保持開機的電腦(或小型 VPS)。
- 如果使用瀏覽器驅動主控台,則需
console-automation設定。 - 內容行事曆(請參閱「行事曆」一節)。
平台現實(開始前再次確認;這些可能會變更)
| 平台 | 官方途徑 | 阻礙您的因素 |
|---|---|---|
| Meta 應用程式 + Facebook 登入,IG 專業帳戶 連結到一個 Facebook 粉絲專頁 | 新的 Meta 應用程式會取得「統一登入」Instagram 設定,這需要一個 商業投資組合;舊的僅 Instagram 登入設定「不適用於較新的應用程式」。限時動態發佈為單純媒體:透過 API 無法使用投票、連結或倒數計時貼紙。 | |
| Threads | 具有 Threads 使用案例的 Meta 應用程式 | 在應用程式審核通過前,只有具有 Threads 測試者 角色的帳戶才能連線;測試者在 Threads › 設定 › 帳戶 › 網站權限 › 邀請 中接受。 |
| X | 具有付費 API 存取的開發者帳戶(查看 目前的 X API 定價) | 需要付款方式;設定消費上限。 |
| TikTok | 內容發佈 API | 未經審核的應用程式僅發佈 私人 內容,直到審核通過(審核需要時間)。新帳戶需要 電話驗證,且一個號碼只能屬於一個帳戶。 |
| YouTube | Data API 上傳 | 未經驗證的 API 專案上傳為 私人,直到完成合規審核。 |
根據這些障礙進行規劃:儘早開始審核,在審核通過前,使用 TikTok/YouTube 原生功能(TikTok Studio、YouTube Studio 排程器)發佈,或放棄該平台。
程序
1. 自行託管 Postiz(Docker)
- 從官方的
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。
- 移除不需要的服務,以及任何會綁定機器上已使用埠號的服務(上游檔案將 Temporal UI 綁定到
- 在頁面水合完成後,在瀏覽器中建立第一個帳戶(未水合的表單會以 GET 方式提交,並將密碼放入 URL 中)。然後設定
DISABLE_REGISTRATION=true並重新啟動。 - 保持
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)
- 為發佈功能建立一個獨立的 Meta 應用程式(不要將使用案例加到已經為應用程式內功能提供支援的應用程式,例如 Instagram 限時動態分享)。使用案例:「管理 Instagram 上的訊息傳送與內容」和「存取 Threads API」。
- 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。
- Threads:加入
threads_basic、threads_content_publish、threads_manage_replies、threads_manage_insights;設定回呼 URI(/integrations/social/threads)以及取消安裝/刪除回呼 URL;取得單獨的 Threads 應用程式 ID/密鑰;將品牌個人檔案加入為 Threads 測試者並在手機上接受邀請。 - 如果 Threads 同意 URL 停留在 Threads 主頁面而非同意畫面,表示瀏覽器工作階段位於
threads.com,而排程器使用threads.net:在threads.com上開啟相同的 URL。 - 如果瀏覽器目前以粉絲專頁身份運作(在編輯粉絲專頁後),Facebook 同意畫面會先顯示「您需要切換為 <您的姓名>」;請以個人而非粉絲專頁身份繼續。
- 在 Facebook 同意過程中,Meta 預設為「所有當前和未來的粉絲專頁/企業/Instagram 帳戶」。在管理其他品牌的帳戶上,請選擇「僅當前」並選取品牌的資產。
4. X
- 開發者主控台入門:帳戶名稱、精確的使用案例描述(僅自己的帳戶、無資料轉售、無自動按讚/追蹤/私訊)、接受條款。
- 購買最小的點數包;關閉自動加值並設定帳單週期上限。儀表板的總額可能落後於點數頁面。
- 應用程式 › 使用者驗證設定:讀取和寫入、「Web 應用程式、自動化應用程式或機器人」、回呼 URI = 排程器回呼(Postiz:
/integrations/social/x)、網站、服務條款和隱私權 URL。儲存後會顯示一次 OAuth 2.0 客戶端密鑰。 - Postiz 使用 OAuth 1.0a:重新產生 Consumer Key 並複製金鑰 + 「Consumer Key Secret」(確切標籤)一次 →
X_API_KEY/X_API_SECRET。 - 授權:勾選「我信任此應用程式」,確認畫面顯示的是品牌帳號,然後點選授權。
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 帳戶變更和開發者連線,這會觸發驗證碼的速率限制。