2009-12-14 113 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。这样你就不会一直试图破解个人表格。