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

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

  •  
  •   shanlan · 133 天前 · 2043 次点击
    这是一个创建于 133 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    这是我的解决方案
        15
    mayx   133 天前 via Android
    @MayKiller 我看不是所有,有一些不是。
        16
    MayKiller   133 天前
    @mayx 嗷. 的确有一些不是.
    #12 s/所有 /大部分 /g
        17
    Livid   V2EX Moderator   133 天前 via iPhone
    @MayKiller 谢谢。
        18
    shanlan   132 天前
    @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 快很多
        19
    zjb861107   132 天前
    @shanlan 你的意思我的博客访问慢吗?这个我是知道的,(偷笑)。
    一方面是因为有谷歌统计、字体这些,受梯子影响不一定快;另外我只有那一篇文章是用了 webp,老的图片资源还没来得及迁移。
    以前我是用的良心云各种服务自建博客的,速度很快。后来尝试用 Travis-CI 的时候把博客迁到 Github Pages 就懒得再恢复回来了,因为 github 禁止百度爬虫。
        20
    yinaw   116 天前
    我现在也在为此事头疼,我有一个 WordPress 博客,第一种第二种方法都试过。

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

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

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

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

    在这方面是小白一个,还望大佬赐教...
        23
    shanlan   114 天前   ♥ 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 吧?
    =====

    另外,打开速度慢需要具体分析,你可以把链接发出来我给你看看。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   960 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 26ms · UTC 19:57 · PVG 03:57 · LAX 11:57 · JFK 14:57
    ♥ Do have faith in what you're doing.