twitter card 实测 26 个首页:22 个声明了卡片,og 对不上的只有 1 个
twitter card 那一套标签 26 个首页里 22 个还在写,但大部分是重复劳动:全样本 113 个 twitter 标签对 158 个 og 标签,22 个站声明卡片类型、20 个填同一个值,而「旧标签盖住新标签」只出现了 1 次。

实测 · 2026-08-27 · 26 个首页 · 一次抓取 · 只看原始 HTML
样本 / 口径:2026-08-15 起一直在用的那 30 个站,2026-08-27 各抓一次,浏览器 UA,不渲染。逐条读出 name 或 property 以 twitter: 或 og: 开头的 <meta>,记下取值、写在哪个属性上、在不在 <head> 里。
twitter card 那一套标签,26 个首页里 22 个还在写,但大部分是重复劳动。全样本 twitter: 标签 113 个,og: 标签 158 个。22 个站声明了 twitter:card,其中 20 个填的是同一个值。至于「旧的 twitter 标签悄悄盖住新的 og 标签」这个所有教程都在警告的翻车点,26 个站里出现了 1 次,1 个属性,1 个站。
怎么测的
每站一次 HTTP 请求,不渲染,不重试。纳入规则在跑数之前就写死了:最终状态 200、解压后正文至少 10,000 字节、正文里有 <body。30 个里挂了 4 个 —— www.canva.com 返回 429,stackoverflow.com 和 medium.com 返回 403,www.reddit.com 返回一个 8,393 字节的空壳,剩下 26 个。比前四批少一个,少的那个是 Canva 的限流,不是 Canva 改了什么。
只要解析器读到了就算声明,不管写在哪个属性上。这一条比听起来重要:Open Graph 的值该写在 property 上,X 的卡片标签该写在 name 上,而本样本里有两个站正好写反了。只认正确拼法的话,这两条会被直接抹掉。
# 在自己的页面上数一遍
curl -sL --compressed -A 'Mozilla/5.0' https://example.com/ \
| grep -o '<meta[^>]*\(twitter\|og\):[^>]*>' | wc -l
这次没测任何一页真正分享出去长什么样。那要在每个平台各发一条真帖,而以前能回答这个问题的卡片校验器现在都在登录墙后面。下面全部是标记层写了什么,不是预览渲染成了什么。
twitter card:26 个站 22 个声明了,20 个填同一个值
卡片类型是唯一一个在 Open Graph 里找不到对应物的值,也是被记住得最牢的一个。两个首页一条 twitter: 标签都没有,其中一个连 og: 也没有。
| 标签 | 站数 | 回退到 |
|---|---|---|
twitter:card | 22 | og:type(部分) |
twitter:title | 20 | og:title |
twitter:description | 20 | og:description |
twitter:image | 19 | og:image |
twitter:site | 15 | 没有 |
twitter:image:alt | 1 | og:image:alt |
22 张卡片里,20 张是 summary_large_image,2 张是 summary——Substack 和 MDN,两家的卡片都指向一张方形 logo,不是横幅。player 和 app 这两种类型本样本一个都没有。
X 自己那份卡片标记参考,存档时间 2024-05-14,2026-08-27 读,把整张表依赖的那条规则写得很直白:「The table in this section explains the OpenGraph fallback behavior for each Twitter tag.」而 twitter:card 那一行还多写了一句,正是这个标签值得留着的理由:「If an og:type, og:title and og:description exist in the markup but twitter:card is absent, then a summary card may be rendered.」summary 就是那张小方图。想要宽幅横幅,买的就是这一行。
那份参考的活地址现在返回 HTTP 402,docs.x.com/llms.txt 的当前文档索引里也没有 Cards 这一节(两处都在 2026-08-27 核过)。引存档不是偷懒,是已经没有活页可引了。
三个站只声明卡片类型,其余全交给 og
MDN、TechCrunch、The Verge 各写了 twitter:card 就收手。三家都没有 twitter:image,三家都有 og:image。这是把回退机制用对了的样子,也是本样本里最小的正确实现:一个标签定形状,一组标签填内容。
反过来的形状也有。BBC 写了 twitter:title 和 twitter:description,没写 twitter:card,而且整页没有 og:image——卡片就算渲染出来也没有图可退。它那条 twitter:title 有 116 个字符,而存档参考给这个标签写的上限是 70。纽约时报只写了一条 twitter: 标签,twitter:site,报了个账号名,什么都没描述。
只有一个页面的 twitter 值和 og 值真的对不上
全样本只有 3 个站的 twitter: 与 og: 存在取值差异,其中 2 个是故意的。
vercel.com——两张不同的图,文件名自己说了原因:og-home-not-x.png对og-home-x.png。一张给 X,一张给其他地方。www.wired.com——同一个图片地址,给 X 的那份末尾多了?mbid=social_retweet。那是来源打点,不是失配。nextjs.org——og:description写的是「Next.js by Vercel is the full-stack React framework for the web.」,twitter:description还停在更早的一版「Production grade React applications that scale…」。整页再没有第二处出现后面那句。
也就是说,维护两套平行标签的头号风险,在 26 个维护得最勤的首页上一共产生了 1 条过期文案。我们不打算把它包装成一句警告。这是真成本,但它很小,数字就是 1。
两处写法写反了,都没看出有什么后果
Open Graph 的值属于 property,X 的卡片值属于 name。两个站写反了,而且方向相反。
| 站点 | 写法 | 条数 |
|---|---|---|
developer.mozilla.org | og: 写在 name | 10 / 10 |
www.wired.com | twitter: 写在 property | 6 / 8 |
www.netlify.com | twitter:domain 写在 property | 1 / 5 |
这三条是回落盘的原始字节核的,不是看解析结果——把两个属性都归一化的解析器会直接把这个发现抹平。MDN 的原始标记确实写的是 <meta name="og:url" …>。至于有没有哪个消费方因此拒收,抓取判不了:多数解析器两种写法都吃,而我们一个渲染出来的预览都没验证过。
这对你意味着什么
对做出海独立站的人来说,有用的结论是一个数量,不是一条规矩:最小的诚实配置是四加一个标签,多出来的每一个都变成你以后要同步维护的东西。
- 写齐 Open Graph 规范点名必填的四项——
og:title、og:type、og:image、og:url,让它们在所有地方干活 - 想要宽幅大图而不是小方图,单独补一条
twitter:card就够了 - 别去维护平行的
twitter:title和twitter:description,除非两段文案本来就该不一样。本样本那唯一一条过期文案就是这么来的 - 别把根相对路径写进图片标签。Slack 的
og:image与twitter:image都是/dev-cdn/v/marketing/…,不做基址拼接的消费方拿到的是空
那张图到底该多大、各家分别怎么裁,是另一个有明确答案的问题,我们单独写成了 og image 尺寸怎么定。四项必填在真实站点上的分布,早前那次统计在 open graph 实测 26 个首页。想看引擎在解析这些标签之前从你的页面上拿到了什么,可以 看看 QueryWin 怎么运转。
常见问题
你们是怎么测的?
2026-08-27 每个首页发一次请求,浏览器 UA,正文落盘,meta 元素用 HTML 解析器读出属性名和取值,所有发出来的数字都是从落盘文件重算的。
2026 年了,twitter card 标签还要不要写?
只需要写一条。twitter:card 在 Open Graph 里没有对应物,不写就可能拿到小方图而不是宽幅卡片。标题、描述、图片这三类都有文档写明的回退,属于可选。
哪些 twitter card 标签是必填的?
存档的标记参考把 twitter:card 列为所有卡片都要用的类型声明,并写明 summary、summary_large_image、app、player 四种卡片需要 twitter:site 或 twitter:site:id 二选一。本样本 22 个有卡片的站里 15 个写了 twitter:site,也就是有 7 个站的卡片是缺着这一项发出去的。
图片格式有什么限制?
同一份参考原文:「Images must be less than 5MB in size. JPG, PNG, WEBP and GIF formats are supported. Only the first frame of an animated GIF will be used. SVG is not supported.」本样本有一个站的图片标签指向 .svg 源文件,走 CDN 转换后吐出来的是别的格式。
为什么你们抓 slack.com 拿到的是日文版图片?
因为本机出口在日本。Slack 那个图片路径结尾是 hp-revamp-unfurl.ja-JP.jpg,是服务端按地区挑的本地化资源,不是写死的值。任何按地区做的标签统计都会带上它自己的观测位置,这一份带的是我们的。


