2011-08-24 95 views
4

我是Android新手(也是Java),如果我的问题是一个基本命题,非常抱歉! 我必须编写一个Android应用程序,在后台登录aspx网页,从中获取一些数据,然后从网页中注销。 (和这样做,所有程序)Android:如何以编程方式登录到网页,使用HttpsURLConnection

基本上,该过程喜欢的Gmail电子邮件获取列表:
1.去 'https://mail.google.com',并在
2迹象。点击 “联系人”(==去 “https://mail.google.com/mail/?shva=1 & ZX = dzi4xmuko5nz#联系人”)
3.使用抓取网页HttpsURLConnection的(或类似的东西),并获得电子邮件(例如地图或字符串)对象
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()); 
     } 
....... 

回答

5

“点击”基本上是向服务器发送请求并显示返回信息。

1 /找出所谓的URL该请求(如果它是一个网页,例如见萤火虫)

2 /找出的参数,找出如果方法是GET或POST

3 /以编程方式复制。

4 /“登录”阶段可能意味着使用cookie,它的服务器给你和你随后必须送回每个请求

然而,你的做法是错误的。你不应该尝试通过url连接直接登录到谷歌。 (你也应该使用HttpClient)。而且,请求属性不是参数。它们是标题。

我强烈建议你开始的东西,以简单的获得舒适与HTTP在Java中,获取,岗位,参数,头,响应,饼干......

编辑

一旦你收到响应,你会想检查

response.getStatusLine().getStatusCode() < 400 

它会告诉你,登录成功。 (2xx是成功的,3xx被移动并且4xx是请求中的错误,5xx是服务器端错误; Gmail响应302登录以建议重定向到收件箱)。然后,你会发现,存在包含要进一步连接,因此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(); 

它应该是这样的。

+0

谢谢你的回答!遵循这一思路:上面的代码使用HttpClient,而GMAIL_LOGIN是url,它需要2个参数,email,pass;方法是POST。我认为,这是你的观点(1/2/3 /)。我的问题是,在这种情况下我怎么能得到Cookies,以及如何“浏览页面之间”?你能给我一些关于它的代码吗? (我知道我的知识对Java中的Http很差,但是接近完成此任务的时间,并且我被困住了;这就是为什么我要求帮助。) – Lama

+0

我编辑我的帖子,其中包含有关第二个请求的信息 – njzk2

+0

感谢代码!我尝试过(很多不同类型的),但仍然没有,我想要的。也许我错过了一些东西......我编辑第一个评论请提供代码,如果您有任何问题,请告诉我,错误! – Lama

0

您应该考虑使用POST请求将数据传递到服务器:Sending POST data in Android

换款的连接的属性无关,与你想要达到的目标。

问候, 斯特凡

+0

谢谢你的回答!我试了一下(创建客户端,发布,执行响应,然后打开一个连接,直接到'内页'),但问题仍然存在。它仍然是登录页面,我得到了。所以,“点击部分”仍然没有解决。 – Lama

+0

没有“点击部分”,你应该加载这个URL与你用来登录的同一个客户端(apache httpcommons)。另外,不要忘记在客户端启用cookie,因为登录可能存储在一些曲奇饼。 – Snicolas

+0

1 /“你应该加载这个网址与相同的客户端(apache httpcommons)”2 /“...启用cookie ...” - 但我怎么能这样做?我是Java新手,你能给我一些示例代码吗? – Lama

1

你所要做的是分析Gmail的HTML页面。这是Gmail使用JavaScript构建页面的错误方法。你的代码必须模拟浏览器(执行JavaScript)才能使用。

如果您只需要读取Gmail的访问权限,请使用Gmail inbox feed API。这使您可以访问收件箱中的未读邮件。

如果您需要完整的访问权限,请参阅Gmail IMAP access。由于IMAP是一种不同的协议,因此您需要为java分别使用IMAP库。见this tutorial

+0

谢谢你的回答,但这不完全是关于我的意思。我必须在特定的(私人)网站上执行此操作,而不是在Gmail上执行此操作。举例来说,我提到过Gmail,因为它主要为大家所熟知,并且它与我必须提取的页面(登录 - >进入某个页面 - >注销)相同。 – Lama