最近微博给用户上传的图片增加了反盗链。鼓捣了一个小时终于把这个问题给搞定了。

原因

微博的反盗链机制目前很简单,就是查referer这个header。但是如果请求中没有这个header,那么也是可以的。正好HTML的图片tag img有一个属性referrerpolicy,可以让浏览器不发送referer header。那么只要在博客图片里面加上这个属性就可以了。

这个属性还属于experimental的阶段。 iOS的Safari还不支持。不过FF和Chrome的较新版本都支持了。

盲猜一下为什么微博没有把没有referer的也给封杀了:也许有一些非WEB端也会请求图片吧。

解决

Hexo Tag

Hexo Tag 类似于一个自定义的可以在Markdown文件中调用的函数。它会在generate的时候运行把调用位置替换成函数的返回结果。

1
2
3
4
hexo.extend.tag.register('sinaimage', function(args){
const image_url = args[0];
return `<img src="${image_url}" alt="" referrerpolicy="no-referrer"></img>`
});

这个函数很简单,没什么好说的。把它保存成一个.js文件然后放到hexo project目录下面的scripts目录里,没有就创建一个。

在Markdown中这样调用

1
{% sinaimage https://wx4.sinaimg.cn/large/xxxxx.jpg %}

替换以前文章中的图片

使用sed就可以批量替换掉以前文章中插入的图片了。

1
sed -i -E 's/.*\!\[.*\]\((https?\:\/\/.*\.sinaimg\.cn.*)\)/\{% sinaimage \1 %\}/g' 'FILE_PATH'

以上的正则请自行修改。注意做好备份。

暂时就解决了。