`
johnnyhg
  • 浏览: 349328 次
  • 来自: NA
社区版块
存档分类
最新评论

(转)用httpClient获取hotmail联系人列表

    博客分类:
  • web
阅读更多
http://blog.jiexoo.com/2008/05/21/%e7%94%a8httpclient%e8%8e%b7%e5%8f%96hotmail%e8%81%94%e7%b3%bb%e4%ba%ba%e5%88%97%e8%a1%a8/
第一步,用HttpClient访问http://login.live.com/login.srf?id=2,这个页面会返回一个登录表单

第二步,解析出form中所有的隐含变量和form的action,这些变量是你必须要通过httpClient Post回去,hotmail服务器会验证这些参数,另外,你还必须传递一个PwdPad变量,它的值是IfYouAreReadingThisYouHaveTooMuchFreeTime  从后面截取登录密码长度的值,比如你的密码是123,则PwdPad的值是IfYouAreReadingThisYouHaveTooMuchFreeT 

第三、为了知道你接下来导向的地址,你必须解析服务器给你返回的脚本,其中relpace(”***”)中的***即为重定向的地址

第四、得到上一步重定向后的真实的主机地址,联系人列表页面的具体地址就是http://+ hostAddress + /mail/GetContacts.aspx

第五、用正则表达式解析此页面即可

具体代码如下:
  import org.apache.commons.httpclient.HttpClient;
    import org.apache.commons.httpclient.Cookie;
    import org.apache.commons.httpclient.NameValuePair;
    import org.apache.commons.httpclient.methods.GetMethod;
    import org.apache.commons.httpclient.methods.PostMethod;
    import org.apache.commons.httpclient.cookie.CookiePolicy;
    import org.apache.commons.lang.StringUtils;

    import java.util.regex.Pattern;
    import java.util.regex.Matcher;
    import java.util.List;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.io.InputStream;
    import java.io.IOException;
    import java.io.BufferedReader;
    import java.io.InputStreamReader;

    /**
     * User: cjp
     * Date: 2008-4-30
     * Time: 9:26:58
     */
    public class HotmailImporter {
        public static String[] parseContact(String loginname, String password) throws Exception {
            HttpClient client = new HttpClient();
            client.getParams().setCookiePolicy(
                    CookiePolicy.BROWSER_COMPATIBILITY);

            //获取登录页面html
            String hotmailUrl = “http://login.live.com/login.srf?id=2“;
            GetMethod hotmailGet = new GetMethod(hotmailUrl);
            hotmailGet.setRequestHeader(”Accept”, “image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*”);
            hotmailGet.setRequestHeader(”Accept-Language”, “zh-cn”);
            hotmailGet.setRequestHeader(”User-Agent”, “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 2.0.50727)”);
            hotmailGet.setRequestHeader(”Host”, “www.hotmail.com“);
            hotmailGet.setRequestHeader(”Connection”, “Keep-Alive”);
            client.executeMethod(hotmailGet);

            String responseStr = hotmailGet.getResponseBodyAsString();

            hotmailGet.releaseConnection();

            //传递所有的cookie
            Cookie[] cookies = client.getState().getCookies();
            String cookieStr = “”;
            for (Cookie cookie : cookies) {
                cookieStr += cookie.getName() + “=” + cookie.getValue() + “;”;
            }

            //分析登录页面的HTML,获取action,ppsx,ppft
            String actionUrl = getFormUrl(responseStr);

            NameValuePair loginPair = new NameValuePair(”login”, loginname);
            NameValuePair loginOptionsPair = new NameValuePair(”LoginOptions”, “2″);
            NameValuePair passwdPair = new NameValuePair(”passwd”, password);
            NameValuePair ppsxPair = new NameValuePair(”PPSX”, getInputValue(”ppsx”, responseStr));
            NameValuePair ppftPair = new NameValuePair(”PPFT”, getInputValue(”ppft”, responseStr));

            //算出pwdpad
            String pwdpad = “IfYouAreReadingThisYouHaveTooMuchFreeTime”;
            pwdpad = StringUtils.substring(pwdpad, 0, pwdpad.length() - password.length());
            NameValuePair pwdpadPair = new NameValuePair(”PwdPad”, pwdpad);
            PostMethod loginPost = new PostMethod(actionUrl);
            loginPost.setRequestBody(new NameValuePair[]{loginPair, passwdPair, ppsxPair, ppftPair, loginOptionsPair, pwdpadPair});

            loginPost.setRequestHeader(”Accept”, “image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*”);
            loginPost.setRequestHeader(”Referer”, hotmailGet.getURI().toString());
            loginPost.setRequestHeader(”Accept-Language”, “zh-cn”);
            loginPost.setRequestHeader(”User-Agent”, “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 2.0.50727)”);
            loginPost.setRequestHeader(”Host”, “login.live.com”);
            loginPost.setRequestHeader(”Connection”, “Keep-Alive”);
            loginPost.setRequestHeader(”Cache-Control”, “no-cache”);

            loginPost.setRequestHeader(”Cookie”, cookieStr);

            client.executeMethod(loginPost);

            String str = loginPost.getResponseBodyAsString();
            loginPost.releaseConnection();

            String toUrl = StringUtils.substringBetween(str, “replace(\”", “\”);}function OnBack()”);

            //获取登录后的跳转页面
            GetMethod getMethod = new GetMethod(toUrl);
            client.executeMethod(getMethod);

            //获取联系人列表
            GetMethod contactMethod = new GetMethod(”http://” + getMethod.getURI().getHost() + “/mail/GetContacts.aspx”);
            getMethod.releaseConnection();

            client.executeMethod(contactMethod);
            List<String> contacts = parseContacts(contactMethod.getResponseBodyAsStream());
            contactMethod.releaseConnection();
            //noinspection ToArrayCallWithZeroLengthArrayArgument
            return contacts.toArray(new String[]{});
        }
        private static List<String> parseContacts(InputStream contactsContent) throws IOException {
            List<String> contacts = new ArrayList<String>();
            BufferedReader in = new BufferedReader(new InputStreamReader(contactsContent));
            String line;
            while ((line = in.readLine()) != null) {
                System.out.println(line);
                String[] values = line.split(”,”);
                if (values.length < 47) continue;
                String email = parseValue(values[46]);
                if (email.length() == 0) continue;
                email = email.toLowerCase();

                if (isEmailAddress(email)) {
                    contacts.add(email);
                }
            }
            return contacts;
        }

        private static String parseValue(String value) {
            if (value.length() > 0 && value.charAt(0) == ‘”‘) {
                value = value.substring(1, value.length() - 1);
            }
            return value;
        }

        private static String getFormUrl(String content) throws Exception {
            content = content.substring(content.indexOf(”<form”) + 5);
            String actionAttribute = content.split(”\\s+”)[5];
            Pattern p = Pattern.compile(”\”(.*?)\”");
            Matcher matcher = p.matcher(actionAttribute);
            if (!matcher.find()) {
                throw new Exception(”hotmail登录界面已改变,无法正常解析”);
            }
            return matcher.group(1);
        }

        private static String getInputValue(String name, String content) throws Exception {
            Pattern p = Pattern.compile(”^.+value=\”([^\\s\"]+)\”");
            int index = content.indexOf(name.toUpperCase()) + name.length() + 2;
            content = content.substring(index, index + 200 > content.length() ? content.length() : index + 200);

            Matcher matcher = p.matcher(content);
            if (!matcher.find()) {
                throw new Exception(”hotmail登录界面已改变,无法正常解析”);
            }
            return matcher.group(1);
        }

        public static boolean isEmailAddress(String email) {
            Pattern emailPattern = Pattern.compile(
                    “^[0-9a-z]([-_.~]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,4}$”
            );
            return emailPattern.matcher(email).matches();
        }

        public static void main(String[] args) {
            try {
                String[] contacts = parseContact(”test@live.cn“, “test”);
                System.out.println(Arrays.toString(contacts));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
分享到:
评论
9 楼 gyqxaytsz 2012-02-06  
gyqxaytsz 写道
你这个程序的正则表达式都有问题吧?都需要改啊

8 楼 gyqxaytsz 2012-02-06  
你这个程序的正则表达式都有问题吧?
7 楼 gyqxaytsz 2012-02-03  
终于可以运行了,但是得不到任何结果啊,是个空值
6 楼 gyqxaytsz 2012-02-02  
java.lang.IllegalArgumentException: host parameter is null
at org.apache.commons.httpclient.HttpConnection.setHost(HttpConnection.java:248)
at org.apache.commons.httpclient.SimpleHttpConnectionManager.getConnectionWithTimeout(SimpleHttpConnectionManager.java:163)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:152)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:324)
at hotMailTest.hotMail.parseContact(hotMail.java:86)
at hotMailTest.hotMail.main(hotMail.java:167)
5 楼 gyqxaytsz 2012-02-02  
java.lang.Exception: hotmail登录界面已改变,无法正常解析
at hotMailTest.hotMail.getInputValue(hotMail.java:137)

at hotMailTest.hotMail.parseContact(hotMail.java:52)

---->NameValuePair ppsxPair = new NameValuePair("PPSX", getInputValue("ppsx", responseStr));


at hotMailTest.hotMail.main(hotMail.java:149)

---->String[] contacts = parseContact(”test@live.cn“, “test”);
4 楼 gyqxaytsz 2012-02-02  
有现在还能用的吗?提示hotmail登录界面已改变,无法正常解析

还有需要导入的jar包都有那些啊?我导了4个包不知道对不对:
commons-logging-1.0.4.jar
commons-lang-2.3.jar
commons-httpclient-3.0.1.jar
commons-codec-1.6.jar
不知道我导入的全不全或者有多余的?希望指点一下,谢谢!!
3 楼 zhangrl666 2008-12-05  
log4j:WARN No appenders could be found for logger (org.apache.commons.httpclient.HttpClient).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" java.lang.Exception: hotmail登录界面已改变,无法正常解析
at com.test001.email.HotmailImporter.getInputValue(HotmailImporter.java:125)
at com.test001.email.HotmailImporter.parseContact(HotmailImporter.java:49)
at com.test001.email.HotmailImporter.main(HotmailImporter.java:146)
2 楼 yxl0917 2008-09-07  
没有能够正确的运行呀
1 楼 lordhong 2008-05-22  
冷。。。brutal force。。。

相关推荐

    httpclient 获取技术博客列表

    标题中的“httpclient 获取技术博客列表”指的是使用Apache HttpClient库来获取网络上的技术博客列表。HttpClient是一个Java库,它提供了一种丰富的API来执行HTTP请求,包括GET、POST等方法,用于从网页抓取数据。在...

    HttpClient获取OAuth2.0中的code

    通过httpclient post去获取,response返回码是302,返回的code放在header的Location中。 请求的时候client_id,response_type,redirect_uri,state拼接在url后面,account和password放在body表单(x-...

    android HttpClient 获取网络图片

    android HttpClient 获取网络图片 实例

    通过HTTPClient获取网络资源

    本篇文章将深入探讨如何使用`HttpClient`来获取网络资源,以及处理返回的XML数据。 首先,我们需要了解`HttpClient`的基本用法。在Java中,创建一个`HttpClient`实例是获取网络资源的第一步。`HttpClient`提供了...

    httpClient 调用远程接口 获取数据到本地文件夹

    在这个场景中,我们使用HttpClient来调用远程接口,从电信公司的网站获取可用的新手机号码信息,并将这些数据存储到本地文件中。以下是对这个过程的详细解释: 1. **HttpClient的基本使用**: HttpClient提供了一...

    Java爬虫Jsoup+httpclient获取动态生成的数据

    通过分析这些请求,开发者可以找到数据接口,并使用HttpClient来模拟这些请求,获取到动态加载的数据。 在本例中,我们通过Jsoup获取到了京东商品页面的静态HTML代码,但价格信息并未包含在内。通过分析页面源码...

    使用HttpClient获取网页html源代码.zip

    在Android Studio中,由于早期版本的HttpClient已被弃用,因此需要添加依赖: ```xml dependencies { implementation 'org.apache.httpcomponents:httpclient-android:4.3.5.1' } ``` 接下来,我们创建一个...

    HttpClient网络获取图片

    从网络获取数据和图片,用gson解析并用listview展示

    Android源码之用HttpClient获取网页

    本篇文章将深入探讨如何在Android源码中使用HttpClient库来获取网页。HttpClient是Apache的一个开源项目,提供了强大的HTTP客户端功能,使得开发者能够方便地进行网络通信。 首先,我们需要在Android项目中引入...

    Android例子源码使用HttpClient获取网页html源代码

    首先,我们来看`HttpClient`的使用。Apache HttpClient是一个强大的HTTP客户端库,它提供了丰富的功能来处理HTTP请求和响应。在Android 2.3.3版本中,HttpClient是官方推荐的网络通信方式。下面是一段基本的使用示例...

    HttpClient 获取数据

    HttpClient的使用方法可能包括创建一个HttpClient实例,设置请求方法(GET、POST等)、URL、请求头、查询参数或请求体,然后发送请求并接收响应。响应对象通常会包含状态码、头部信息和响应体,可以从中提取出需要的...

    利用HttpClient获取数据并用Gson解析Json数据

    本教程将专注于使用Apache HttpClient库获取网络数据,然后使用Google的Gson库解析JSON格式的数据。这是一个基础但重要的技能,对于任何想要与服务器进行交互的开发者来说都是必备的。 首先,我们需要了解`...

    JAVA获取邮件联系人

    用户提供邮箱帐号和密码,获取该邮箱联系人列表: 方法1:利用各邮箱官方开放的API接口,连接到邮箱服务器;(国外大部分邮箱支持) 方法2:利用httpclient模拟登录邮箱,抓取联系人页面的源代码---------使用http...

    httpclient httpclient.jar

    在本文中,我们将深入探讨HttpClient的核心概念、使用方法以及如何通过`httpclient.jar`进行实战应用。 首先,HttpClient的主要组件包括: 1. **HttpClient实例**:这是整个HTTP通信的核心,负责管理连接、请求和...

    httpClient获取json数据,自动化测试

    httpClient获取json格式的数据,并将数据赋值与自动化测试平台

    使用HttpClient发送POST请求,并获取响应内容(附详细步骤).txt

    ### 使用HttpClient发送POST请求,并获取响应内容 #### 一、简介 在现代软件开发中,尤其是在Web应用领域,客户端与服务器之间的通信是非常重要的环节。Java作为一种广泛应用的编程语言,提供了多种方式来实现这一...

    httpClient和htmlparse获取网页数据使用jar

    首先,使用HttpClient发起HTTP请求并获取响应,然后将响应内容传递给HtmlParser进行解析。例如: ```java CloseableHttpClient httpClient = HttpClients.createDefault(); HttpGet httpGet = new HttpGet(...

    通过httpclient获取到JSON数据,展示到ListView

    此外,由于Android API Level 23后已弃用HttpClient,推荐使用`HttpURLConnection`或第三方库如OkHttp进行网络请求。 总结一下,通过HTTPClient获取JSON数据并展示到ListView的主要步骤包括: 1. 使用HTTPClient...

    httpclient获取目标网站内容,get、post方式(可运行)

    本项目提供了可运行的示例,展示了如何使用HttpClient来获取目标网站内容。 首先,`pom.xml`是Maven项目的配置文件,它包含了项目所依赖的库,如Apache HttpClient库。在`pom.xml`中,你需要确保引入了正确的...

    httpclient方式调用url

    4. **执行请求**:使用HttpClient实例执行请求,并获取HttpResponse对象: ```java HttpResponse response = httpClient.execute(httpGet); ``` 5. **处理响应**:从HttpResponse对象中读取响应状态码和数据。...

Global site tag (gtag.js) - Google Analytics