V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
shanlan
V2EX  ›  程序员

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

  •  
  •   shanlan · 2019-07-03 21:09:06 +08:00 · 4631 次点击
    这是一个创建于 1968 天前的主题,其中的信息可能已经有所发展或是发生改变。

    微博图床开启了防盗链,导致图片 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 错误防盗链问题

    28 条回复    2019-12-01 23:12:31 +08:00
    ysc3839
        1
    ysc3839  
       2019-07-03 21:35:08 +08:00 via Android
    Hexo 的话应该有更优雅的方案,直接在 Markdown 生成器里面检测并添加。
    abcdocker
        2
    abcdocker  
       2019-07-03 22:03:20 +08:00
    WordPress 才是王道
    https://i4t.com/
    shanlan
        3
    shanlan  
    OP
       2019-07-03 22:03:55 +08:00
    @ysc3839 欢迎补充。
    shanlan
        4
    shanlan  
    OP
       2019-07-03 22:05:05 +08:00
    @abcdocker 这个是用 GitHub pages 等免费的静态服务器部署,不需要额外购置服务器。
    luckyrayyy
        5
    luckyrayyy  
       2019-07-03 22:13:27 +08:00 via iPhone
    hexo 可以直接生成同名文件夹,图片也放在 pages 里,压根不用图床。
    ysc3839
        6
    ysc3839  
       2019-07-03 22:26:46 +08:00
    @luckyrayyy 用图床是为了避免网站本身访问太慢吧。
    Love4Taylor
        7
    Love4Taylor  
       2019-07-03 22:48:27 +08:00 via Android
    @luckyrayyy 流量以及存储容量都是个问题.
    szhaoliang
        8
    szhaoliang  
       2019-07-03 22:57:23 +08:00 via Android
    @ysc3839 GitHub 在国内访问很慢吗?图片都是直接放在 GitHub 上,要是慢的话要考虑下家了。
    fqxufo
        9
    fqxufo  
       2019-07-03 22:57:46 +08:00
    有的老版本浏览器不支持 referrerpolicy 的特性吧
    MonoLogueChi
        10
    MonoLogueChi  
       2019-07-03 23:01:02 +08:00 via Android
    @szhaoliang 很慢,而且可用率不高
    ysc3839
        11
    ysc3839  
       2019-07-03 23:05:59 +08:00 via Android
    @szhaoliang 我说不清,具体情况可能很复杂,建议自行测试。
    vB4h3r2AS7wOYkY0
        12
    vB4h3r2AS7wOYkY0  
       2019-07-03 23:11:21 +08:00   ❤️ 1
    @Livid #2
    无意义回复, 且该帐号下所有回复均指向其博客.
    flyz
        13
    flyz  
       2019-07-03 23:41:09 +08:00 via Android
    @luckyrayyy github 不套 cf,根本不能用
    zjb861107
        14
    zjb861107  
       2019-07-04 00:13:11 +08:00 via iPhone
    借助数据万象(原万象优图),让 hexo 也用上 webp: https://blog.i1hao.com/2019/07/02/cloud-infinite/

    这是我的解决方案
    mayx
        15
    mayx  
       2019-07-04 00:16:14 +08:00 via Android
    @MayKiller 我看不是所有,有一些不是。
    vB4h3r2AS7wOYkY0
        16
    vB4h3r2AS7wOYkY0  
       2019-07-04 01:46:08 +08:00
    @mayx 嗷. 的确有一些不是.
    #12 s/所有 /大部分 /g
    Livid
        17
    Livid  
    MOD
       2019-07-04 03:35:09 +08:00 via iPhone
    @MayKiller 谢谢。
    shanlan
        18
    shanlan  
    OP
       2019-07-04 13:45:44 +08:00
    @MayKiller #12 吓我一跳,我还以为举报我垃圾内容呢。。。。
    @szhaoliang #8 GitHub pages 非常慢; coding 很快,其次是 netlify。
    @luckyrayyy #5 影响访问速度,所以通常静态资源能省就省了。
    @zjb861107 #14 初次访问忘记抓包了,所以具体哪个文件慢我也没法告诉,所以我又清空了 dns 缓存特地给你抓了一次包。具体如下图://ws2.sinaimg.cn/large/96e311f0gy1g4nr772pujj21h50id0wl.jpg ;绿色的是 TTFB 时间,蓝色的 Content download 时间。
    @fqxufo #9 又不是盈利的项目,所以不关心用户是不是老浏览器。再说了,谁让他坚守老浏览器呢?而且博客也是针对计算机编程技术类的,作为一个搞技术的人还坚守老浏览器就更说不过去了。
    @ysc3839 #11 本来就是很慢的,Coding 快很多
    zjb861107
        19
    zjb861107  
       2019-07-04 14:18:30 +08:00
    @shanlan 你的意思我的博客访问慢吗?这个我是知道的,(偷笑)。
    一方面是因为有谷歌统计、字体这些,受梯子影响不一定快;另外我只有那一篇文章是用了 webp,老的图片资源还没来得及迁移。
    以前我是用的良心云各种服务自建博客的,速度很快。后来尝试用 Travis-CI 的时候把博客迁到 Github Pages 就懒得再恢复回来了,因为 github 禁止百度爬虫。
    yinaw
        20
    yinaw  
       2019-07-20 10:08:37 +08:00
    我现在也在为此事头疼,我有一个 WordPress 博客,第一种第二种方法都试过。

    第一种直接影响百度统计,无法统计站点信息。

    第二种要每篇文章重新编辑重新添加标签,我这差不多是一个图片博客,有上万张图片,工程量太大,而且新增文章图片也要嵌入标签。麻烦的很。

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

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

    在这方面是小白一个,还望大佬赐教...
    shanlan
        23
    shanlan  
    OP
       2019-07-22 23:27:21 +08:00   ❤️ 1
    @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
        24
    yinaw  
       2019-12-01 03:08:22 +08:00
    大佬,我的 WordPress 博客在底下添加你这几行代码,用了几个月,有一些问题想请教一下:

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

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

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

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

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

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

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

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

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

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

    我是小白啊,大佬帮帮忙,搞好后给您发个红包...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3030 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 10:57 · PVG 18:57 · LAX 02:57 · JFK 05:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.