問題描述

我要把臉書貼文貼到其他網站作為引用資料來源,連結必須是永久連結,且文字能顯示相關資訊(理想是顯示貼文的「標題」)而不是「Facebook」「影片」這樣的文字。

實際作業會發現連結格式很亂,有些情況甚至是「登入後」看不到標題(網頁 title),反而要登出才有。

成果

Greasyfork → Facebook 取得帶標題連結,原始碼也放在 GitHub

在頂端塞一個小元件,把文章的「時間戳記連結」拖曳進去,就會找出「帶標題的連結」,顯示在一個小對話框,可以複製 HTML。

研究

每篇貼文的連結 URL,大家都是由網頁上「時間戳記」的部分取得(臉書主要只曝露在這裡),然而根據貼文露出方式(在動態牆、彈出對話框、影片推廣等),同一篇貼文有多種不同連結,點進去看到的可能也不一樣。

連結就在「時間」上面

只能盡量列舉處理,想辦法轉換成「標題最完整」的連結構造。

也參考 Facebook 登入牆移除器(有提供「永久連結/標準網址」功能)已處理的各種格式,它還有從網頁 meta 甚至 JS relay(臉書的內部實作)偵測標準連結的實作(我沒有做)。

目前已知的格式

  • 使用者貼文 /{user}/posts/{id}

    例如 https://www.facebook.com/twreporter/posts/pfbid0bDDP6YCaEfULbAjBruvVbHVySX2iemoHCQRnaeKipNtbpDcx2Tz71WUqDnQZdWDTl?__cft__[0]={省略}&__tn__={省略}

    把追蹤參數移除即可,標準網址為: https://www.facebook.com/twreporter/posts/pfbid0bDDP6YCaEfULbAjBruvVbHVySX2iemoHCQRnaeKipNtbpDcx2Tz71WUqDnQZdWDTl

  • 群組內的貼文 /groups/{group}/posts/{id}

    例如 https://www.facebook.com/groups/Show.YMSNP/posts/1532962150583712/?__cft__[0]={省略}&__tn__={省略}

    也是移除追蹤參數即可。

  • 有永久連結參數 /groups/{group}/?multi_permalinks={id}

    例如 https://www.facebook.com/groups/667899516591545/?multi_permalinks=26147630041525142&notif_id={省略}&notif_t=feedback_reaction_generic&ref=notif

    移除追蹤參數,並統一轉為 posts/{postId} 格式: https://www.facebook.com/groups/667899516591545/posts/26147630041525142

  • 影片:Reel /reel/{id}

    例如 https://www.facebook.com/reel/1421756105769991/?__cft__[0]={省略}&__tn__={省略}

    移除追蹤參數,並統一轉為 video.php?v= 格式: https://www.facebook.com/video.php?v=1421756105769991

  • 影片:Watch /watch/?v={id}

    例如 https://www.facebook.com/watch/?v=1221241823458045

    移除追蹤參數,並統一轉為 video.php?v= 格式: https://www.facebook.com/video.php?v=1221241823458045

  • 影片:使用者貼文 /{user}/videos/{id}/

    例如 https://www.facebook.com/FANCA.Taiwan/videos/653740892754035/

    這個形式帶有 user 資訊,比前面只有 id 的品質好,所以移除參數即可,盡量保留原狀。

無能為力

  • 時間戳記的卵連結

    從「時間戳記」取得連結有一個限制,就是連結剛出現時,上面 URL 的值是隱蔽、編碼過的,這是臉書的設計,要等使用者互動時(例如滑鼠移到該連結上)才會動態變換為我們要的 URL。

    沒辦法,只好麻煩使用者手動滑一下。

  • 實在抓不到標題

    前面的研究,最後仍無法 100% 應付所有情境,有發現一些貼文出現在首頁動態牆時,看起來是有文字敘述的,但從那個連結就是只能連到降級的網頁,除非進入貼文作者的頁面找出原文,否則就是拿不到文字。

    不強求,只要最後拿到標題仍是「Facebook」這樣,就放棄,顯示警告就是了:

    🦴☠️ 只找到預設標題,可能需手動探索才能發現文字敘述(如果有的話)