Android: Как войти на веб-страницу программно, используя HttpsURLConnection - PullRequest
4 голосов
/ 24 августа 2011

Я новичок в Android (и в Java тоже), поэтому извините, если моя проблема - основное предложение! Мне нужно написать приложение для Android, подписать фоновую веб-страницу aspx, получить от нее некоторые данные, и после этого выйти из веб-страницы. (и делать все это программно)

Обычно процедура любит получать список адресов электронной почты из Gmail:
1. перейти к 'https://mail.google.com', и войти в систему
2. нажмите на «Контакты» (== перейдите к «https://mail.google.com/mail/?shva=1&zx=dzi4xmuko5nz#contacts")
» 3. получить страницу, используя HttpsURLConnection (или что-то в этом роде), и получать электронные письма в (например, Map или String) объекте
4. нажмите ссылку "Выйти"

Надеюсь, это понятно. Просматривая интернет, я нахожу решение только для "извлечения части", так что это не проблема. Но я понятия не имею о «щелкающей части».

  ......
    // Get the connection
    URL myurl = new URL("https://mail.google.com");
    HttpsURLConnection con = (HttpsURLConnection) myurl.openConnection();

    // complete the fields
    con.setRequestProperty("Email","myacc");
    con.setRequestProperty("Passwd","mypass");

    /* 
     * in this part, should make sign in, and go directly to contacts... 
     * I don't have any idea how to do it...
     */

    // for the present, just write out the data
    InputStream ins = con.getInputStream();
    BufferedReader in = new BufferedReader(new InputStreamReader(ins));

    String inputLine;
    while ((inputLine = in.readLine()) != null) {
        Log.d("Page:"," "+inputLine);
    }

    in.close();

    /*
     * And here should be the "Sign out" part
     */
  ......

Любая помощь была бы отличной, спасибо за это! (и извините, если мой английский не очень хорошо ...)

РЕДАКТИРОВАТЬ: проблема решена. Спасибо!

 .......    
    String GMAIL_CONTACTS = "https://mail.google.com/mail/?shva=1#contacts";
    String GMAIL_LOGIN = "https://mail.google.com";

        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(GMAIL_LOGIN);

        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3);
        nameValuePairs.add(new BasicNameValuePair("Email", MY_ACC));
        nameValuePairs.add(new BasicNameValuePair("Passwd", MY_PASS));
        nameValuePairs.add(new BasicNameValuePair("signIn", "Sign In"));

        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        // Execute HTTP Post Request 
        HttpResponse response = httpClient.execute(httpPost);
        Log.d(TAG, "response stat code " + response.getStatusLine().getStatusCode());

        if (response.getStatusLine().getStatusCode() < 400) {

            String cookie = response.getFirstHeader("Set-Cookie")
                    .getValue();
            Log.d(TAG, "cookie: " + cookie);

            // get the contacts page 
            HttpGet getContacts = new HttpGet(GMAIL_CONTACTS);
            getContacts.setHeader("Cookie", cookie);
            response = httpClient.execute(getContacts);

            InputStream ins = response.getEntity().getContent();
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    ins));

            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                Log.d(TAG, " " + inputLine);
            }

            in.close();
        } else {
            Log.d(TAG, "Response error: "
                    + response.getStatusLine().getStatusCode());
        }
 .......

Ответы [ 3 ]

5 голосов
/ 24 августа 2011

«Нажатие» - это отправка запроса на сервер и отображение информации о возврате.

1 / выясните, какой URL вызывать для этого запроса (если это веб-страница, см., Например, firebug)

2 / выясните, каковы параметры, выясните, является ли метод GET или POST

3 / воспроизвести программно.

4 / фаза «входа в систему», вероятно, подразумевает использование куки-файла, который сервер дает вам и который вы должны отправить позже для каждого запроса

Однако ваш подход неверен. Вы не должны пытаться войти напрямую в Google через URL-соединения. (Также вы должны использовать HttpClient). Более того, свойства запроса не являются параметрами. Это заголовки.

Я настоятельно рекомендую вам начать с чего-то более простого, чтобы освоиться с HTTP в java, GET, POST, параметрах, заголовках, ответах, файлах cookie ...

редактировать

Получив ответ, вы захотите проверить, что

response.getStatusLine().getStatusCode() < 400

Он скажет вам, что вход был успешным. (2хх успешны, 3хх перемещены и т. Д. 4хх - ошибки в запросе, 5хх - ошибки на стороне сервера; Gmail отвечает 302 на вход в систему, чтобы предложить перенаправление на входящие). Затем вы заметите, что в ответе «Set-Cookie» есть определенный заголовок, который содержит cookie, который вы хотите для дальнейших подключений, так:

String cookie = response.getFistHeader("Set-Cookie");

Тогда вы сможете позвонить по запросу, чтобы получить контакты:

HttpGet getContacts = new HttpGet(GMAIL_CONTACTS);
getContacts.setHeader("Cookie", cookie);
response = httpClient.execute(getContacts);
InputStream ins = response.getEntity().getContent();

Это должно быть что-то подобное.

1 голос
/ 24 августа 2011

Что вы пытаетесь сделать, это проанализировать HTML-страницу Gmail. Это неправильный подход, так как Gmail использует javascript для создания страницы. Ваш код должен эмулировать браузер (выполнить javascript), чтобы это работало.

Если вам нужен только доступ для чтения к Gmail, используйте API фида входящих Gmail . Это дает вам доступ к непрочитанным сообщениям во входящих.

Если вам нужен полный доступ, см. Gmail IMAP-доступ . Поскольку IMAP - это другой протокол, чем HTTP, вам нужно использовать отдельную библиотеку IMAP для Java. См. этот урок .

0 голосов
/ 24 августа 2011

Вам следует рассмотреть возможность использования почтового запроса для передачи данных на сервер: Отправка данных POST в Android

Изменение свойств соединения не имеет ничего общего с тем, чего вы хотите достичь.

С уважением, Стефан

...