1. 程式人生 > >Java製作自動訪問網站機器人!

Java製作自動訪問網站機器人!

真的很久很久沒有寫過文章了,唉,慚愧啊!寒暄的說話就不多說了,直入主題。有人問過我,如何製作一些論壇的自動發言機器人?我說,這很簡單啊,(如果沒 有圖片驗證碼的話!)在Java裡,有些URL,URLConnection的類啊,這些類可以訪問一個URL獲取資料,可以傳送Request,你就可 以結合一些類做一個自動發言的了,但用Post傳送表單的話,就沒有直接的,比較麻煩,如果還要處理Cookie的話,之後我想了想,想到了可以用 Jakarta Commons 下面的開源專案啊,有一個專案名叫“HttpClient”的,這個就是用Java寫的Http客戶端,可以說是一個簡單功能的瀏覽器吧,只是不能解析 HTML標籤,寫這個解析可不是易事。既然我們是寫個自動訪問網站的程式,就不用解析顯示HTML啦。朋友說能寫個招聘網站的自動重新整理簡歷的程式就好了, 那就用51job為例吧。
      首先,你得去下載HttpClient的包。

http://jakarta.apache.org/commons/httpclient

程式碼不多,我們就先來看看程式碼吧:

import java.io.*;
  import org.apache.commons.httpclient.*;
  import org.apache.commons.httpclient.methods.*;
  
  public class HttpTest {
  
      /**
       * @param args
       * @throws Exception
      */
     public static void main(String[] args) {
         //先建立一個客戶端例項,將模擬一個瀏覽器
         HttpClient client = new HttpClient();
        
         //這個是URL地址,我經過分析51job網站登入後的跳轉到的地址,並分析得它在JavaScript裡提交的URL的引數,不同網站就自已分析了,這個就是登入後重新整理簡歷的URL地址
         String url = "http://my.51job.com/my/Pop_RefreshResume.php?en=0&ReSumeID=88888888&Read=0&ID=88888888";
        
         //之後再建立一個Post方法請求,提交重新整理簡歷的表單,因為提交的引數較多,所以用Post請求好了
         PostMethod method = new PostMethod(url);
 
         //下面的就是將要提交的表單的資料填入PostMethod物件裡面,以name , value 對加入!
         method.addParameter("HPNation", "086");
         method.addParameter("HPCity","020");
         method.addParameter("HPNumber","88888888");
         method.addParameter("FPNation","086");
         method.addParameter("FPCity","020");
         method.addParameter("FPNumber","88888888");
         method.addParameter("FPExtension","000");
         method.addParameter("MPNation","086");
         method.addParameter("Mobile","13888888888");
         method.addParameter("EmailAdd","[email protected]");
         method.addParameter("ReSumeID","88888888");
        
         //這裡是建立請求時伺服器需要用到的Cookie。
         Cookie cookie = new Cookie(".51job.com","51job","ccry%3D.0%252FZKBaMTmj82%26%7C%26cconfirmkey%3DcpwWgp7FC9FZM%26%7C%26cresumeid%3D88888888%26%7C%26cresumeids88888888d888826%7C8408ilstatus%3D2%26%7C%26cnickname826cenglis8cautologin%3D","/",null,false);
        
         //將設定好的Cookie加入模擬的客戶端裡。當請求發生時,就會將Cookie寫進請求頭裡了
         client.getState().addCookie(cookie);
         int i=0; 
         //開始死迴圈
         while(true){
             try{
                 //這裡是要求客戶端傳送一個請求。直接將PostMethod請求出去。
                 client.executeMethod(method);
                
                 //下面是獲取返回的結果
                 InputStream in = method.getResponseBodyAsStream();
                 ByteArrayOutputStream baos = new ByteArrayOutputStream();
                 byte[] buff = new byte[1024];
                 int len = -1;
                 while((len=in.read(buff))!=-1){
                     baos.write(buff, 0, len);
                 }
                 String result = new String(baos.toByteArray());
                
                 //釋放資源
                 in.close();
                baos.close();
 
                 //在51job裡,重新整理簡歷成功的話,會返回一些JavaScript程式碼,裡面有個alert()輸出“簡歷已重新整理”的資訊的,你分析結果,如果有這句話,則成功重新整理了。之後就讓執行緒睡眠1分鐘後迴圈重新整理!
                 if(result.indexOf("簡歷已重新整理")!=-1){
                     System.out.println("簡歷已重新整理! " + ++i);
                 }else{
                     System.out.println("重新整理失敗!");
                 }
                 Thread.sleep(60000);
             }catch(Exception ex){
                 System.out.println("******** Error! ********");
                 try{
                     //出現錯誤時,再等待20秒後再重新進行重新整理。
                    Thread.sleep(20000);
                 }catch(Exception e){
                    System.out.println("******** Thread Error! ********");
                 }
             }
         }
     }
 
}

 我們再來看看,其實很簡單,我們來說明一下。HttpClient將很多Http協議底層的東西都封裝了,這樣很方便使用,如果自已用Socket寫的 話,還有處理很多資訊,Http協議的三次握手等等的操作,很是麻煩。現在用HttpClient就一步到位了。但要注意一下,51job裡面的簡歷重新整理 是要先登入後才可以進行的,而熟悉Web開發的人員都知道,登入後伺服器就會記錄下你的Session,而Session也是基於Cookie的,所以 Session ID是以Cookie的方式記錄在客戶機的,這樣每次請求都要將該Cookie傳送到伺服器驗證,這樣才可以保證Web的狀態。所以,你可以在瀏覽器裡先 登入一次。之後找出該網站的Cookie檔案,將裡面的內容複製出來放上上面程式碼的Cookie類裡面。你也可以用這個HttpClient寫一個登入的 請求,之後再從ResponseHeader裡獲取Cookie。至於表單裡的資訊,就按自已需要填寫就行了。就是模擬一個瀏覽器,將你的簡歷重新整理的表單 模擬出來再發送。