Java破解圖片防盜鏈
阿新 • • 發佈:2019-01-30
- 前言
今天想下載幾張好看的桌布,然後發現了一張是自己比較喜歡的額。然後點進去看看,WOW!好多好看的桌布呀,於是我就起了貪念。哈哈!想把他們這一組圖片打包下載,小白的方法就是一張一張下載,那樣對於我們程式設計師來說是很low的辦法。於是我考慮使用萬能的java來下載他們的組圖,花2小時鼓搗一下,但是覺得網上的文章大多是於抄襲,有些又不是很全。於是就了這篇文章,希望對各位有幫助。但不建議將此方法用作商業,因為盜用別人的圖片屬於違法行為!!! - 圖片防盜鏈
很多網站為了防止別的網站盜用自己網站的圖片,就是用了圖片防盜鏈技術。也就是說,當我獲取圖片的url之後,直接在瀏覽器或者程式碼裡訪問。舉個栗子:比如我想使用url要直接在瀏覽器中開啟一張圖片,但是出現的卻是另外一張警告圖片,裡面寫著:想檢視圖片請訪問XXX網站。這就是一個典型的圖片防盜鏈,其原理就是會在request的請求頭裡攜帶一個“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可能會刪除哦,想要的同學們儘快下載吧! - 給大家養養眼~~~