Hexo 博客程序解决新浪微博图床 403 防盗链问题

2019-07-03 21:09:06 +08:00
 shanlan

微博图床开启了防盗链,导致图片 403 了,这个不用我多说,界面说 3 种解决方法:

  1. 解决方法是 HTML 加上<meta name="referrer" content="no-referrer" />,但是这种效果不会,影响统计功能。

  2. 给 img 标签加上referrerpolicy="no-referrer",这样仅会让图片的请求没有 ReFerer,不影响其他 HTTP 的请求。

  3. 在方法 2 的步骤上升级一下。对 img 的 Src 进行匹配,只有匹配 通过的 img 标签才会加上referrerpolicy="no-referrer",实现方法是添加 JavaScript 代码。

var link = "" ;
// 遍历所有的 img 标签
$("img").each( (i,o) => {
	var o = $(o);
    // 判断图片的链接是否包含 sinaimg 关键字
	if( o.attr("src").indexOf("sinaimg") > 0 ){
        // 给这个标签加上 referrerPlicy 属性
		o.attr("referrerpolicy","no-referrer");
        // 备份图片的 src
		link = o.attr("src");
        // 重新设置 src,让页面重新加载一次图片
		o.attr("src",link);
	}
});

以上为简单描述,具体实现方法请参见:解决新浪 /微博图床图片 403 错误防盗链问题

4659 次点击
所在节点    程序员
28 条回复
shanlan
2019-07-22 00:10:54 +08:00
@yinaw #20 原文:“我现在也在为此事头疼,我有一个 WordPress 博客,第一种第二种方法都试过。第一种直接影响百度统计,无法统计站点信息。第二种要每篇文章重新编辑重新添加标签,我这差不多是一个图片博客,有上万张图片,工程量太大,而且新增文章图片也要嵌入标签。麻烦的很。对您说的第三种方法很感兴趣,请问,您的这些 JavaScript 代码对 WordPress 博客有效吗?”
======
回复:你好,当然是有效的,前提是你需要把 JavaScript 代码引入到正确的页面。
yinaw
2019-07-22 11:38:09 +08:00
@shanlan 按照您的方法放在了页面底部,但是打开速度好像有点慢,有的图片依然打不开,要刷新一遍才行。

另外我看您的博客代码好像更新了一些,多了一行 setTimeout( function(){ 以及 后面加了个 1000 的数字,请问这些更新是什么情况?提升稳定性以及缩短加载时间吗?

在这方面是小白一个,还望大佬赐教...
shanlan
2019-07-22 23:27:21 +08:00
@yinaw #22 原文:“@shanlan 按照您的方法放在了页面底部,但是打开速度好像有点慢,有的图片依然打不开,要刷新一遍才行。另外我看您的博客代码好像更新了一些,多了一行 setTimeout( function(){ 以及 后面加了个 1000 的数字,请问这些更新是什么情况?提升稳定性以及缩短加载时间吗?在这方面是小白一个,还望大佬赐教...”
======
回复:起初我遇到了和你一样的问题,有的图片不能打开。我简单的猜测是因为刚开页面的时候浏览器向服务器请求一张图片,但是由于网速等原因还没有请求完成,而底部的 JavaScript 代码就已经开始执行了。但是因为之前图片还在请求中,即使后面 JavaScript 代码修改了 img 标签的属性,浏览器还没有办法进行第二次请求,从而导致图片依然不能正常显示。

所以,我使用 setTimeout()这个延时命令,让这段 JavaScript 代码延迟 1000 毫秒执行,就是为了让浏览器有足够的时间去等待图片服务器的响应结果。所以,如果你的图片经常不能显示,不妨加大这个延迟时间。

亦或者你写一段 JavaScript 代码,判断的条件是:img 标签的 src 属性是不是新浪的域名,并且图片的分辨率大小小于某个值,从而让浏览器是不是要再重新加载请求一次图片。原因是图片加载成功后,分辨率肯定会很大的,这样就不用写一个固定的延迟时间,因为延迟时间是固定的,而每个人的网络环境、电脑配置并不是固定,所以这种判断加载图片的方式应该更加的合理。
=====
例如我文中这个页面,使用 Chrome 浏览器若图片不能打开的情况下图标的大小的:
document.querySelector("#post-解决新浪-微博图床图片 403 错误防盗链问题 > div.article-entry.marked-body > p:nth-child(5) > img").width
107
document.querySelector("#post-解决新浪-微博图床图片 403 错误防盗链问题 > div.article-entry.marked-body > p:nth-child(5) > img").height
22
=====
当然这个破图的 icon 大小是取决于浏览器的,具体你怎么判断需要你自己去尝试。但是我想应该没有图片的分辨率会低于 200PX 吧?
=====

另外,打开速度慢需要具体分析,你可以把链接发出来我给你看看。
yinaw
2019-12-01 03:08:22 +08:00
大佬,我的 WordPress 博客在底下添加你这几行代码,用了几个月,有一些问题想请教一下:

目前谷歌火狐 360 浏览器都没有问题,IE 有问题,这个大家都知道,IE 份额小,忽略也没事。

但是在移动端上,苹果 IOS 系统还是无法显示图片,有没有其他办法?

毕竟 IOS 份额不小啊..
shanlan
2019-12-01 13:27:06 +08:00
@yinaw #24 原文:“大佬,我的 WordPress 博客在底下添加你这几行代码,用了几个月,有一些问题想请教一下:

目前谷歌火狐 360 浏览器都没有问题,IE 有问题,这个大家都知道,IE 份额小,忽略也没事。

但是在移动端上,苹果 IOS 系统还是无法显示图片,有没有其他办法?

毕竟 IOS 份额不小啊..”
======
回复:#24 我只能给你提供个思路,该方法只使用了 img 标签的:referrerpolicy="no-referrer",属性。所以你需要做的是去查询 iOS 浏览器是不是不支持这个属性。
yinaw
2019-12-01 15:15:33 +08:00
经测试:iOS 浏览器对于 https 的微博图片标签属性不支持,对于 http 的微博图片倒是支持,

难道要改回 http,这是一个繁巨的任务啊~

大佬,有没有其他办法
shanlan
2019-12-01 22:01:09 +08:00
@yinaw #26 原文:“经测试:iOS 浏览器对于 https 的微博图片标签属性不支持,对于 http 的微博图片倒是支持,

难道要改回 http,这是一个繁巨的任务啊~

大佬,有没有其他办法”
======
回复:#26 这不是简答吗?用 JavaScript 判断 UA 头,如果是 iOS 就将网址的改为 http 开头,否认是 https
yinaw
2019-12-01 23:12:31 +08:00
那上面这几行代码怎么改?

我是小白啊,大佬帮帮忙,搞好后给您发个红包...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/579771

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX