Получить содержимое после входа в систему в Java - PullRequest
2 голосов
/ 25 сентября 2011

Я хочу войти на сайт (Yahoo Mail - https://login.yahoo.com/config/login?.src=fpctx&.intl=us&.done=http%3A%2F%2Fwww.yahoo.com%2F)

используя HttpClient и после входа в систему я хочу получить содержимое. (Джава). что не так с моим кодом?

public class TestHttpClient {

public static void main(String[] args) throws Exception {

    DefaultHttpClient httpclient = new DefaultHttpClient();

    HttpGet httpget = new HttpGet("http://www.yahoo.com/");

    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("https://login.yahoo.com/config/login_verify2?.intl=us&.src=ym");

    List <NameValuePair> nvps = new ArrayList <NameValuePair>();
    nvps.add(new BasicNameValuePair("IDToken1", "Yahoo! ID"));
    nvps.add(new BasicNameValuePair("IDToken2", "Password"));

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

    response = httpclient.execute(httpost);

    System.out.println("Response "+response.toString());
    entity = response.getEntity();

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

        InputStream is = entity.getContent();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String str ="";
        while ((str = br.readLine()) != null){
            System.out.println(""+str);
        }
    }

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

когда я печатаю вывод из HttpEntity, он печатает содержимое страницы входа. Как получить содержимое страницы после входа в систему с помощью HttpClient?

1 Ответ

2 голосов
/ 25 сентября 2011

Если вы увидите страницу источника входа в Yahoo, вы увидите, что есть много других параметров, которые вы не отправляете в своем запросе.

<input type="hidden" name=".tries" value="1">
<input type="hidden" name=".src" value="fpctx">
<input type="hidden" name=".md5" value="">
<input type="hidden" name=".hash" value="">
<input type="hidden" name=".js" value="">
<input type="hidden" name=".last" value="">
<input type="hidden" name="promo" value="">
<input type="hidden" name=".intl" value="us">
<input type="hidden" name=".bypass" value="">
<input type="hidden" name=".partner" value="">
<input type="hidden" name=".u" value="a0bljsd77uima">
<input type="hidden" name=".v" value="0">
<input type="hidden" name=".challenge" value="sCm6Z8Bv1vy78LBlEd8dnFsmbit1">
<input type="hidden" name=".yplus" value="">
...

Полагаю, именно поэтому Yahoo понимает логинне удалось и отправляет вас на страницу входа снова.Эта страница входа - это то, что вы видите как ответ.

Многие сайты стараются избегать программных входов в систему (чтобы избежать ботов или других проблем безопасности), поэтому может быть трудно сделать то, что вы пытаетесь.Вы можете:

  • Использовать официальные публичные API Yahoo, когда это возможно.
  • Попробуйте использовать другие библиотеки Java, которые имитируют просмотр пользователя (например, HTTPUnit или HtmlUnit , есть много других) и «фальсифицирует» пользователя, как если бы он перемещался по страницам Yahoo.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...