Question

Tous les exemples, des conseils, des orientations pour le scénario suivant?

Je l'ai utilisé Apache HttpClient pour simuler la fonctionnalité du navigateur pour accéder à facebook par l'application java. de le faire d'abord je dois fournir des informations d'utilisateur. J'ai utilisé des exemples fournis dans le site Web suivant.

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

Mais non de ces méthodes fonctionne pour facebook, voici le code de test je l'ai écrit à cet effet. Je n'ai pas fourni les toutes les méthodes écrites, seule la méthode utilisée pour se connecter au compte facebook est donnée ici. relay apprécier toute aide

    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;
}
Était-ce utile?

La solution

Le code suivant, basé sur cet échantillon , a fonctionné pour moi:

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

Je ne suis pas sûr que votre code a été bien gérer les cookies (ID de session et maintenu dans l'un d'eux), peut-être que le problème était. Espérons que cela vous aidera.

Juste pour numéro de version claire: j'utilise la version 4.X HttpClient, pas l'ancien (3.X). Ils diffèrent de manière significative.

Autres conseils

Peut-être que vous devriez utiliser un outil, comme Sélénium

Avez-vous pris un coup d'œil à HtmlUnit . Il enveloppe le HttpClient pour créer un navigateur Java sans tête, avec l'exécution javaScript. De cette façon, vous n'êtes pas essayer de pirater les formes individuelles tout le temps.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top