Android: 如何使用HttpsURLConnection编程方式登录网页

4
我是一个新手,对于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
"点击"实际上是向服务器发送请求并显示返回信息。
1. 找出要调用的URL是什么(如果是网页,请参见例如firebug)。 2. 查找参数,查找方法是GET还是POST。 3. 以编程方式复制。 4. “登录”阶段可能涉及使用cookie,服务器会给您并且您必须随后为每个请求发送回来。
但是,您的方法是错误的。您不应尝试通过url连接直接登录Google。(也应该使用HttpClient)。此外,请求属性不是参数。它们是标题。
我强烈建议您从更简单的事情开始,以便在Java中熟悉HTTP,GET,POST,参数,标题,响应,cookie等方面。
编辑:
收到响应后,您将要检查它。
response.getStatusLine().getStatusCode() < 400

它会告诉您登录成功了。 (2xx 表示成功,3xx 表示被移动等。4xx表示请求错误,5xx表示服务器端错误;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();

应该是这样的。

谢谢您的回答!沿着这个思路:上面的代码使用了HttpClient,而GMAIL_LOGIN是url,需要2个参数,email和pass;方法是POST。我想,这就是您的观点(1/2/3)。我的问题是,在这种情况下,我该如何获取Cookies,以及如何“在页面之间导航”?您能给我一些相关的代码吗?(我知道我对Java中的Http知识很少,但时间已经接近完成任务,我卡住了;这就是为什么我请求帮助的原因。) - Lama
谢谢你的代码!我尝试了很多不同类型的它,但仍然没有做到我想要的。也许我错过了什么......我编辑了第一个评论和代码,请如果您有任何想法,那么是什么出了问题,请评论! - Lama

1

您正在尝试解析 Gmail 的 HTML 页面。这是错误的做法,因为 Gmail 使用 JavaScript 来构建页面。您的代码必须模拟浏览器(执行 JavaScript)才能使其工作。

如果您只需要读取 Gmail,则使用 Gmail inbox feed API。这将使您访问收件箱中的未读消息。

如果您需要完全访问权限,请查看Gmail IMAP access。由于 IMAP 是一种不同的协议,所以您需要使用单独的 Java IMAP 库。请参阅 this tutorial


非常感谢您的回答,但它并不完全关于我所想的。我必须在特定(私人)网站上执行此操作,而不是在 Gmail 上。我提到 Gmail 只是为了举个例子,因为它对大多数人来说都很知名,并且它与我必须获取的页面相同(登录-> 转到某些页面-> 注销)。 - Lama

0

你应该考虑使用POST请求将数据传递到服务器:在Android中发送POST数据

更改连接的属性与您想要实现的目标无关。

敬礼, 斯蒂芬


谢谢您的回答!我尝试了(创建客户端,发布,执行响应,然后直接打开到“内部页面”的连接),但问题仍然存在。我仍然得到的是登录页面。所以,“点击部分”仍未解决。 - Lama
没有“点击部分”,您只需使用与登录相同的客户端(apache httpcommons)加载此URL即可。另外,不要忘记在客户端上启用cookie,因为登录信息可能存储在某个cookie中。 - Snicolas
1/ "你应该使用相同的客户端(Apache HttpCommons)加载此 URL" 2/ "启用 cookies..." - 但我怎么做呢?我是 Java 新手,您能给我一些示例代码吗?" - Lama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接