PTT贴图总打不开?扒了term.ptt.cc和PttChrome源码,才发现规则有4套
贴吧能外链的图床,PTT不一定认——这事我踩过坑
如果你在百度贴吧或者早年的QQ空间发过外链图片,应该有印象:不是所有图床都能被认出来,有的直接显示裂图,有的干脆连缩略图都不生成。PTT这边的坑更隐蔽——同一个链接,手机App上自动变成缩略图,换成电脑网页版打开同一篇文章,却只剩一行光秃秃的网址。
这不是你格式贴错了。PTT这三个字母底下,其实塞了至少四套完全不同的软件,各自用不同的逻辑判断"这个链接要不要自动转成图片"。有的只看后缀名,有的靠域名白名单,还有的两个条件都得满足才行。最离谱的一种做法是直接跳过后缀名检查,赌你贴的就是Imgur——这个我后面会细说。
PTT上问图床的人,最常卡住的其实不是"哪个图床好用",而是这种同一链接、不同客户端结果完全不一样的分裂感。PTT的ask板(board的意思,PTT把每个讨论区叫做"板")2025年10月正好有一串讨论在问"支持自动开图的图床有哪些",原PO(原发帖人,PTT术语,类似楼主)提到term.ptt.cc以前鼠标移到Imgur链接上会自动弹出图片预览,半年前开始就失效了。这句话点出一个很多人没意识到的事实:同一个客户端、同一个图床,规则会随时间变化,而且没有人统一公告。与其道听途说,我把几个主要客户端的源码直接挖出来读,这篇整理的每一格都能追溯到出处。
PTT看图其实有5条路径,别当成一个整体来理解
先把场景理清楚,不然后面的表格容易看晕。
- BBS纯文本终端(PCMan、Welly):只认文字,图片链接永远是一串字符,不会自动变图。
- **www.ptt.cc网页版文章**:读文章网页时,服务器端会把符合规则的链接直接转成`
`标签。
- term.ptt.cc:网页版终端模拟器,鼠标悬停到链接上会弹出图片预览,靠前端JavaScript判断。
- PttChrome:历史悠久的浏览器telnet客户端,图片直接嵌进文章画面里。
- 手机App(Mo PTT、JPTT、PiTT、BePTT):把链接转成缩略图直接显示,这块是闭源软件,只能靠社区回报和官方说明推敲。
前两种和后三种的差异,比想象中要大得多。
扒开源码看4套规则,没有一套是相同的
www.ptt.cc网页版:服务端判断,认后缀名,但不认WebP
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正好相反。
但这条规则要求链接结尾就是后缀名,后面不能再带查询字符串(正则用$锁死结尾)。如果图床给的直链是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函数,说明这份白名单是可以在设置里自行加域名的,默认值只是"开箱即用"的十家,不是全部。换句话说,那位乡民(PTT对论坛用户的称呼)很可能自己把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选择器:
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套规则放一起对比
| 客户端 | 判断依据 | 后缀名要求 | 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通用规则"这种东西。 同一个图床链接,四种客户端可能给出四种结果。
图床×客户端兼容表
这张表是我对照上面每套规则、逐一比对常见图床直链格式整理出来的。"✅"代表按规则逻辑应该会自动展开,"❌"代表不会,"⚠️"代表要看有没有手动调整设置或后缀名。
| 图床(直链格式示例) | 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} |
❌(无后缀名) | ❌(不在白名单,且无后缀名) | ❌ | ❌(无直链可贴) |
最后一行得老实说清楚。
对照一下:国内论坛的图片外链规则,逻辑其实更简单粗暴
说到这我想起一件事——国内几个老牌社区处理外链图片的方式,比PTT这四套规则简单不少,但坑也不少。百度贴吧对外链图片基本是"防盗链"逻辑:检测到Referer不是贴吧域名就直接拒绝返回图片,跟PTT这种"看后缀名或域名白名单"的思路完全不同,很多老图床链接贴过去直接显示裂图,不是链接格式的问题,是对方服务器根本不给数据。微博的图片外链更早以前就被大量限制,第三方图床链接贴进微博正文基本上不会自动渲染,普遍做法是先上传到微博自己的图床再发。小红书则干脆连外链都不太支持粘贴展示,图片必须走站内上传流程。
对比下来会发现,PTT这四套规则虽然分裂,但至少还留了"贴对格式就能生效"的空间;国内主流平台大多数直接在服务端把外链图片这条路堵死了,逼着你只能用平台自带的图床功能。这也是为什么很多人在国内习惯了"图片必须本地上传",一到PTT这种还保留外链生态的论坛,反而不知道该怎么判断格式对不对。
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这种分享页面模式的优点在别的地方——密码保护、浏览次数、留言区这些页面互动功能,更适合想控制"谁能看、看了会不会被记录"的场合,比如交易截图或私密内容,贴链接请对方点进去看,而不是丢出去让所有路人自动看到缩略图。两种需求本来就不一样,硬套会用得别扭。
到底该怎么选?
如果只在乎"贴上去马上自动开图",看主要用哪个客户端来决定:手机App为主就选Imgur或有补后缀名习惯的meee;网页版看文章为主,任何有标准后缀名直链的图床都行,但记得WebP在www.ptt.cc网页版完全不吃;用term.ptt.cc的话,先确认图床在不在自己的白名单设置里,不在的话记得手动加。
要跨多个客户端都通用,Imgur目前仍是唯一四套规则都吃得下的选项——代价是它已经封锁台湾IP上传,这件事在PTT图床发文教程里有更完整的整理。真的没有一个图床能让你在所有场景都不用操心格式,这个坑我踩过,也没必要替哪个图床说场面话。
常见问题FAQ
Q1:为什么同一个Imgur链接,昨天还能自动开图,今天却不行了?
Imgur从2025年5月开始封锁台湾IP,如果你人在台湾,连i.imgur.com本身就可能连不上,跟PTT客户端的规则无关。另外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:大陆用户能直接访问term.ptt.cc或www.ptt.cc吗?
能,PTT本身是台湾的BBS服务,从大陆网络环境访问网页版和term.ptt.cc通常没有额外限制,不像访问某些境外图床(例如Imgur对台湾IP的封锁)那样受地区限制影响。但访问速度取决于跨境线路质量,晚高峰偶尔会慢,这跟本文讲的开图规则是两回事。
参考来源
- [請問] 支援PTT自動開圖的圖床 — PTT ask板
- Re: [請問] 支援PTT自動開圖的圖床 — PTT ask板
- ptt/pttweb — PTT BBS Web Frontend源码,
richcontent/url_based_finder.go - ptt/ptt-term — term.ptt.cc源码,
src/plugins/media_previewer/image_preview_util.js - iamchucky/PttChrome — PttChrome源码,
js/term_view.js - 2026 PTT发文怎么贴图完整教程 — lpic.cc博客