社群媒體發佈

Richfolio 可以選擇性地將買進訊號發佈到公開的社群頁面 — X/TwitterFacebook 粉絲專頁Threads 帳號與 LinkedIn 專頁 — 與電子郵件 + Telegram 簡報並行發佈。它只在每日盤中模式執行(絕不在每週或 refresh 模式)。

這是完全可選的功能。若未設定任何社群憑證,就不會發佈任何內容,Richfolio 其餘部分依然與先前完全相同 — 每個平台會記錄一行「credentials not set — skipping」並繼續執行。


會發佈哪些內容

貼文刻意保持通用化,以確保不會洩漏任何私人資訊:

  • 只發佈 STRONG BUYBUY 訊號(HOLD/WAIT 會被略過)。
  • 每則訊號顯示股票代碼、行動、信心度、簡短理由,以及選擇性的價值評等 — 不顯示其他內容。
  • 目標投資組合與觀察清單的股票代碼一律以「訊號」統一合併呈現 — 沒有「投資組合 vs 觀察清單」的標籤,因此你的持股永遠不會被揭露。
  • 絕不發佈: 配置比例、缺口、建議買進金額、股數、投資組合總值。src/socialContent.ts 中的 buildSignalLines() 是唯一的白名單關卡,而 sanitizeReason() 會剝除 AI 可能寫入理由中的任何配置缺口、金額規模或重疊折扣文字。兩者皆有單元測試覆蓋。
  • 在 Facebook / Threads / LinkedIn 上,股票代碼會呈現為可點擊的 #hashtag(cashtag 只在 X 上有效,在 X 上維持為 $cashtag)。在非 X 平台上會附加一組可設定的通用 hashtag 以提升觸及。
  • 每則貼文皆以免責聲明結尾:「本內容非投資建議,由 Richfolio 自動產生。」

啟用 / 停用

config.json 中的 social 區塊是總開關(以下顯示預設值):

"social": {
  "enabled": true,
  "includeLinkInX": false,
  "hashtags": ["investing", "stocks", "stockmarket", "ETFs"]
}
  • enabled: false — 無論憑證如何,皆停用所有社群發佈。
  • includeLinkInX — 在 X 貼文中包含分析連結。預設關閉,因為連結會提高 X 的按次計費成本。
  • hashtags — 在 Facebook / Threads / LinkedIn 上附加的通用 hashtag(開頭的 # 可省略)。不會加在 X 上。

每個平台另外還會以自身的憑證作為閘門,因此即使 enabledtrue,未設定金鑰的平台仍會被略過。


Secret 彙整

將下列項目加入為儲存庫 Secret(Settings → Secrets and variables → Actions → Secrets)。全部皆為可選 — 只需設定你想使用的平台。

Secret 平台 說明
FACEBOOK_PAGE_ID Facebook 你的粉絲專頁數字 id
FACEBOOK_PAGE_TOKEN Facebook 長效粉絲專頁存取 token
THREADS_USER_ID Threads 你的 Threads 數字使用者 id
THREADS_ACCESS_TOKEN Threads 長效 token(約 60 天過期)
THREADS_TOKEN_PAT Threads 用於自動更新 Threads token 的可選 PAT(見下文)
LINKEDIN_ACCESS_TOKEN LinkedIn 具備 w_organization_social 的 OAuth 2.0 token
LINKEDIN_ORG_URN LinkedIn 例如 urn:li:organization:123456
X_API_KEY / X_API_SECRET X/Twitter OAuth 1.0a consumer 金鑰
X_ACCESS_TOKEN / X_ACCESS_TOKEN_SECRET X/Twitter OAuth 1.0a 使用者 token

Facebook 粉絲專頁設定

執行階段只需要兩個值:FACEBOOK_PAGE_ID 與一個長效FACEBOOK_PAGE_TOKEN。因為你是以粉絲專頁管理員身分發佈到自己的粉絲專頁,所以可以維持在應用程式的開發模式(Development mode) — 不需要 App Review。

1. 建立 Meta 應用程式

  1. 前往 developers.facebook.comMy AppsCreate App
  2. 選擇 OtherBusiness 應用程式類型並命名(例如「Richfolio Poster」)。

2. 加入粉絲專頁管理使用案例

  1. 在應用程式中開啟 Use cases → 選擇 Manage everything on your Page
  2. 開啟其 PermissionsAdd(Standard Access 即足夠 — 忽略「Get Advanced Access」):
    • pages_manage_posts — 發佈到動態消息(最關鍵的一項)
    • pages_read_engagement
    • pages_show_list

    它們應顯示為 「Ready for testing」 — 這代表你作為管理員現在即可使用。

3. 取得使用者 token

  1. 開啟 Graph API Explorer
  2. 選擇你的應用程式 → Get User Access Token → 勾選三個 pages_* 權限 → Generate Access Token → 核准。

4. 鑄造長效粉絲專頁 token

Richfolio 內附一個輔助工具,可替你完成 token 交換。暫時加入到 .env:

FACEBOOK_PAGE_ID=your_page_id          # numeric Page id
FACEBOOK_APP_SECRET=...                # App settings → Basic → App secret
FB_USER_TOKEN=...                      # the user token from step 3

然後執行:

npx tsx smoke/fb-page-token.ts

它會將短效使用者 token 交換為長效 token、找到你的粉絲專頁,並印出一個永不過期的粉絲專頁 token。將其貼入 FACEBOOK_PAGE_TOKEN,然後從 .env刪除 FACEBOOK_APP_SECRETFB_USER_TOKEN — 它們僅用於設定階段,執行階段絕不會使用。

5. 驗證

npx tsx smoke/smoke-facebook.ts             # checks the token (no posting)
npx tsx smoke/smoke-facebook.ts --post --cleanup   # posts a test, then deletes it

出現 PASS 即確認該 token 是有效的粉絲專頁 token,且發佈流程從頭到尾都能運作。

6. 加入 GitHub

FACEBOOK_PAGE_IDFACEBOOK_PAGE_TOKEN 加入為儲存庫 Secret。請勿加入 app secret 或使用者 token。

Token 壽命: 粉絲專頁 token 實質上是永久的,但若你變更 Facebook 密碼、撤銷應用程式,或不再是粉絲專頁管理員,它就會失效。若發佈停止運作,請從步驟 3 重新鑄造。


Threads 設定

Threads 重用與 Facebook 相同的 Meta 應用程式。你需要一個 THREADS_USER_ID 與一個長效的 THREADS_ACCESS_TOKEN。你授權的帳號就是貼文顯示的來源帳號 — 請使用你的品牌 Threads 帳號,且該帳號必須是公開的

1. 為 Meta 應用程式加入 Threads 使用案例:Use casesAccess the Threads API。啟用 threads_basicthreads_content_publish scope。

2. 將自己加入為 Threads Tester:App Dashboard → App roles → RolesAdd PeopleThreads Tester → 輸入你的 Threads 使用者名稱 → 在 Threads 應用程式中接受邀請(Settings → Account → Website permissions)。

3. 產生長效 token:在 Threads 使用案例的 Settings 中,User Token Generator 會列出你的 tester 帳號 → Generate token。這已經是長效的 — 不需要交換。將其貼入 .env 作為 THREADS_ACCESS_TOKEN

4. 找出你的使用者 id 並驗證:

npx tsx smoke/smoke-threads.ts             # prints THREADS_USER_ID; set it in .env
npx tsx smoke/smoke-threads.ts --post --cleanup   # posts a test (delete may be manual)

5. 將 THREADS_USER_IDTHREADS_ACCESS_TOKEN 加入 GitHub Secret。

Token 過期與自動更新: Threads 長效 token 約在 60 天後過期。工作流程 .github/workflows/refresh-threads-token.yml 會每月更新 token 並寫回 secret — 前提是你也加入了 THREADS_TOKEN_PAT secret(一個具備儲存庫 Secrets: Read and write 的細粒度 PAT)。若沒有該 PAT,請在 token 過期前手動更新。


LinkedIn 專頁設定

LinkedIn 是免費的,但門檻最高。你需要:

  1. 一個與你的公司專頁(Company Page)關聯的 LinkedIn Developer app
  2. 「Community Management API」 產品,它授予 w_organization_social scope。申請它需要你的應用程式的公司關聯通過驗證(Settings 分頁)並提交一份存取表單(表單會要求註冊的公司名稱)。
  3. 一個具備 w_organization_social、由專頁管理員產生的 OAuth 2.0 存取 token

設定:

  • LINKEDIN_ACCESS_TOKEN — OAuth 2.0 token。
  • LINKEDIN_ORG_URN — 你的組織 URN,例如 urn:li:organization:123456(數字在你的公司專頁網址中)。
  • LINKEDIN_API_VERSION — 可選覆寫(預設為近期的 YYYYMM)。

npx tsx smoke/smoke-linkedin.ts(token 檢查)與 --post --cleanup(發佈測試)驗證。

LinkedIn 存取 token 約在 60 天後過期(refresh token 約可維持 365 天)。請規劃定期更新。發佈到組織需要一個已註冊的公司;若你沒有,可改寫發佈器,透過自助式的「Share on LinkedIn」產品(w_member_social)從個人檔案發佈。


X / Twitter 設定

自 2026 年 2 月起,X 已無免費發佈層級。 發佈為按次計費(每則約 0.015 美元,若含連結則更高)。Richfolio 內附 X 發佈器,但在你加入金鑰前皆維持休眠狀態。

發佈使用 OAuth 1.0a 使用者情境(user context)。在 X Developer Portal 中,建立一個具備 Read and Write 權限的 project/app,並產生:

  • X_API_KEY / X_API_SECRET — consumer(API)金鑰與密鑰。
  • X_ACCESS_TOKEN / X_ACCESS_TOKEN_SECRET — 你帳號的存取 token 與密鑰。

config.json 中將 includeLinkInX 保持關閉,以維持每則貼文的低成本。


它如何執行

在每日與盤中模式中,於電子郵件與 Telegram 寄送之後,Richfolio 會呼叫 sendSocialPosts()(src/social.ts)。每個平台都在各自的 try/catch 中發佈,因此單一平台失敗絕不會阻擋其他平台 — 也不會影響已寄出的電子郵件/Telegram。

若你 fork Richfolio,社群發佈會維持關閉,直到你以自己的帳號完成上述設定 — 憑證無法共用,因為每個 token 都會發佈到其擁有者的頁面。


Richfolio — free, open-source portfolio monitoring. · Privacy Policy

This site uses Just the Docs, a documentation theme for Jekyll.