1. 程式人生 > >Java破解圖片防盜鏈

Java破解圖片防盜鏈

  • 前言
    今天想下載幾張好看的桌布,然後發現了一張是自己比較喜歡的額。然後點進去看看,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可能會刪除哦,想要的同學們儘快下載吧!
  • 給大家養養眼~~~