就算是 B站,有防 防盗链就没问题了,对吧

首页 / 乱写 / 正文

好久以前用 js 给网站写了个站外链接卡片,最近给它加上了 B 站链接的解析。写文章的时候只需要一条代码就可以将 B 站的链接变成链接卡片,就像这样:

分享卡片加载中

因为想把卡片的背景做成渐变的效果,所以就用了 backgroundlinear-gradient 样式。一开始直接从 B 站的 API 拿到视频的封面图就直接往 background 里面套,结果测试的时候发现 B 站的图床开了防盗链,没办法直接用。经过十几分钟的折腾,发现了两个奇奇怪怪的解决方法。

曲线救国法

众所周知,给 img 加上 referrerpolicy='no-referrer' 可以屏蔽掉 Referer 的发送,实现防 防盗链的效果,需要注意的是 referrerpolicy='no-referrer' 只支持 aareaimgiframescriptlink 这几个元素,对于 div 就无能为力了。但是如果我们在页面先用带 referrerpolicy='no-referrer'img 拿到图片,就可以在 divbackground 中显示了,最后给 img 一个 hidden 属性就可以了。

<div style='background:url(https://i0.hdslb.com/bfs/archive/b73aec2f46bcaddee266b900d714b78f47e726d2.jpg);'>
    <img src="https://i0.hdslb.com/bfs/archive/b73aec2f46bcaddee266b900d714b78f47e726d2.jpg" referrerpolicy="no-referrer" hidden>
</div>

打开控制台,可以看到页面只加载了一个资源,div 的图片应该是直接拿了 img 一开始请求的图片

资源加载

下面是用这种方法实现的效果(下面的例子因为主题问题把 imgdiv 里会额外加上一个 p 标签,导致卡片变形,所以把 img 放在了 div 外面)

分享卡片加载中

NTR法

通过第三方的图像缓存服务来解决防盗链问题,这里用的是 https://images.weserv.nl 这个网站的服务。使用方法非常简单,只需要在 https://images.weserv.nl/?url= 后加上防盗链的图片就好了。

个人比较推荐使用这种方法,一来他们的服务是免费的而且图片加载速度非常的快,二来这个网站提供了图片压缩,根据信息熵或者「亮度频率最高、颜色饱和度和肤色占比最多」的区域进行裁剪等后期处理,所以最后也采用了这个方法去解决链接卡片的背景问题。你也可以在他们的 官方文档 了解更多

最后还是要提一句,不要上传有敏感数据的图片到第三方网站,也不要滥用他们的服务,毕竟谁也不想用着用着就没有了。

无标签
评论区
头像

进行人机验证

    头像
    火喵
    2021年11月12日 17:20
    回复

    我的追番页图片也是加的referrerpolicy='no-referrer'标签哈哈哈