2010-11-10 3 views
1

J'ai passé trois semaines pour trouver une solution pour se connecter sur facebook home sans navigateur. J'ai écrit ce code par exemple, mais il renvoie une erreur:HttpClient problème avec la poignée de redirection et facebook login sans navigateur

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

code:

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(); 
    } 
} 

Est-ce bon code? Que dois-je faire pour suivre une redirection? J'ai déjà essayé avec postmethod.setfollowredirect(true) mais l'erreur persiste.

Répondre

0

PostMethod est un EntityEnclosingMethod. L'appel de setFollowRedirect() sur PostMethod ne fonctionnera pas. Voir:

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

Peut-être que vous devriez faire une demande de la tête la première, ou peut-être vous pourriez commencer avec une URL différente. Essayez "http://www.facebook.com/login.php" au lieu de l'URL que vous avez.

+0

Bonjour comment est-ce que je soumettrais la boîte de dialogue "voudrait accéder à votre profil public et à votre liste d'amis" – jackyesind

Questions connexes