From 1db169817410d860b4dbee160c456c8d247faa51 Mon Sep 17 00:00:00 2001 From: Sakurasan <26715255+Sakurasan@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:50:41 +0800 Subject: [PATCH] =?UTF-8?q?=E9=93=BE=E6=8E=A5=E5=8D=A1=E7=89=87=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E4=BF=AE=E5=A4=8D=EF=BC=9Aimg=20=E5=8A=A0=20referrerp?= =?UTF-8?q?olicy=3Dno-referrer=20=E7=BB=95=E8=BF=87=E5=93=94=E5=93=A9?= =?UTF-8?q?=E5=93=94=E5=93=A9=E7=AD=89=20CDN=20=E9=98=B2=E7=9B=97=E9=93=BE?= =?UTF-8?q?=EF=BC=9B=E6=8A=93=E5=8F=96=20UA=20=E6=8D=A2=E6=B5=8F=E8=A7=88?= =?UTF-8?q?=E5=99=A8=E5=BD=A2=E6=80=81=EF=BC=9B=E8=AF=86=E5=88=AB=E5=B9=B6?= =?UTF-8?q?=E4=B8=A2=E5=BC=83=20X=20=E7=9A=84=E5=85=A8=E7=AB=99=E5=8D=A0?= =?UTF-8?q?=E4=BD=8D=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/internal/linkmeta/linkmeta.go | 4 +++- backend/internal/linkmeta/parse.go | 6 ++++++ frontend/src/components/LinkCard.vue | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/backend/internal/linkmeta/linkmeta.go b/backend/internal/linkmeta/linkmeta.go index 02a995f..1185fbd 100644 --- a/backend/internal/linkmeta/linkmeta.go +++ b/backend/internal/linkmeta/linkmeta.go @@ -26,7 +26,9 @@ const ( maxBody = 512 << 10 // maxRedirects 跳转链上限。 maxRedirects = 3 - userAgent = "Mozilla/5.0 (compatible; ONEBot/1.0; +link-preview)" + // 浏览器形态的 UA:不少站点(X、微博、部分门户)对未知爬虫 UA 给的 + // og 元数据不全或直接拒绝,对浏览器 UA 则照常输出 里的标签。 + userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36" ) // Card 是抓取结果的数据形状;定义在 model 里(要落库、要给前端), diff --git a/backend/internal/linkmeta/parse.go b/backend/internal/linkmeta/parse.go index fde1cb0..4267737 100644 --- a/backend/internal/linkmeta/parse.go +++ b/backend/internal/linkmeta/parse.go @@ -53,6 +53,12 @@ func parse(doc string, base *url.URL) *Card { if img := first(meta["og:image"], meta["twitter:image"], meta["twitter:image:src"]); img != "" { c.Image = resolve(img, base) } + // X(Twitter)对非白名单爬虫只回一张全站通用灰图占位符, + // 拿它当封面只会显示一张无意义的底图——当作没有图处理。 + // 真推文图只发给 Twitterbot 等白名单 UA,服务端拿不到,不硬来。 + if strings.Contains(c.Image, "abs.twimg.com/rweb/ssr/default") { + c.Image = "" + } return c } diff --git a/frontend/src/components/LinkCard.vue b/frontend/src/components/LinkCard.vue index 2180a25..41d0c57 100644 --- a/frontend/src/components/LinkCard.vue +++ b/frontend/src/components/LinkCard.vue @@ -39,6 +39,7 @@ function open() { alt="" loading="lazy" decoding="async" + referrerpolicy="no-referrer" @error="imgBroken = true" />