如果A站点想将B站点的img等资源放到A站点,通常会受到对方站点防盗链的阻拦。这里是我提供的一个思路,利用腾讯云函数的免费资源,完美绕开防盗链。因为图片不会受到浏览器的跨域阻拦,其他资源的跨域问题也能通过这个方法解决。
1:什么是防盗链?
防盗链是由对方站点设置的,防止未受许可的站点直接引用对方站点的资源。比如这里有一个 https://www.baidu.com/abc.jpg
图片链接,如果你想将它放到 www.yourweb.com
站点的img标签src中,将受到防盗链的阻挡,浏览器将无法加载此图片。
防盗链是因为浏览器在发起跨域请求时携带了,referrer请求头,此请求头含有你的站点主机,对方识别到你非许可站点,因此拒绝返回给你图片资源。
我在网上找了一些解决防盗链的办法,比如,设置meta标签为no-referrer,使用iframe,反向代理等。其中,针对B站防盗链的meta标签无效,iframe过于臃肿,不适合设置,而反向代理则需要一台服务器,价格不美丽,我直接用别人网站上的资源,不就是为了白嫖吗?
对此我找到了一个,免费破解防盗链的方法。
2:破解防盗链
我在腾讯云函数上写了一个python程序,此程序,将图片资源直径转为base64数据,然后返回给请求者。
为什么腾讯云函数?
腾讯云函数每个月有免费的额度,其中100万次api调用,40万GBs的函数运行时长(1GBs表示,内存1GB运行1秒),还有大概几个G的外网流出流量。这美丽的免费量,足够我们做图片代理了。
为什么转base64?
首先,腾讯云函数不支持直接返回二进制或者图片资源,它只能返回纯字符串文本,或者json格式的字符串。python可以利用base64库,将图片转为base64字节流,然后对其解码生成字符串。
除此之外,base64格式的字符串可以直接放入img标签的src中,而无需再转为blob。
python代码:
1 | import requests |
这里只有关键代码,如何通过云函数api向云函数中传入imgurl,需要额外的程序,比如post请求中添加url参数,或者get请求参数中放入unicode编码后的url。
更多的解决办法,需要自行了解云函数。因为我的imgurl是直接在python程序中通过爬虫爬取的,没有通过前端发送imgurl所以没有再贴出来。这里贴出一些云函数的可能返回方法
1 | #前端请求时将url编码 |
如果不是图片资源,加入Access-Control-Allow-Origin
可以解决跨域问题。