2010-11-10 24 views
1

我花了三個星期找到一個解決方案登錄Facebook家沒有瀏覽器。我寫這個例子的代碼,但它返回一個錯誤:HttpClient問題與重定向手柄和Facebook登錄沒有瀏覽器

org.apache.commons.httpclient.HttpMethodDirector isRedirectNeeded INFO: Redirect requested but followRedirects is disabled

代碼:

import java.io.IOException; 
import org.apache.commons.httpclient.Cookie; 
import org.apache.commons.httpclient.Header; 
import org.apache.commons.httpclient.HttpClient; 
import org.apache.commons.httpclient.HttpException; 
import org.apache.commons.httpclient.HttpState; 
import org.apache.commons.httpclient.HttpStatus; 
import org.apache.commons.httpclient.HttpVersion; 
import org.apache.commons.httpclient.NameValuePair; 
import org.apache.commons.httpclient.cookie.CookiePolicy; 
import org.apache.commons.httpclient.methods.GetMethod; 
import org.apache.commons.httpclient.methods.PostMethod; 
import org.apache.commons.httpclient.params.HttpClientParams; 

public class formLogin { 

    public static void main(String[] args) throws HttpException, IOException { 
     // Set target URL 
     String strURL = "http://www.facebook.com/login.php";; 
     System.out.println("Target URL: " + strURL); 

     // Get initial state object 
     HttpState initialState = new HttpState(); 

     // Initial set of cookies can be retrieved from persistent storage 
     // and re-created, using a persistence mechanism of choice, 
     //Cookie mycookie = new Cookie(".foobar.com", "mycookie", "stuff", 
     //  "/", null, false); 

     // and then added to your HTTP state instance 
     //initialState.addCookie(mycookie); 

     // Get HTTP client instance 
     HttpClient httpclient = new HttpClient(); 
     httpclient.getHttpConnectionManager(). 
       getParams().setConnectionTimeout(30000); 

     // do not set preemptive, this forces Basic authentication which is not what we want 
     httpclient.getHostConfiguration().getParams() 
      .setParameter(HttpClientParams.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); 

     httpclient.setState(initialState); 

     // RFC 2101 cookie management spec is used per default 
     // to parse, validate, format & match cookies 
     //httpclient.getParams().setCookiePolicy(CookiePolicy.RFC_2109); 

     // A different cookie management spec can be selected 
     // when desired 
     //httpclient.getParams().setCookiePolicy(CookiePolicy.NETSCAPE); 

     // Netscape Cookie Draft spec is provided for completeness 
     // You would hardly want to use this spec in real life situations 
     httpclient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY); 

     // Compatibility policy is provided in order to mimic cookie 
     // management of popular web browsers that is in some areas 
     // not 100% standards compliant 

     // Get HTTP GET method  
     GetMethod httpget = new GetMethod(strURL); 

     // Execute HTTP GET 
     int result = httpclient.executeMethod(httpget); 

     // Display status code 
     System.out.println("Response status code: " + result); 

     // Get all the cookies 
     Cookie[] cookies = httpclient.getState().getCookies(); 

     // Display the cookies 
     System.out.println("Present cookies: "); 
     for (int i = 0; i < cookies.length; i++) { 
      System.out.println(" - " + cookies[i].toExternalForm()); 
     } 

     // Release current connection to the connection pool 
     // once you are done 
     httpget.releaseConnection(); 

     //Cookie ist da und Jetzt wird eingeloggt 

     PostMethod postMethod = new PostMethod("http://facebook.com/login.php"); 

     NameValuePair[] postData = new NameValuePair[2]; 
     postData[0] = new NameValuePair("email", "******"); 
     postData[1] = new NameValuePair("pass", "******"); 

     postMethod.setRequestBody(postData); 
     for(int i = 0; i < cookies.length; i++){ 
      postMethod.setRequestHeader("Cookie:",cookies[i].toExternalForm()); 
     } 

     try { 
      httpclient.executeMethod(postMethod); 
      int statuscode = postMethod.getStatusCode(); 
      System.out.println("STATUS CODE = "+statuscode); 
     } catch (HttpException httpe) { 
      System.err.print("HttpException"); 
      System.err.println(httpe.getMessage()); 
      httpe.printStackTrace(); 
     } catch (IOException ioe) { 
      System.err.print("IOException"); 
      System.err.println(ioe.getMessage()); 
      ioe.printStackTrace(); 
     } 
     String responseBody = postMethod.getResponseBodyAsString(); 
     System.out.println(responseBody); 

     postMethod.releaseConnection(); 
    } 
} 

這段代碼是否正確?我需要做些什麼才能遵循重定向?我已經試過postmethod.setfollowredirect(true),但錯誤仍然存​​在。

回答

0

PostMethod是一個EntityEnclosingMethod。在PostMethod上調用setFollowRedirect()將不起作用。請參閱:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3

也許你應該先做個HEAD請求,或者你可能只是開始與不同的URL。嘗試「http://www.facebook.com/login.php」而不是您擁有的網址。

+0

嗨如何提交對話框「想訪問您的公共個人資料和朋友列表」 – jackyesind 2013-07-30 12:30:24