使用HttpClient模擬網(wǎng)站登陸sina郵箱(保持遠程服務器session和cookie) (轉載)
http://www.cnblogs.com/yesun/archive/2007/09/23/903319.html
/** * 通過URL取得網(wǎng)頁內容 */ private void HttpRequestURL() { String postData = ""; if(_tc.getPostData()!=null && !_tc.getPostData().equals("")) { postData = _tc.getPostData(); } if(_tc.getPostMethod()==null || _tc.getPostMethod().equals("")) _tc.setPostMethod("GET"); String postUrl = _tc.getUrl(); if(_tc.getPostMethod().toUpperCase().equals("GET") && !postData.equals("")) { if(postUrl.indexOf("?") > -1) postUrl += "&"+postData; else postUrl += "?"+postData; } System.out.println("--------Transfer Start------------------------------------------------------------------"); System.out.println(" 頁面解析準備就緒..."); System.out.println(" Url:"+postUrl); System.out.println(" PostData:"+postData); System.out.println(" PostMethod:"+_tc.getPostMethod()); System.out.println(" Encoding:"+_tc.getEncoding()); System.out.println("--------------------------------------------------------------------------------------"); HttpClient httpClient = new HttpClient(); if(_tc.getPostMethod().toUpperCase().equals("GET")) { if(!postData.equals("")) { if(postUrl.indexOf("?") > -1) postUrl += "&"+postData; else postUrl += "?"+postData; } GetMethod getHC = new GetMethod(postUrl); getHC.setFollowRedirects(false); getHC.getParams().setHttpElementCharset("UTF-8"); //發(fā)送Cookie StringBuilder cookieValue = new StringBuilder(); for(String key : this.cookie.keySet()){ cookieValue.append(key); cookieValue.append("="); cookieValue.append(this.cookie.get(key)); cookieValue.append("; "); } getHC.setRequestHeader("Cookie", cookieValue.toString()); getHC.setRequestHeader("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows 2000)"); int statusCode; try { statusCode = httpClient.executeMethod(getHC); Header[] headers = getHC.getResponseHeaders(); for(Header header : headers){ if(header.getElements().length > 1){ HeaderElement[] elements = header.getElements(); for(HeaderElement element : elements){ checkCookie(element); } } else { checkCookie(header); } } if(statusCode==HttpStatus.SC_OK){ String charset = "utf-8"; if(_tc.getEncoding() == GB2312) charset = "gb2312"; else if(_tc.getEncoding() == UTF8) charset = "utf-8"; else if(_tc.getEncoding() == BIG5) charset = "big5"; else charset = "utf-8"; System.out.println("charset : " + charset); InputStreamReader isr = new InputStreamReader(getHC.getResponseBodyAsStream(), charset); // 設置讀取流的編碼格式,,自定義編碼 // 使用字符讀取方式,,循環(huán)讀取源文件內容 StringBuffer sb = new StringBuffer(); int b ; while ((b = isr.read()) != -1)//順序讀取文件text里的內容并賦值給整型變量b,直到文件結束為止,。 { if (b < 32 && b!= 10 && b != 13 && b != 9) b = 32;//過濾掉一些換行等符號 //if ( b== 10 || b== 13 || b== 9) b = 32;//過濾掉一些換行等符號 sb.append((char)b); } isr.close(); getHC.abort(); //取得采集的內容 _content = sb.toString(); //System.out.println("content : "+_content); } else { if(statusCode == 301 || statusCode == 302){ Header locationHeader = getHC.getResponseHeader("location"); _tc.setUrl(locationHeader.getValue()); _tc.setPostData(""); _tc.setPostMethod("GET"); HttpRequestURL();//重新請求新網(wǎng)頁 } } } catch (HttpException e2) { e2.printStackTrace(); } catch (IOException e2) { e2.printStackTrace(); } } else { PostMethod postHC = new PostMethod(postUrl); postHC.setFollowRedirects(false); postHC.getParams().setHttpElementCharset("UTF-8"); //發(fā)送Cookie StringBuilder cookieValue = new StringBuilder(); for(String key : this.cookie.keySet()){ cookieValue.append(key); cookieValue.append("="); cookieValue.append(this.cookie.get(key)); cookieValue.append("; "); } postHC.setRequestHeader("Cookie", cookieValue.toString()); postHC.setRequestHeader("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows 2000)"); //post數(shù)據(jù)到服務器 if(postData!=null && !postData.equals("")){ HashMap<String,String> argv = new HashMap<String,String>(); String[] arrParams = postData.split("&"); for(int i=0;i<arrParams.length;i++){ if(arrParams[i] == null || arrParams[i].equals("")) { continue; } else if(arrParams[i].indexOf("=") > -1) { String[] nameValue = arrParams[i].split("="); if(nameValue.length > 1) argv.put(nameValue[0], nameValue[1]); } } if(argv!=null){ NameValuePair[] nameValuePair = new NameValuePair[argv.size()]; int i = 0; for(String key : argv.keySet()){ nameValuePair[i] = new NameValuePair(key, argv.get(key)); i++; } postHC.setRequestBody(nameValuePair); } } int statusCode; try { statusCode = httpClient.executeMethod(postHC); Header[] headers = postHC.getResponseHeaders(); for(Header header : headers){ if(header.getElements().length > 1){ HeaderElement[] elements = header.getElements(); for(HeaderElement element : elements){ checkCookie(element); } } else { checkCookie(header); } } if(statusCode==HttpStatus.SC_OK){ String charset = "utf-8"; if(_tc.getEncoding() == GB2312) charset = "gb2312"; else if(_tc.getEncoding() == UTF8) charset = "utf-8"; else if(_tc.getEncoding() == BIG5) charset = "big5"; else charset = "utf-8"; InputStreamReader isr = new InputStreamReader(postHC.getResponseBodyAsStream(), charset); // 設置讀取流的編碼格式,,自定義編碼 // 使用字符讀取方式,,循環(huán)讀取源文件內容 StringBuffer sb = new StringBuffer(); int b ; while ((b = isr.read()) != -1)//順序讀取文件text里的內容并賦值給整型變量b,直到文件結束為止,。 { if (b < 32 && b!= 10 && b != 13 && b != 9) b = 32;//過濾掉一些換行等符號 //if ( b== 10 || b== 13 || b== 9) b = 32;//過濾掉一些換行等符號 sb.append((char)b); } isr.close(); postHC.abort(); //取得采集的內容 _content = sb.toString(); } else { if(statusCode == 301 || statusCode == 302){ Header locationHeader = postHC.getResponseHeader("location"); _tc.setUrl(locationHeader.getValue()); _tc.setPostData(""); _tc.setPostMethod("GET"); HttpRequestURL();//重新請求新網(wǎng)頁 } } } catch (HttpException e2) { e2.printStackTrace(); } catch (IOException e2) { e2.printStackTrace(); } } } private void checkCookie(NameValuePair entry){ if(entry.getName().equals("Set-Cookie")){ //這個就是Cookie了 String value = entry.getValue(); if(value.indexOf(";") >0 ) value = value.substring(0,value.indexOf(";")); System.out.println(entry.toString()); String[] cookieNameValuePair = value.split("="); if(cookieNameValuePair.length > 1){ if(cookieNameValuePair[1].equals("deleted")){ this.cookie.remove(cookieNameValuePair[0]); } else { this.cookie.put(cookieNameValuePair[0], cookieNameValuePair[1]); } } else { this.cookie.remove(cookieNameValuePair[0]); } } } |
|