📘 Facebook API 應用與資料庫架構指南~邱允文

 

📘 Facebook API 應用與資料庫架構指南

本指南將詳細解說使用 Facebook API 進行應用程式開發時的關鍵步驟,以及其背後的資料庫架構考量。我們將針對每個主題提供三個案例和對應的提示詞範例。


1. 🌐 Facebook API 應用實務

Facebook 提供一系列的 API(如 Graph API、Marketing API 等),讓開發者能夠讀取和寫入 Facebook 平台的資料,例如貼文、使用者資訊、廣告活動等。

📌 步驟詳解

  1. 應用程式註冊與審核:

    • Meta 開發者平台上註冊你的應用程式,取得應用程式 ID(App ID)和密鑰(App Secret)。

    • 根據你要存取的資料類型,申請相應的權限(Permissions),例如 public_profilepages_show_list 等。

    • 對於需要存取使用者私密資料的權限,必須通過 Facebook 的應用程式審查(App Review)。

  2. 存取權杖(Access Token)的取得:

    • API 呼叫需要一個有效的存取權杖來驗證身份和權限。權杖類型包括:

      • 使用者權杖: 透過 OAuth 2.0 流程取得,用於代表使用者操作。

      • 粉絲專頁權杖: 從使用者權杖擴展而來,用於管理特定粉絲專頁。

      • 應用程式權杖: 用於不代表任何特定使用者,而是代表應用程式本身的操作。

  3. 呼叫 Graph API:

    • Graph API 是 Facebook 的核心 API,其資料結構像一個圖形(Graph),由節點(Nodes,如 User、Post)和邊緣(Edges,如 /user/posts)組成。

    • API 呼叫通常是 HTTP 請求,格式為:GET/POST https://graph.facebook.com/{version}/{node_id}/{edge}?access_token=...

    • 參數指定: 使用 fields 參數來精確指定你需要的資料欄位,以優化效能和減少傳輸量。

💡 案例分析 (3 個)

案例 1:取得使用者公開個人檔案資訊

  • 目的: 使用者透過你的應用程式登入後,取得其公開的姓名和電子郵件。

  • 細節講解:

    • 權限: 必須取得 public_profileemail 權限。

    • 流程: 應用程式引導使用者進行 Facebook 登入(OAuth),成功後獲得一個使用者存取權杖

    • API 呼叫: 使用 Graph API 節點 /me(代表當前使用者)並指定欄位。

  • 程式碼範例(概念):

    GET https://graph.facebook.com/v19.0/me?fields=id,name,email&access_token={USER_ACCESS_TOKEN}
    

案例 2:發佈貼文到粉絲專頁

  • 目的: 透過應用程式自動化發佈一則貼文到企業的 Facebook 粉絲專頁。

  • 細節講解:

    • 權限: 應用程式需具備 pages_manage_posts 權限,且必須使用粉絲專頁存取權杖(Page Access Token)。

    • 流程: 首先使用使用者權杖取得粉絲專頁權杖,然後用該專頁權杖發佈內容。

    • API 呼叫: 使用粉絲專頁 ID 作為節點,/feed 作為邊緣,並使用 POST 方法傳遞 message 參數。

  • 程式碼範例(概念):

    POST https://graph.facebook.com/v19.0/{PAGE_ID}/feed?message=Hello+World&access_token={PAGE_ACCESS_TOKEN}
    

案例 3:追蹤廣告活動數據

  • 目的: 定期從 Facebook Marketing API 獲取特定廣告活動(Campaign)的表現數據,如點擊次數。

  • 細節講解:

    • 權限: 需要 ads_read 或相關的廣告帳號權限。

    • 流程: 使用具備廣告帳號存取權的使用者權杖系統使用者權杖

    • API 呼叫: 呼叫廣告活動節點,並請求其 insights 邊緣,使用 fields 參數指定需要的數據指標(Metrics)。

  • 程式碼範例(概念):

    GET https://graph.facebook.com/v19.0/act_{AD_ACCOUNT_ID}/campaigns?fields=name,insights{clicks,spend}&access_token={USER_ACCESS_TOKEN}
    

💡 提示詞 (Prompt) 範例

Prompt 範例:

Facebook API 應用實務

請生成三個獨立的 Facebook API 應用案例,並條列式說明其細節:

  1. 如何獲取使用者在特定粉絲專頁上最近的十則留言(Comment)。

  2. 如何使用應用程式權杖檢查一個外部連結的分享計數(Share Count)。

  3. 如何透過 API 取得一個活動(Event)的參加者(Attendees)列表。


2. 🗄️ 資料庫架構考量

將 Facebook API 獲取的資料儲存和整合到自己的應用程式資料庫時,需要考慮到資料的同步性結構時效性

📌 步驟詳解

  1. 選擇資料庫類型:

    • 關係型資料庫(SQL): 適用於結構化程度高、資料間關係複雜(如使用者與貼文的關係)以及需要強一致性的場景。

    • 非關係型資料庫(NoSQL): 適用於高吞吐量、資料結構彈性大(如儲存原始 API JSON 回傳)、快速讀取和高擴展性的場景。

  2. 資料模型設計:

    • 最小化同步: 不要將所有 Facebook 資料都複製一份。只同步應用程式必需的欄位,並儲存 Facebook 的 ID

    • ID 作為主鍵: 許多 Facebook 物件(如 User、Post、Comment)都有唯一的數字或字串 ID。建議將其儲存為資料表中的唯一 ID,便於日後更新和查詢。

  3. 同步與更新策略:

    • 定期批次更新(Polling): 設定排程任務,定期(例如每小時)呼叫 API 檢查資料是否有更新。

    • Webhooks 即時通知: 註冊 Facebook Webhooks。當特定事件(如新留言、新貼文)發生時,Facebook 會主動向你的應用程式發送通知,實現準即時同步。這比定期 Polling 更有效率。

💡 案例分析 (3 個)

案例 1:同步粉絲專頁貼文到本地資料庫

  • 目的: 將粉絲專頁的貼文內容儲存到本地 SQL 資料庫中,用於自定義分析和展示。

  • 細節講解:

    • 模型: 創建一個 Posts 資料表。主鍵是 fb_post_id(Facebook 貼文 ID)。其他欄位包括 contentcreated_timelikes_count

    • 關係: 貼文可以與本地的 Pages 表通過外鍵 page_id 關聯。

    • 同步: 定期(如每 15 分鐘)呼叫 Graph API /page_id/posts 邊緣,只取得最新的貼文,並使用 UPSERT(或 INSERT ON DUPLICATE KEY UPDATE)操作來新增或更新現有貼文的 Likes 數量。

  • 資料表結構(概念):

    Table: Posts (SQL)
    - fb_post_id (VARCHAR, Primary Key)
    - page_id (VARCHAR, Foreign Key)
    - content (TEXT)
    - created_at (DATETIME)
    - likes_count (INTEGER)
    

案例 2:儲存 Webhooks 原始資料用於事件追蹤

  • 目的: 儲存 Facebook Webhooks 發送的所有即時事件通知,用於稽核和除錯。

  • 細節講解:

    • 模型: 使用 NoSQL 資料庫(如 MongoDB 或 DynamoDB),因為 Webhooks 的 JSON 結構可能因事件類型而異,結構彈性高。

    • 結構: 僅儲存時間戳和完整的原始 JSON 資料。無需預先定義欄位。

    • 流程: 應用程式接收到 Webhook 請求後,驗證簽名,然後直接將 JSON Payload 寫入 NoSQL 資料庫。

  • 資料結構(概念):

    Collection: WebhookEvents (NoSQL)
    - _id (MongoDB ObjectID)
    - event_type (STRING, e.g., "page_post")
    - received_at (DATETIME)
    - raw_payload (JSON Document)
    

案例 3:儲存和更新使用者權杖

  • 目的: 安全地儲存應用程式使用者的長效期存取權杖(Extended Access Token)。

  • 細節講解:

    • 模型: 創建一個 UserTokens 資料表,用於儲存權杖。

    • 安全性: 存取權杖屬於敏感資料,必須進行加密(例如使用 AES-256)後再儲存到資料庫。

    • 時效性: 必須儲存權杖的到期時間expires_at),並在每次使用前檢查其有效性。如果過期,提示使用者重新登入以獲取新權杖。

  • 資料表結構(概念):

    Table: UserTokens (SQL)
    - user_id (VARCHAR, Primary Key, Facebook User ID)
    - encrypted_token (TEXT, **加密後儲存**)
    - expires_at (DATETIME)
    - last_refreshed (DATETIME)
    

💡 提示詞 (Prompt) 範例

Prompt 範例:

Facebook 資料庫架構

請生成三個獨立的資料庫架構設計案例,並條列式說明其細節和選擇的依據:

  1. 設計一個架構來儲存從 Facebook 獲取的廣告受眾(Custom Audience)清單及其更新時間,並說明其同步策略。

  2. 設計一個架構來儲存應用程式內所有使用者的朋友名單(如果 API 允許獲取),並解釋如何處理資料的去正規化以優化讀取速度。

  3. 設計一個流程來處理 Facebook 廣告數據報告(Report)的儲存,這些報告數據量龐大且具備時間序列特性,請說明如何利用 NoSQL 的優勢。

留言