您的位置:首页 > 编程语言 > Java开发

Java破解图片防盗链

2017-08-30 15:15 162 查看
前言

今天想下载几张好看的壁纸,然后发现了一张是自己比较喜欢的额。然后点进去看看,WOW!好多好看的壁纸呀,于是我就起了贪念。哈哈!想把他们这一组图片打包下载,小白的方法就是一张一张下载,那样对于我们程序员来说是很low的办法。于是我考虑使用万能的java来下载他们的组图,花2小时鼓捣一下,但是觉得网上的文章大多是于抄袭,有些又不是很全。于是就了这篇文章,希望对各位有帮助。但不建议将此方法用作商业,因为盗用别人的图片属于违法行为!!!
图片防盗链

很多网站为了防止别的网站盗用自己网站的图片,就是用了图片防盗链技术。也就是说,当我获取图片的url之后,直接在浏览器或者代码里访问。举个栗子:比如我想使用url要直接在浏览器中打开一张图片,但是出现的却是另外一张警告图片,里面写着:想查看图片请访问XXX网站。这就是一个典型的图片防盗链,其原理就是会在request的请求头里携带一个“referer”的变量,以此来判断该请求是从哪个链接跳转过来的。如果没有携带“referer”或者不是从本网站跳转一律返回警告或提示图片。
破解防盗链

知其原理,破其规律。既然咱们知道防盗链的原理,那我们可以很简单的伪装一个“referer”就可以了,也就是在请求之前先在request的header里添加一个变量为referer:http.xxx.xxxcom 也就是该网站的随意的一个url。
package com.cmc.test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

/**
* 使用多线程下载防盗链图片
*
* @author chenmc
* @date 2017年8月30日 下午2:39:23
*/
public class DownloadPicture {

public static void main(String[] args) throws InterruptedException {
for (int i = 1; i <= 10; i++) {
int n = i;
Thread t = new Thread(){
@Override
public synchronized void run() {
try {
httpRequest(n);
} catch (Exception e) {
e.printStackTrace();
}
super.run();
}
};
t.start();
}
}

/**
* 发起http请求
*
* @author chenmc
* @date 2017年8月30日 下午2:36:09
* @param n
* @throws Exception
*/
public static void httpRequest(int n) throws Exception {
for (int i = (n-1)*5 > 1 ? (n-1)*5 : 1; i < n*5; i++) {
long startTime = System.currentTimeMillis();
String path = "C:/Users/admin/Pictures/壁纸/" + String.format("%03d", i) + ".jpg";
//这里url写你想要下载图片的url
String uri = String.format("http://bizhi.xxx.com/rluo/%s.jpg", String.format("%03d", i));
System.out.println(uri);
URL url = new URL(uri);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestProperty("referer", "http://bizhi.xxx.com"); //这是破解防盗链添加的参数
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
InputStream inStream = conn.getInputStream();//通过输入流获取图片数据
readInputStream(inStream, path);//得到图片的二进制数据,并保存
long endTime = System.currentTimeMillis();
System.out.println(path + "--耗时:" + (endTime-startTime)/1000 + "s");
}
}

/**
* 保存图片
*
* @author chenmc
* @date 2017年8月30日 下午2:35:54
* @param inStream
* @param path
* @throws Exception
*/
public static void readInputStream(InputStream inStream, String path) throws Exception{
FileOutputStream fos = new FileOutputStream(new File(path));
byte[] buffer = new byte[102400];
int len = 0;
while( (len=inStream.read(buffer)) != -1 ){
fos.write(buffer, 0, len);
}
inStream.close();
fos.flush();
fos.close();
}
}


上述例子我使用了多线程技术,因为我想下载的壁纸有247张之多,所以我使用了50个线程,每个线程下载5张。因为是自己下载壁纸用的,所以没有考虑效率之类的,这里也希望大家可以自己去改进它。

最后给大家一波福利~~~好看的夕阳壁纸1 夕阳壁纸2 因为我上传的资源限制大小为80M,所以分开上传了~因为这是图片资源,所以csdn可能会删除哦,想要的同学们尽快下载吧!
给大家养养眼~~~

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息