突破限制复活新浪图床
本帖最后由 evlon 于 2022-10-22 17:51 编辑## 背景
新浪图床曾经是做好用的图床,大概在19年吧,新浪添加了防盗链,所有的图片都不能使用了。
## 防盗链原理
防盗链的原理,是判断访问图片的 referer ,如果是未授权的,图片请求就返回403错误,结果就是图片不能展示。
## 突破复活原理
先使用 noref 的方式加载图片,加载成功后,在设置为此图片。此时,因为已经有缓存,所以图片可以正常显示。
## 地址
(https://github.com/evlon/noref-reload-img)
[演示地址](https://evlon.github.io/noref-reload-img/)
## 核心代码
### HTML
```
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>demo</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="renderer" content="webkit">
<meta name="applicable-device" content="pc">
<meta name="mobile-agent" content="format=html5;url=http://m.yy4480.io/api.php/timming/make"/>
<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />
<link href="/favicon.ico" type="image/x-icon" rel="icon">
<link href="/favicon.ico" type="image/x-icon" rel="shortcut icon">
</head>
<body>
<script src="//libs.baidu.com/jquery/1.9.1/jquery.js"></script>
<script src="js/evlonimageloader.js?20190225"></script>
<script>
function norefreload(img){
EvlonImageLoader.reloadImage(img, 'images/empty.gif');
}
function preGetImage(imgsrc){
return imgsrc;
}
</script>
<imgclass="norelreload" data-src="https://ww1.sinaimg.cn/large/006yeRCugy1g3vsks4061j31b80eg10a.jpg" alt="x战警:黑凤凰 蓝光" style="background-color: #EEEEEE;"/>
<imgclass="norelreload" data-src="https://ww1.sinaimg.cn/large/006yeRCugy1g0tzakoqf0j31b80eg78f.jpg" alt="北漂爱情故事 更新至12集/共12集" style="background-color: #EEEEEE;"/>
<imgclass="norelreload" data-src="https://ww1.sinaimg.cn/large/006yeRCugy1g0pz3t9dh6j31b80egwm3.jpg" alt="正义联盟 蓝光" style="background-color: #EEEEEE;"/>
<script>
$('img.norelreload').each(function(idx,img){
img.onerror = function(){
norefreload(img)};
$(img).attr('src',preGetImage($(img).attr('data-src')));
});
</script>
```
### 脚本
```
/**
* @Project: EvlonImageLoader.
* @Licence: The MIT License.
* @Author: Evlon evlion@qq.com.
* @Description: Crossbrowser kill Ref load Image.
*/
/**
* @module ReferrerKiller
*/
var EvlonImageLoader = (function () {
var showInfo = false;
var _imageQueue = [];
var _iframeReady = false;
var PUB = {};
PUB.iframeLoaderId = 'evlonimageloader';
varreloadImage = PUB.reloadImage = function(img, emptyPic){
if(img.src == '')
return;
var imgsrc = img.src;
if(_iframeReady){
//处理,方便缓存
var match = imgsrc.match(/(^.+?)\?/);
if(match){
imgsrc = match;
}
var iframe = document.getElementById(PUB.iframeLoaderId);
if(!iframe){
console.warn('<body><script src="evlonimageloader.js"></script> ...')
return;
}
else{
var tryTimes = 0;
var imgsrc_first = imgsrc;
function doGetImage(){
if(showInfo) console.info('load image:' + imgsrc);
iframe.contentWindow.getImage(imgsrc,function(success, imgLoaded){
if(success){
img.src = emptyPic;
img.src = imgsrc;
img.onerror = null;
if(showInfo) console.info('OK load image :' + imgsrc)
}
else{
if(tryTimes < 3){
tryTimes ++;
imgsrc = imgsrc_first + '?t=' + tryTimes;
doGetImage();
}
else{
if(showInfo) {
console.warn('error load image :' + imgsrc);
alert('error load image :' + imgsrc);
}
}
}
})
}
doGetImage();
}
}
else{
_imageQueue.unshift(img);
if(showInfo) console.info('into image queue:' + imgsrc);
}
}
window.__EvlonImageLoader_onIframeReady = PUB.onIframeReady = function(){
_iframeReady = true;
if(_imageQueue.length > 0){
while(_imageQueue.length > 0){
var img = _imageQueue.pop();
reloadImage(img);
}
}
};
function buildIframe(id){
var iframeHtml = '<iframe \
style="display:none;width:1px;height: 1px" \
scrolling="no" \
frameborder="no" \
allowtransparency="true" \
id="' + id + '" ' +
' src="javascript:\'\
<!doctype html>\
<html>\
<head>\
<meta charset=\\\'utf-8\\\'>\
<meta name=\\\'referrer\\\' content=\\\'never\\\'>\
<style>*{margin:0;padding:0;border:0;}\x3C/style>\
\x3C/head>' +
/*-- Function to adapt iframe's size to content's size --*/
'<script>\
function getImage(imgsrc,cb){\
var image = new Image() ;\
image.onload = function(){\
cb(true,image)\
};\
image.onerror = function(err) {\
cb(false,image);\
};\
image.src = imgsrc; \
} \
console.info(\\\'evlonimageload inner ok.\\\'); \
\x3C/script><body> \x3C/body>\x3C/html>\'">\x3C/iframe>';
document.write(iframeHtml);
}
buildIframe(PUB.iframeLoaderId);
if(showInfo) console.info('evlonimageload outer ok.');
return PUB;
})();
``` 不错能出成品么 woshixiaomajia 发表于 2022-10-22 17:34
不用这么麻烦呀,直接用新域名就行
https://51.ruyo.net/12432.html
对,用的就是你链接中这个方法。
----------------------------------------
内嵌iframe
原理有点像no-referrer~ 使用iframe加载图片不会跟踪到原请求域名,可以加载图片!
图片加载成功后会缓存在浏览器中。网站中再加载图片的时候直接从缓存加载了~~
缺点:改动较大~
感谢分享 大佬 两个链接的超链接错了~多加了东西 不用这么麻烦呀,直接用新域名就行
https://51.ruyo.net/12432.html anwen 发表于 2022-10-22 16:27
大佬 两个链接的超链接错了~多加了东西
谢谢提醒,已经修正 它的门户几乎没去过更别说用它的图床了 {:1_896:} https://dpurl.org/TPNS4
这就是你说的突破吗? evlon 发表于 2022-10-22 17:53
对,用的就是你链接中这个方法。
----------------------------------------
内嵌iframe
直接换域名就行哇,其他太折腾了