Как войти в Gmail с помощью Apache HttpClient? - PullRequest
0 голосов
/ 11 февраля 2012

Я хочу войти в свой gmail и автоматически получить список контактов с httpClient, Я попробовал метод, описанный на странице ниже: Android: как войти на веб-страницу программно, используя HttpsURLConnection но однажды он побежал к: String cookie = response.getFirstHeader("Set-Cookie").getValue(); была обнаружена исключительная ситуация java.lang.NullPointerException. Я думал, что это потому, что страница была временно перемещена, затем я закодировал свой код так:

    private static String uriLogin = "https://mail.google.com";
private static String uriContacts = "https://mail.google.com/mail/shva=1#contacts";

// the account was registered just for test:
private static String myAcc = "httpclient.test";
private static String myPwd = "testpassword";


public static void main(String[] args) throws ClientProtocolException,
        IOException, InterruptedException {
    DefaultHttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost(uriLogin);

    List<NameValuePair> params = new ArrayList<NameValuePair>(3);
    params.add(new BasicNameValuePair("Email", myAcc));
    params.add(new BasicNameValuePair("Passwd", myPwd));
    params.add(new BasicNameValuePair("signIn", "Sign in"));
    post.setEntity(new UrlEncodedFormEntity(params));
    redp("url is:: ", post.getEntity());
    HttpResponse rsp = client.execute(post);

    if (rsp.getStatusLine().getStatusCode() >= 400) {// returns 302 if
                                                        // success
        System.err.println("failed to get the web page!!!");
        System.err.println("status: " + rsp.getStatusLine());
        System.exit(-1);
    }
    redp("status is:: ", rsp.getStatusLine());
    redp("heads of rsp :: ", "");
    pHeads(rsp);
    redp("content is:: ", EntityUtils.toString(rsp.getEntity()));

    String redirect = rsp.getLastHeader("Location").getValue();
    HttpGet get = new HttpGet(redirect);
    rsp = client.execute(get);

    String cookie = rsp.getFirstHeader("Set-Cookie").getValue();
    redp("cookie is:: ", cookie);

    HttpGet getContacts = new HttpGet(uriContacts);
    getContacts.setHeader("Cookie", cookie);
    redp("heads of get [contacts]:: ", "");
    pHeads(getContacts);
    client.getConnectionManager().shutdown();
    client = new DefaultHttpClient(); // without these 2 lines,
                                        // "java.lang.IllegalStateException"
                                        // will be catched
    rsp = client.execute(getContacts);
    redp("heads of rsp (new) ::", "");
    pHeads(rsp);

    InputStream istream = rsp.getEntity().getContent();
    BufferedReader reader = new BufferedReader(new InputStreamReader(
            istream));

    String line;
    p("联系人列表: ");
    while ((line = reader.readLine()) != null) {
        p(line);
    }
    reader.close();
    istream.close();

}// main

public static void pHeads(HttpMessage msg) {
    Header[] headers = msg.getAllHeaders();
    for (int i = 0; i < headers.length; i++)
        p(headers[i].getName() + ": " + headers[i].getValue());

}

public static void p(Object o) {
    System.out.println(o);
}

public static void redp(String head, Object o) throws InterruptedException {
    System.err.println(head);
    if (o.equals("") || o.equals(null))
        return;
    Thread.sleep(100);
    System.out.println(o);
}

} ` но это все еще не работает ... Любая помощь будет здорово ~~ [Кстати, я видел, как некоторые люди говорят в Интернете, что httpClient был не очень приемлем для такой работы, не могли бы вы сказать, в каком проекте HttpClient используется чаще всего?]

1 Ответ

0 голосов
/ 15 февраля 2012

Из того, что я видел, вы получаете nullPointerEception, когда попадаете в response.getLastHeader ("Location"). GetValue (); похоже, что в заголовке GMail html нет тега «Location». Когда Java не может найти это, он просто выдает «Я не могу найти это»

То, что вы хотите, это перенаправление после того, как происходит POST. На первый взгляд, это что-то вроде: https://accounts.google.com/ServiceLogin?service=mail&passive=true&rm=false&continue=http://mail.google.com/mail/&scc=1&ltmpl=default&ltmplcache=2 но вы должны проверить это дважды. Надеюсь это поможет.

...