返回部落格
論壇社群

PTT 貼圖為什麼打不開?我挖了 term.ptt.cc、PttChrome 原始碼,規則其實有 4 套

發佈於18 min read
分享文章

貼了連結卻不會自動開圖?我一開始也以為是自己貼錯格式

PTT 上問圖床的人,最常卡住的其實不是「哪個圖床好用」,是「同一個連結,在手機 App 上會自動變成縮圖,換成電腦網頁版卻只剩一串網址」。

這不是巧合,也不是你貼錯格式。PTT 這三個字底下,其實藏著至少四種完全不同的軟體,各自用不同的邏輯判斷「這個網址要不要自動變成圖片」。有的看副檔名,有的看網域白名單,有的兩個條件都要滿足。還有一種做法更誇張,直接跳過副檔名檢查,賭的就是你貼的是 Imgur——這套規則我後面會講到。

PTT ask 板 2025 年 10 月有一串討論在問「支援自動開圖的圖床有哪些」,原po 提到 term.ptt.cc 以前把滑鼠移到 Imgur 連結上會自動浮現圖片,但半年前開始失效了。這句話點出了一個很多人沒意識到的事實:同一個 client、同一個圖床,規則會隨時間改變,而且沒有人統一公告。與其道聽塗說,我把幾個主要 client 的原始碼挖出來直接讀,這篇整理的每一格都附得出證據來源。

PTT 看圖其實有 5 條路徑,不是「PTT」一種東西

先把場景釐清,不然後面的表格會看得一頭霧水。

  • BBS 純文字終端(PCMan、Welly):只認文字,圖片連結永遠是一串字,不會自動變圖。
  • www.ptt.cc 網頁版文章:讀文章網頁時,伺服器端會把符合規則的網址直接轉成 <img> 標籤。
  • term.ptt.cc:網頁版終端機模擬器,滑鼠移到連結上會彈出圖片預覽,靠前端 JavaScript 判斷。
  • PttChrome:歷史悠久的瀏覽器 telnet client,圖片直接嵌進文章畫面裡。
  • 手機 App(Mo PTT、JPTT、PiTT、BePTT):把連結轉成縮圖直接顯示,這塊是閉源軟體,只能靠社群回報和官方說明推敲。

前兩種和後三種的差異,其實比你想的還大。

我把原始碼挖出來看——4 套規則,沒有一套一樣

www.ptt.cc 網頁版文章:伺服器端判斷,副檔名優先,但不吃 WebP

www.ptt.cc 的網頁前端叫 pttweb,原始碼公開在 GitHub 的 ptt/pttweb repo。負責把文章裡的網址轉成圖片的檔案是 richcontent/url_based_finder.go,裡面有一份依序比對的規則清單:

var defaultUrlPatterns = []*UrlPattern{
    newUrlPattern(`^https?://(?:www\.youtube\.com/watch\?(?:.+&)*v=|youtu\.be/)([\w\-]+)`, handleYoutube),
    newUrlPattern(`^https?://i\.imgur\.com/([\w]+)\.((?i)png|jpeg|jpg|gif)$`, handleImgurSingle),
    newUrlPattern(`^http://picmoe\.net/d\.php\?id=(\d+)`, handlePicmoe),
    newUrlPattern(`\.(?i:png|jpeg|jpg|gif)$`, handleGenericImage),
}

重點在最後一條。前三條是針對 YouTube、Imgur、picmoe.net 的專屬規則,第四條才是關鍵:任何網址,只要結尾是 .png、.jpeg、.jpg 或 .gif(大小寫都算),不管是哪個圖床,一律會被包成 <img> 標籤直接顯示。 這代表 www.ptt.cc 網頁版文章其實是「認副檔名、不認網域」的邏輯,跟 term.ptt.cc 完全相反。

但這條規則要求網址結尾就是副檔名,後面不能接查詢字串(regex 用 $ 鎖死結尾)。如果圖床給的直連是 xxx.jpg?token=abc123 這種帶參數的格式,就不會命中最後一條規則。另外,.webp 完全不在清單裡——這代表就算你貼的是一個貨真價實的 WebP 直連圖檔,www.ptt.cc 網頁版文章照樣不會自動展開,只會留一個網址。這點我在其他整理 PTT 貼圖格式的文章裡沒看過有人講清楚。

term.ptt.cc:網域白名單優先,副檔名是第二關

term.ptt.cc 的原始碼在 GitHub 的 ptt/ptt-term,是一個用 WebSocket 連 BBS 的網頁終端機。負責滑鼠懸浮開圖的模組是 src/plugins/media_previewer/image_preview_util.js,裡面直接寫死了預設信任的網域清單:

export const INITIAL_TRUSTED_IMAGE_DOMAINS = [
  "imgur.com", "imgtok.com", "meee.com.tw", "duk.tw",
  "upload.cc", "ibb.co", "imgbb.com", "postimg.cc",
  "twimg.com", "gyazo.com",
];

看到了嗎?這份清單裡沒有 urusai.cc,也沒有 vgy.me,更沒有 lpic.cc。但 PTT ask 板上明明有人說 urusai.cc、vgy.me 在他那邊自動開圖開得很順。矛盾嗎?其實不矛盾——程式碼裡同時有一個 parseTrustedDomains 函式,代表這份白名單是可以在設定裡自行加網域的,預設值只是「開箱即用」的十家,不是全部。換句話說,那位鄉民很可能自己把 urusai.cc 加進了個人設定,而不是 term.ptt.cc 對所有人都內建支援。這是一個容易被誤會成「全站規則」的地方。

判斷邏輯本身分兩層:Imgur 有專屬正則,就算網址沒帶副檔名也認得出來;pbs.twimg.com/media/ 開頭的連結不檢查副檔名直接放行;除此之外的白名單網域,網址結尾必須符合 .jpg、.jpeg、.png、.gif、.webp 或 .bmp(帶查詢字串也算數,這點跟 www.ptt.cc 網頁版不一樣)。也就是說,term.ptt.cc 是「網域 AND 副檔名」雙重門檻,兩個條件都要過。

PttChrome:只認網域,連副檔名都懶得看

PttChrome 是更早期的產物,經典版本的維護者是 iamchucky/PttChrome。負責畫面上圖片預覽的檔案是 js/term_view.js,選取要處理的連結時用的是這一段 jQuery selector:

var aNodes = $(".main a[href^='http://ppt.cc/'], .main a[type='p'], " +
  ".main a[href^='http://imgur.com/'], .main a[href^='https://imgur.com/'], " +
  ".main a[href^='https://flic.kr/p/'], .main a[href^='https://www.flickr.com/photos/']")
  .not("a[href^='http://imgur.com/a/'], a[href^='https://imgur.com/a/'], " +
       "a[href^='http://imgur.com/gallery/'], a[href^='https://imgur.com/gallery/']");

這就尷尬了。PttChrome 完全不檢查副檔名,只認網址開頭——白名單裡只有 ppt.cc 短網址、imgur.com(排除相簿與 gallery 頁)、flic.kr、flickr.com/photos。urusai.cc、vgy.me、duk.tw、meee、ImgBB、Postimages、lpic.cc 通通不在清單裡,貼再標準的直連也不會被 PttChrome 自動展開,永遠只是一行藍色網址。更有趣的是它處理 Imgur 連結的方式:程式碼裡直接把網址改寫成 i.imgur.com/ID.jpg,寫死副檔名是 .jpg,不管你原圖其實是 PNG 還是 GIF。這算是一個從十幾年前留到現在的小雷,平常不會有人發現,因為 Imgur 對副檔名不符的請求通常還是會正確回傳圖片。

手機 App(Mo PTT、JPTT、PiTT):閉源,只能拼社群證據

老實講,這塊我沒辦法給你原始碼等級的答案。Mo PTT、JPTT、PiTT 都是閉源商業 App,GitHub 上找不到對應的原始碼倉庫。我能找到的最紮實證據,是 PTT ask 板兩篇時間相近的討論串(分別在 2025 年 6 月和 10 月發文),裡面鄉民實測回報的行為:meee.com.tw 手動補上 .jpg 副檔名就能自動開圖、urusai.cc 的 i.urusai.cc/ID.png 格式可以、imgpoi.com 被質疑「根本沒有自動開圖」。這些描述都指向「App 認副檔名」的方向,跟 www.ptt.cc 網頁版的邏輯比較接近,但沒有人拿得出這幾款 App 的原始碼或官方技術文件證實網域是否也有白名單限制。這格我明確標成未驗證,不裝作親自拆過它們的程式碼。

4 套規則放在一起比較

Client 判斷依據 副檔名要求 WebP 證據等級
www.ptt.cc 網頁版文章 只認副檔名,不認網域 結尾必須是 .jpg/.jpeg/.png/.gif,禁帶查詢字串 不支援 原始碼(ptt/pttweb)
term.ptt.cc 網域白名單 + 副檔名雙門檻 白名單網域中結尾需為 .jpg/.jpeg/.png/.gif/.webp/.bmp,可帶查詢字串 支援 原始碼(ptt/ptt-term)
PttChrome 只認網域,不檢查副檔名 不檢查(Imgur 連結會被強制改寫成 .jpg) 不適用 原始碼(iamchucky/PttChrome)
手機 App(Mo PTT/JPTT/PiTT) 疑似認副檔名 疑似 .jpg/.png/.gif 可行 未驗證 社群回報,未見原始碼

看完這張表你大概懂了:沒有一套「PTT 通用規則」這種東西。 同一個圖床連結,四種 client 可能給你四種結果。

圖床 × Client 相容表:哪個連結貼哪裡才會自動開圖

這張表是我對照上面每套規則、逐一比對常見圖床的直連格式整理出來的。「✅」代表照規則邏輯應該會自動展開,「❌」代表不會,「⚠️」代表要看你有沒有手動調整設定或副檔名。

圖床(直連格式範例) www.ptt.cc 網頁版 term.ptt.cc(預設) PttChrome App(社群回報)
Imgur i.imgur.com/ID.jpg ✅ ✅ ✅(會被強制轉 .jpg) ✅
meee meee.com.tw/ID.jpg ✅ ✅ ❌ ✅(需手動補副檔名)
duk.tw ✅(若帶副檔名) ✅ ❌ 未驗證
urusai.cc i.urusai.cc/ID.png ✅(若帶副檔名) ⚠️ 需自行加入白名單 ❌ ✅(社群回報)
vgy.me ✅(若帶副檔名) ⚠️ 需自行加入白名單 ❌ 未驗證,社群稱「最麻煩」
ImgBB ibb.co / i.ibb.co ✅(若帶副檔名) ✅ ❌ 未驗證
Postimages postimg.cc ✅(若帶副檔名) ✅ ❌ 未驗證
lpic.cc lpic.cc/{code} ❌(無副檔名) ❌(不在白名單,且無副檔名) ❌ ❌(無直連可貼)

最後一列我要老實講清楚。

lpic.cc 現在能不能貼到 PTT 自動開圖?不能,這是目前的限制

寫這篇之前我把 lpic.cc 自己的分享連結格式重新確認了一遍。目前上傳完拿到的網址是 https://lpic.cc/{短碼} 這種作品頁面連結,不是像 i.imgur.com/xxx.jpg 那樣結尾就是圖檔副檔名的直連——這代表不管是 www.ptt.cc 網頁版的副檔名規則,還是 term.ptt.cc、PttChrome 的網域白名單,都吃不到它。分享頁面本身會顯示縮圖沒錯,但那是打開頁面才看得到,不是「貼連結自動展開」。

說真的,這對想在 PTT 直接開圖的人不算好消息,我不打算包裝成別的樣子。如果你的需求就是貼連結讓 App 自動變縮圖,目前上表裡打勾的圖床(Imgur、meee、term.ptt.cc 白名單內的幾家)比較適合。lpic.cc 這種分享頁面模式的優點在別的地方——密碼保護、瀏覽次數、留言區這些頁面互動功能,比較適合你想控制「誰能看、看了會不會被記錄」的場合,例如交易截圖或私密內容,貼連結請對方點進去看,而不是丟出去讓所有路人自動看到縮圖。兩種需求本來就不一樣,硬套會用得不順手。

那到底該怎麼選?

如果你只在乎「貼上去馬上自動開圖」,看你主要用哪個 client 決定:手機 App 為主就選 Imgur 或有補副檔名習慣的 meee;網頁版看文章為主,任何有標準副檔名直連的圖床都行,但記得 WebP 在 www.ptt.cc 網頁版完全不吃;用 term.ptt.cc 的話,先確認圖床在不在你自己的白名單設定裡,不在的話記得手動加。

如果你要跨多個 client 都通用,Imgur 目前仍是唯一四套規則都吃得下去的選項——代價是它已經封鎖台灣 IP 上傳,這件事我在 PTT 圖床發文教學 裡有更完整的整理。真的沒有一個圖床能讓你在所有情境都不用煩惱格式,這件事我踩過雷,也沒必要幫哪個圖床說場面話。

常見問題 FAQ

Q1:為什麼同一個 Imgur 連結,昨天還能自動開圖,今天卻不行了?

Imgur 從 2025 年 5 月開始封鎖台灣 IP,如果你人在台灣,連 i.imgur.com 本身就可能連不上,跟 PTT client 的規則無關。另外 PttChrome 會把 Imgur 連結強制改寫成 .jpg 結尾,如果原圖是透明背景的 PNG,畫質或透明度可能會跑掉,但這不影響「開不開得了圖」,只影響顯示效果。

Q2:term.ptt.cc 的信任網域清單可以自己修改嗎?

從原始碼看,parseTrustedDomains 這個函式支援讀取自訂清單,代表這是一個可調整的設定,不是寫死不能改的規則。實際操作介面在哪裡調整、要不要重新整理頁面才生效,我沒有實測到操作路徑,這部分建議直接到 term.ptt.cc 的設定選單裡找找看。

Q3:手機 App 到底看不看網域白名單,你怎麼沒有肯定答案?

因為 Mo PTT、JPTT、PiTT 都是閉源軟體,我找不到公開原始碼可以逐行核對。這篇文章對這三款 App 的描述全部來自 PTT ask 板的鄉民實測回報,不是我自己拆解程式碼得到的結論,這點我在文章裡已經標成未驗證,不會假裝自己驗證過。

Q4:為什麼 www.ptt.cc 網頁版不支援 WebP,但 term.ptt.cc 支援?

因為這是兩套完全獨立的程式碼,一套是伺服器端 Go 寫的 pttweb,一套是前端 JavaScript 寫的 ptt-term,維護者不同、開發時間點也不同。WebP 格式普及是比較後期的事,pttweb 這條規則顯然沒有跟著更新。這正是這篇文章想強調的重點:PTT 不是一個統一的系統,是好幾套獨立軟體湊出來的生態。

Q5:如果我想要一個連結,在所有 PTT client 都能自動開圖,該怎麼組合?

沒有單一連結能滿足所有情境,但最接近的做法是:確認圖床提供的直連結尾是標準副檔名(.jpg/.png/.gif,避免只用 WebP)、不要帶查詢字串、優先選 term.ptt.cc 預設白名單內的圖床(Imgur、meee、duk.tw、ImgBB、Postimages 都在清單上)。PttChrome 使用者則沒有太多選擇,目前只有 Imgur 和 Flickr 吃得到。

參考來源

#PTT#term.ptt.cc#PttChrome#圖床#自動開圖#PTT App#論壇貼圖#圖片直連
A

作者

Alex Chen

產品實測員

每款工具都親手測過,用第一人稱帶你體驗真實使用感受。