Facebook 的分享預覽爬蟲不會讀取數值型的 Page ID;它會從你頁面的 HTML head 讀取 Open Graph 標籤。對大多數分享預覽來說,透過 Graph API 查詢 Page ID 是錯誤的方向 —— Open Graph Protocol 中並沒有 og:page_id 屬性,Facebook 的爬蟲也從來不會向你頁面請求這項資料。爬蟲實際請求的是四個必要的 Open Graph 屬性:og:title、og:type、og:image 與 og:url,以 meta 元素的形式放在標準頁面的 head 內。Open Graph Generator 正是依據這個協定,從安全輸入產生完全符合規範的區塊,且整個流程都在覽器中執行,不需要應用程式註冊、存取權杖或 Graph API 呼叫。唯有當你想透過程式發布貼文、讀取留言或管理 Facebook 粉絲專頁時,才會需要數值型的 Page ID —— 這些動作屬於需要驗證的 Graph API 呼叫,與分享預覽無關。如果目標是在 Facebook、LinkedIn、Slack、Discord 或任何其他支援 Open Graph 的平台上產生分享預覽,正確做法是在自己的頁面上提供格式正確的 Open Graph metadata,並在部署後透過各平台的除錯工具進行驗證。

how to get page id facebook graph api
用於 Open Graph 標籤的 Facebook Graph API Page ID

為什麼 Graph API Page ID 並非分享預覽所讀取的內容

當 URL 被貼到 Facebook 的發文框時,平台會派出一個爬蟲前往目的地。該爬會抓取頁面、解析 HTML head,並讀取所有找到的 og:* meta 元素。四個必要的 Open Graph 屬性 —— og:title、og:type、og:image 與 og:url —— 共同描述了可分享的 graph object,這就是預覽所顯示內容的完整合約。協定端並沒有任何欄位接受 Facebook Page ID;這個協定刻意採用以頁面為導向的設計,讓任何網站(無論是否擁有 Facebook 帳號)都能產生分享預覽。

Graph API 的端點,例如 /{page-username}?fields=id 或 /{page-id}?fields=link,雖然會回傳數值型識別碼,但這些數字無法塞進 meta 標籤中。它們適合用於應用程式權杖、貼文自動化、留言抓取與粉絲專頁管理 —— 這些都不是分享預覽會用到的功能。將查詢 Page ID 視為分享預覽的入口,是一種分類上的錯誤,會浪費時間在應用程式審查、存取權杖與爬蟲根本不會讀取的權限上。

Open Graph Protocol 真正要求的內容

Open Graph Protocol 定義了四個必要的基本屬性,而產生器每次都會以固定的順序優先輸出它們:

  • og:title —— 為分享物件命名。經過修剪、長度限制,並針對 HTML 屬性進行跳脫處理,確保 &、"、<、> 等字元不會破壞 meta 元素。
  • og:type —— 為物件分類。產生器刻意將此限制為 website 或 article;music、video、profile 等其他結構化類型需要額外的類型專屬欄位,這份精簡表單並未提供。
  • og:image —— 提供代表性的圖片。必須是不含內嵌認證資訊或片段(fragment)的絕對 HTTP 或 HTTPS URL。
  • og:url —— 識別永久物件。同樣必須是絕對的 HTTP 或 HTTPS URL,不能包含片段或認證資訊。

缺少任何必要值時,輸出會被封鎖,而不會產生不完整的預覽區塊。協定生態系允許更多類型與更多屬性,但那些屬於專門實作的範疇。有效的 Open Graph 區塊仍無法保證貼文實際呈現的方式 —— 分享系統可能會裁切圖片、截斷文字、忽略欄位、選擇快取資料,或套用帳號層級的政策。應將各平台的除錯工具(而非僅看協定規格)視為呈現方式的最終依據。

使用 Open Graph Generator 建立分享預覽 metadata

產生器在瀏覽器中完成所有工作,於執行階段驗證輸入,並以固定的順序回傳基於屬性的 meta 區塊。請依照下列三個步驟部署可正常運作的預覽。

  1. 輸入正確的物件文字、選擇 website 或 article,並提供不含片段、公開可存取的頁面與圖片 URL。瀏覽器的 URL parser 會將其正規化;此工具不會實際抓取任何端點。不含片段的物件 URL 可避免同一資源因前端錨點不同而分散於多則分享中;拒絕認證資訊則可避免將使用者資訊複製到公開的 metadata 中。
  2. 產生必要與選用的 Open Graph 屬性,然後將僅含協定的區塊複製到標準頁面的 head 中。產生器會先輸出四個必要屬性,接著是你提供的任何選用屬性,例如 og:description、og:site_name 與 og:locale。選用文字會經過修剪、長度限制、含控制字元時予以拒絕,並針對 HTML 屬性進行跳脫。物件類型會在執行階段重新驗證,即使表單使用的是 select 控件也是如此,因此被竄改或透過程式送入的輸入無法帶不支援的類型。
  3. 檢查實際部署的原始碼,並使用每個目標平台目前的預覽除錯工具來確認抓取存取、圖片處理與快取更新。建置工具可能會重新排序、覆寫或新增衝突的屬性,因此已部署的 HTML head 才是最終的檢查依據。在平台的爬蟲首次讀取頁面後,即使 metadata 之後更新,它仍可能繼續顯示較舊的快取預覽 —— 每個服務都會記載各自的快取更新行為。

必要與選用屬性一覽

下表彙整產生器輸出的內容、輸出順序,以及每個值的處理方式。所有屬性值皆經過跳脫,所有 URL 皆經過正規化,四個必要屬性會排在任何選用屬性之前。

屬性是否必要用途產生器行為
og:title必要為分享物件命名經修剪、長度限制、HTML 跳脫
og:type必要為物件分類僅限 website 或 article;執行階段重新檢查
og:image必要代表性圖片絕對 HTTP(S),不含認證與片段;不會實際抓取
og:url必要標準物件 URL絕對 HTTP(S),不含認證與片段
og:description選用預覽摘要文字經修剪、拒絕控制字元、HTML 跳
og:site_name選用標示所屬網站經修剪、長度限制、HTML 跳脫
og:locale選用language_TERRITORY(例如 en_US)保守的兩字母語系加兩字母地區代碼

語系驗證器刻意只接受「兩字母語系 + 兩字母地區」的保守格式。替代語系與 script 子標籤需要額外的協定屬性與編輯決策,已超出這份精簡表單的範圍,因此產生器會拒絕任何更複雜的輸入,而不是產出表面上看似正確、實際上錯誤的值。

驗證抓取存取、圖片處理與快取狀態

產生器無法驗證 HTTP 狀態、MIME 類型、圖片尺寸、位元組大小、長寬比、重定向、robots 規則、認證或平台快取狀態。每個社群服務都有自己的圖片要求;即使你的協定區塊通過驗證,也無法說明平台另一端會如何呈現。請將分享預覽流程視為兩個階段:你部署的頁面,以及每個平台保留的快取。

在 meta 區塊放入標準頁面的 head 之後,請開啟每個目標平台目前的預覽除錯工具,貼上頁面 URL 並要求重新抓取。將呈現出的預覽與已部署的原始碼進行比對 —— 標題、說明、圖片與 URL。若預覽仍顯示舊內容,代表平台快取了較舊的版本;請參考該服務的說明文件以了解其快取更新行為,並在支援時手動觸發更新。若預覽為空白或不正確,最常見的原因包括爬蟲被封鎖、圖片回傳非 2xx 狀態、圖片 MIME 類型錯誤,或圖片不符合該平台的最低尺寸。協定區塊在建構上即為正確;平台預則是另一個獨立的驗證步驟。

導致預覽失效的常見錯誤

大多數預覽失敗來自通過產生器驗證、卻在真實爬蟲存取真實頁面時才暴露出問題的輸入。請特別留意以下情況:

  • URL 中包含片段或認證資訊。og:url 或 og:image 中的 #section 或 ?token=... 會被產生器正規化移除;如果你繞過產生器、手動撰寫 meta 標籤,片段會保留下來,破壞標準訊號。
  • 圖片無法從公開網路抓取。產生器只驗證 URL 格式,不會實際抓取。需要登入、防盜連、robots 封鎖或回傳非 2xx 的圖片,都會通過表單驗證,卻在平台爬階段失敗。
  • 圖片尺寸或 MIME 類型錯誤。每個平台都有自己的最低限制。在協定端通過驗證的 og:image URL 並不代表滿足該平台的位元組大小、長寬比或檔案格式規則。
  • 快取過期。即使 metadata 已更新,平台仍可能持續顯示舊的預覽。每個服務都有自己的更新週期與手動發機制。
  • 內容具有誤導性。標題、說明或圖片若與頁面實際內容不符,可能吸引點擊卻讓使用者失望。請撰寫能真實反映頁面內容的 metadata。

若你在發布頁面前打算透過 Graph API「取得 Page ID」,請先停下來:API 路線適用於發文與管理,Open Graph metadata 路線才適用於分享預。只要透過 Open Graph Generator 跑一次,再搭配各目標平台的除錯工具檢查,就能解決 Page ID 查詢從未打算處理的問題。若你想更精確地了解是否仍需要 API 權杖,請參考 Graph API 存取權杖取得教學