2009-12-14 117 views
2

任何示例,提示,以下場景的指導?apache HttpClient訪問Facebook

我已經使用Apache HttpClient來模擬瀏覽器通過Java應用程序訪問Facebook的功能。要做到這一點,我必須提供用戶憑據。我已經使用了以下網站提供的示例。

http://svn.apache.org/viewvc/httpcomponents/oac.hc3x/trunk/src/examples/

但是這些方法不適用於Facebook的,下面是測試代碼,我爲了這個目的寫的。我沒有提供所有寫的方法,只有用於登錄Facebook帳戶的方法在這裏給出。繼電器感謝所有幫助

private static int connectAndLogin(String email, String pass){ 
    logger.trace("Facebook: =========connectAndLogin begin==========="); 

    String httpResponseBody = getMethod("http://www.facebook.com/login.php"); 
    if(httpResponseBody == null){ 
     //Why don't we try again? 
     try 
     { 
      Thread.sleep(1000); 
     } 
     catch (InterruptedException e) 
     { 
      logger.trace(e.getMessage()); 
     } 
     httpResponseBody = getMethod("http://www.facebook.com/login.php"); 
    } 
    logger.trace("Facebook: ========= get login page ResponseBody begin==========="); 
    logger.trace(httpResponseBody); 
    logger.trace("Facebook: +++++++++ get login page ResponseBody end+++++++++"); 

    logger.trace("Facebook: Initial cookies: "); 
    List<Cookie> cookies = getCookies(); 
    if (cookies.isEmpty()) { 
     logger.trace("Facebook: None"); 
    } else { 
     for (int i = 0; i < cookies.size(); i++) { 
      logger.trace("Facebook: - " + cookies.get(i).toString()); 
     } 
    } 
    if(httpResponseBody == null){ 
     logger.warn("Facebook: Warning: Failed to get facebook login page."); 
    } 

    try 
    { 
     HttpPost httpost = new HttpPost("http://www.facebook.com/login.php"); 

     List <NameValuePair> nvps = new ArrayList <NameValuePair>(); 
     nvps.add(new BasicNameValuePair("email", email)); 
     nvps.add(new BasicNameValuePair("pass", pass)); 
     //don't know if is this necessary 
     nvps.add(new BasicNameValuePair("login", "")); 

     httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8)); 
     logger.info("Facebook: @executing post method to:" + "http://www.facebook.com/login.php"); 

     HttpResponse loginPostResponse = getHttpClient().execute(httpost); 
     HttpEntity entity = loginPostResponse.getEntity(); 

     logger.trace("Facebook: Login form post: " + loginPostResponse.getStatusLine()); 
     if (entity != null) { 
      logger.trace("Facebook: "+EntityUtils.toString(entity)); 
      entity.consumeContent(); 
     } else { 
      logger.error("Facebook: Error: login post's response entity is null"); 
      return FacebookErrorCode.kError_Login_GenericError; 
     } 

     logger.trace("Facebook: Post logon cookies:"); 
     cookies = getCookies(); 
     if (cookies.isEmpty()) { 
      logger.trace("Facebook: None"); 
     } else { 
      for (int i = 0; i < cookies.size(); i++) { 
       logger.trace("Facebook: - " + cookies.get(i).toString()); 
      } 
     } 

     int statusCode = loginPostResponse.getStatusLine().getStatusCode(); 

     logger.info("Facebook: Post Method done(" + statusCode + ")"); 



     switch(statusCode){ 
     case 100: break;//we should try again; 
     case 301: 
     case 302: 
     case 303: 
     case 307: 
     { 
      //redirect 
    //    Header[] headers = loginPostResponse.getAllHeaders(); 
    //    for (int i=0; i<headers.length; i++) { 
    //     logger.trace("Facebook: "+headers[i]); 
    //    } 
    //    Header locationHeader =   loginPostResponse.getFirstHeader("location"); 
    //    if(locationHeader != null){ 
    //     homePageUrl = locationHeader.getValue(); 
    //     logger.info("Facebook: Redirect Location: " + homePageUrl); 
    //     if(homePageUrl == null 
    //      || !homePageUrl.contains("facebook.com/home.php")){ 
    //      logger.error("Facebook: Login error! Redirect Location Url not contains \"facebook.com/home.php\""); 
    //      return FacebookErrorCode.kError_Login_GenericError; 
    //     } 
    //    } else { 
    //     logger.warn("Facebook: Warning: Got no redirect location."); 
    //    } 
     } 
     break; 
     default:; 
     } 
    } 
    catch (IOException ioe) 
    { 
     logger.error("Facebook: IOException\n" + ioe.getMessage()); 
     return FacebookErrorCode.kError_Global_ValidationError; 
    } 

    logger.trace("Facebook: =========connectAndLogin end=========="); 
    return FacebookErrorCode.Error_Global_NoError; 
} 

回答

2

下面的代碼,根據that sample,爲我工作:

DefaultHttpClient httpclient = new DefaultHttpClient(); 

HttpGet httpget = new HttpGet("http://www.facebook.com/login.php"); 

HttpResponse response = httpclient.execute(httpget); 
HttpEntity entity = response.getEntity(); 

System.out.println("Login form get: " + response.getStatusLine()); 
if (entity != null) { 
    entity.consumeContent(); 
} 
System.out.println("Initial set of cookies:"); 
List<Cookie> cookies = httpclient.getCookieStore().getCookies(); 
if (cookies.isEmpty()) { 
    System.out.println("None"); 
} else { 
    for (int i = 0; i < cookies.size(); i++) { 
     System.out.println("- " + cookies.get(i).toString()); 
    } 
} 

HttpPost httpost = new HttpPost("http://www.facebook.com/login.php"); 

List <NameValuePair> nvps = new ArrayList <NameValuePair>(); 
nvps.add(new BasicNameValuePair("email", "******")); 
nvps.add(new BasicNameValuePair("pass", "*******")); 

httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8)); 

response = httpclient.execute(httpost); 
entity = response.getEntity(); 
System.out.println("Double check we've got right page " + EntityUtils.toString(entity)); 

System.out.println("Login form get: " + response.getStatusLine()); 
if (entity != null) { 
    entity.consumeContent(); 
} 

System.out.println("Post logon cookies:"); 
cookies = httpclient.getCookieStore().getCookies(); 
if (cookies.isEmpty()) { 
    System.out.println("None"); 
} else { 
    for (int i = 0; i < cookies.size(); i++) { 
     System.out.println("- " + cookies.get(i).toString()); 
    } 
} 

httpclient.getConnectionManager().shutdown(); 

我不知道,如果你的代碼是管理妥善餅乾(和會話ID保存其中的一個內),也許這是問題。希望這會幫助你。

只是爲了明確版本問題:我使用HttpClient版本4.X,而不是舊的(3.X)。它們有很大不同。

+0

Thankx很多哥們,thanx您在此花費的時間, – KItis 2009-12-16 12:43:54

+0

它使用我的用戶名和密碼登錄。當我的朋友嘗試它不會登錄 – muthu 2013-07-30 11:05:09

0

您拍照時看看HtmlUnit。它包裝HttpClient以創建無頭Java瀏覽器,並執行javaScript。這樣你就不會一直試圖破解個人表格。