2011-08-24 99 views
4

我是Android新手(也是Java),如果我的問題是一個基本命題,非常抱歉! 我必須編寫一個Android應用程序,在後臺登錄aspx網頁,從中獲取一些數據,然後從網頁中註銷。 (和這樣做,所有程序)Android:如何以編程方式登錄到網頁,使用HttpsURLConnection

基本上,該過程喜歡的Gmail電子郵件獲取列表:
1.去 'https://mail.google.com',並在
2跡象。點擊 「聯繫人」(==去 「https://mail.google.com/mail/?shva=1 & ZX = dzi4xmuko5nz#聯繫人」)
3.使用抓取網頁HttpsURLConnection的(或類似的東西),並獲得電子郵件(例如地圖或字符串)對象
4.點擊「退出」鏈接

我希望,這是可以理解的。看着互聯網,我發現只有「取材部分」的解決方案,所以這不是問題。但我對「點擊部分」沒有任何意見。

...... 
    // Get the connection 
    URL myurl = new URL("https://mail.google.com"); 
    HttpsURLConnection con = (HttpsURLConnection) myurl.openConnection(); 

    // complete the fields 
    con.setRequestProperty("Email","myacc"); 
    con.setRequestProperty("Passwd","mypass"); 

    /* 
    * in this part, should make sign in, and go directly to contacts... 
    * I don't have any idea how to do it... 
    */ 

    // for the present, just write out the data 
    InputStream ins = con.getInputStream(); 
    BufferedReader in = new BufferedReader(new InputStreamReader(ins)); 

    String inputLine; 
    while ((inputLine = in.readLine()) != null) { 
     Log.d("Page:"," "+inputLine); 
    } 

    in.close(); 

    /* 
    * And here should be the "Sign out" part 
    */ 
    ...... 

任何幫助將是偉大的,謝謝你! (對不起,如果我的英文不太好......)

編輯:問題解決了。謝謝!

.......  
    String GMAIL_CONTACTS = "https://mail.google.com/mail/?shva=1#contacts"; 
    String GMAIL_LOGIN = "https://mail.google.com"; 

     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpPost httpPost = new HttpPost(GMAIL_LOGIN); 

     List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3); 
     nameValuePairs.add(new BasicNameValuePair("Email", MY_ACC)); 
     nameValuePairs.add(new BasicNameValuePair("Passwd", MY_PASS)); 
     nameValuePairs.add(new BasicNameValuePair("signIn", "Sign In")); 

     httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

     // Execute HTTP Post Request 
     HttpResponse response = httpClient.execute(httpPost); 
     Log.d(TAG, "response stat code " + response.getStatusLine().getStatusCode()); 

     if (response.getStatusLine().getStatusCode() < 400) { 

      String cookie = response.getFirstHeader("Set-Cookie") 
        .getValue(); 
      Log.d(TAG, "cookie: " + cookie); 

      // get the contacts page 
      HttpGet getContacts = new HttpGet(GMAIL_CONTACTS); 
      getContacts.setHeader("Cookie", cookie); 
      response = httpClient.execute(getContacts); 

      InputStream ins = response.getEntity().getContent(); 
      BufferedReader in = new BufferedReader(new InputStreamReader(
        ins)); 

      String inputLine; 
      while ((inputLine = in.readLine()) != null) { 
       Log.d(TAG, " " + inputLine); 
      } 

      in.close(); 
     } else { 
      Log.d(TAG, "Response error: " 
        + response.getStatusLine().getStatusCode()); 
     } 
....... 

回答

5

「點擊」基本上是向服務器發送請求並顯示返回信息。

1 /找出所謂的URL該請求(如果它是一個網頁,例如見螢火蟲)

2 /找出的參數,找出如果方法是GET或POST

3 /以編程方式複製。

4 /「登錄」階段可能意味着使用cookie,它的服務器給你和你隨後必須送回每個請求

然而,你的做法是錯誤的。你不應該嘗試通過url連接直接登錄到谷歌。 (你也應該使用HttpClient)。而且,請求屬性不是參數。它們是標題。

我強烈建議你開始的東西,以簡單的獲得舒適與HTTP在Java中,獲取,崗位,參數,頭,響應,餅乾......

編輯

一旦你收到響應,你會想檢查

response.getStatusLine().getStatusCode() < 400 

它會告訴你,登錄成功。 (2xx是成功的,3xx被移動並且4xx是請求中的錯誤,5xx是服務器端錯誤; Gmail響應302登錄以建議重定向到收件箱)。然後,你會發現,存在包含要進一步連接,因此Cookie的響應「設置Cookie」特定標題:

String cookie = response.getFistHeader("Set-Cookie"); 

然後,你應該能夠調用請求來獲取聯繫人:

HttpGet getContacts = new HttpGet(GMAIL_CONTACTS); 
getContacts.setHeader("Cookie", cookie); 
response = httpClient.execute(getContacts); 
InputStream ins = response.getEntity().getContent(); 

它應該是這樣的。

+0

謝謝你的回答!遵循這一思路:上面的代碼使用HttpClient,而GMAIL_LOGIN是url,它需要2個參數,email,pass;方法是POST。我認爲,這是你的觀點(1/2/3 /)。我的問題是,在這種情況下我怎麼能得到Cookies,以及如何「瀏覽頁面之間」?你能給我一些關於它的代碼嗎? (我知道我的知識對Java中的Http很差,但是接近完成此任務的時間,並且我被困住了;這就是爲什麼我要求幫助。) – Lama

+0

我編輯我的帖子,其中包含有關第二個請求的信息 – njzk2

+0

感謝代碼!我嘗試過(很多不同類型的),但仍然沒有,我想要的。也許我錯過了一些東西......我編輯第一個評論請提供代碼,如果您有任何問題,請告訴我,錯誤! – Lama

0

您應該考慮使用POST請求將數據傳遞到服務器:Sending POST data in Android

換款的連接的屬性無關,與你想要達到的目標。

問候, 斯特凡

+0

謝謝你的回答!我試了一下(創建客戶端,發佈,執行響應,然後打開一個連接,直接到'內頁'),但問題仍然存在。它仍然是登錄頁面,我得到了。所以,「點擊部分」仍然沒有解決。 – Lama

+0

沒有「點擊部分」,你應該加載這個URL與你用來登錄的同一個客戶端(apache httpcommons)。另外,不要忘記在客戶端啓用cookie,因爲登錄可能存儲在一些曲奇餅。 – Snicolas

+0

1 /「你應該加載這個網址與相同的客戶端(apache httpcommons)」2 /「...啓用cookie ...」 - 但我怎麼能這樣做?我是Java新手,你能給我一些示例代碼嗎? – Lama

1

你所要做的是分析Gmail的HTML頁面。這是Gmail使用JavaScript構建頁面的錯誤方法。你的代碼必須模擬瀏覽器(執行JavaScript)才能使用。

如果您只需要讀取Gmail的訪問權限,請使用Gmail inbox feed API。這使您可以訪問收件箱中的未讀郵件。

如果您需要完整的訪問權限,請參閱Gmail IMAP access。由於IMAP是一種不同的協議,因此您需要爲java分別使用IMAP庫。見this tutorial

+0

謝謝你的回答,但這不完全是關於我的意思。我必須在特定的(私人)網站上執行此操作,而不是在Gmail上執行此操作。舉例來說,我提到過Gmail,因爲它主要爲大家所熟知,並且它與我必須提取的頁面(登錄 - >進入某個頁面 - >註銷)相同。 – Lama