2011-10-01 190 views
5

我想用java登錄到網站。我用的是org.apache.http,我已經寫了用java登錄網站

HttpClient client = new DefaultHttpClient(); 
HttpPost post = new HttpPost("https://accounts.google.com/ServiceLogin?  service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2F%3Fhl%3Dsl%26tab%3Dwm%26ui%3Dhtml%26zy%3Dl&bsv=llya694le36z&scc=1&ltmpl=default&"); 
try { 
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
nameValuePairs.add(new BasicNameValuePair("vb_login_username", 
        "XXX")); 
nameValuePairs.add(new BasicNameValuePair("vb_login_password", 
        "XXX")); 
post.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
HttpResponse response = client.execute(post); 
BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
String line = ""; 
while ((line = rd.readLine()) != null) { 
System.out.println(line); 
      } 
} catch (IOException e) { 
e.printStackTrace(); 
     } 

它發出的帖子形式正確我已經測試過,但我仍然無法登錄。我想登錄的網站是http://www.xtratime.org/forum/對此有任何想法或是有不同的方式嗎?

+2

爲什麼會有所有thos在URL中'?'之後的空格? –

+1

您的代碼中的網址與您的目標網站的網址不匹配。那不就是一隻紅鯡魚嗎? – BalusC

+0

什麼是HttpResponse?響應碼是200嗎?返回的HTML仍然是登錄頁面? – jeff

回答

5
<form action="login.php?do=login" method="post" 
    onsubmit="md5hash(vb_login_password, vb_login_md5password, 
     vb_login_md5password_utf, 0)"> 
  • 之前提交頁面編碼的密碼(onsubmit)。你應該在代碼中做同樣的事情。

  • action屬性的值與您的代碼(https://accounts.google.com...)不匹配。您應該將發佈的請求發送到login.php?do=login

而且還有很多隱藏字段:

<input type="hidden" name="s" 
    value="b804473163cb55dce0d43f9f7c41197a" /> 

<input type="hidden" name="securitytoken" 
    value="0dcd78b4c1a376232b62126e7ad568e0d1213f95" /> 

<input type="hidden" name="do" value="login" />  

<input type="hidden" name="vb_login_md5password" /> 

<input type="hidden" name="vb_login_md5password_utf" /> 

你應該把這些參數了。

通常,比解碼javascript更容易安裝HttpFox Firefox Add-on檢查發佈參數的請求。

我的瀏覽器發送這些後參數(是HttpFox捕獲,密碼爲pass1):

vb_login_username: user1 
vb_login_password: 
s: 5d8bd41a83318e683de9c55a38534407 
securitytoken: 0dcd78b4c1a376232b62126e7ad568e0d1213f95 
do: login 
vb_login_md5password: a722c63db8ec8625af6cf71cb8c2d939 
vb_login_md5password_utf: a722c63db8ec8625af6cf71cb8c2d939 

編輯

我下面的作品,我可以得到「謝謝你用於登錄「消息中的印刷html代碼:

final HttpClient client = new DefaultHttpClient(); 
final HttpPost post = new HttpPost(
     "http://www.xtratime.org/forum/login.php?do=login"); 
try { 
    final List<NameValuePair> nameValuePairs = 
     new ArrayList<NameValuePair>(1); 
    nameValuePairs.add(new BasicNameValuePair("vb_login_username", 
      "my user")); 
    nameValuePairs.add(new BasicNameValuePair("vb_login_password", "")); 
    nameValuePairs.add(new BasicNameValuePair("s", "")); 
    nameValuePairs.add(new BasicNameValuePair("securitytoken", 
      "inspected with httpfox, like f48d01...")); 
    nameValuePairs.add(new BasicNameValuePair("do", "login")); 
    nameValuePairs.add(new BasicNameValuePair("vb_login_md5password", 
      "inspected with httpfox, like 8e6ae1...")); 
    nameValuePairs.add(new BasicNameValuePair(
      "vb_login_md5password_utf", 
      "inspected with httpfox, like 8e6ae1...")); 

    post.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
    final HttpResponse response = client.execute(post); 
    final BufferedReader rd = new BufferedReader(new InputStreamReader(
      response.getEntity().getContent())); 
    String line = ""; 
    while ((line = rd.readLine()) != null) { 
     System.out.println(line); 
    } 
} catch (final IOException e) { 
    e.printStackTrace(); 
} 
+0

這是否意味着我應該散列我爲「vb_login_password」設置的值,或者應該發送散列作爲別的 –

+0

我認爲你應該。檢查我更新的答案。如果您打算只使用一個密碼,我建議使用HttpFox。 – palacsint

+0

感謝您的幫助,但仍然無法正常工作 –

1

我建議你使用htmlunit

是的HtmlUnit一個 「無圖形界面的瀏覽器的Java程序。」它建模HTML 文檔並提供一個API,它允許您調用頁面,填寫 表單,單擊鏈接等......就像您在「普通」瀏覽器中執行的操作一樣。

它具有相當不錯的JavaScript的支持(這是不斷提高) 並能夠與相當複雜的AJAX庫甚至工作,無論是 Firefox或Internet Explorer取決於你 要使用的配置模擬。

它通常用於測試目的或從網站檢索信息 。

+0

此功能是否像硒一樣富有,穩定和活躍? HtmlUnit是否有強大的無GUI選擇?謝謝。 –

+0

在基於gui/browser的測試API中,我只能打開一個網頁,因爲計算機中只有一個鼠標指針可以執行單擊操作。那麼,我可以在同一個網站上用html單元運行多個測試,因爲這沒有gui,並且可能不會移動鼠標?謝謝。 –