• Java实现网易163邮箱好友通讯录的解析功能(带源码)

  • 发表时间:2018-07-12 17:08 | 秀站网 | 点击数:
  • 这个源码我之前开源过,昨晚又做了一下。公开源码。这里讲下思路以及真实源码实现。我们将使用1个类HttpClient,这个类的基本用法可以参照:

    我们会使用httpClient以及Httpwatch工具。

    正式开始:

    首先,我们用我们的账户密码登录,这里是thieftest 密码a123456 为了他人方便,请不要修改密码

    为了更快的找到对应的请求地址,我们直接搜索我们的用户名

    我们获取了 https://ssl.mail.163.com/entry/coremail/fcg/ntesdoor2?df=webmail163&from=web&funcid=loginone&iframe=1&language=-1&net=t&passtype=1&product=mail163&race=234_62_188_db&style=-1&uid=thieftest@163.com

    这么一串字符串 ,我们可以看到它是一个POST请求,所以我们需要用httpclient的POST请求来请求服务器。

    下面是POST和GET请求的核心代码,

    public static String doGet(<span><a href="http://www.ij2ee.com/tag/httpclient" title="查看 HttpClient 中的全部文章" target="_blank">HttpClient</a></span> client, String url, String charCode)
    throws URISyntaxException, IllegalStateException, IOException,
    HttpException, InterruptedException {
    HttpGet get = new HttpGet(url);
    return StringUtil.readInputStream(client.execute(get).getEntity()
    .getContent(), charCode);
    }
    public static String doPost(<span><a href="http://www.ij2ee.com/tag/httpclient" title="查看 HttpClient 中的全部文章" target="_blank">HttpClient</a></span> client, String url,
    Map<String, String> param, String charCode)
    throws URISyntaxException, IllegalStateException, IOException,
    HttpException, InterruptedException {
    NameValuePair nvps[] = new BasicNameValuePair[param.size()];
    int i = 0;
    for (Map.Entry<String, String> entry : param.entrySet()) {
    NameValuePair nvp = new BasicNameValuePair(entry.getKey(), entry
    .getValue());
    nvps[i++] = nvp;
    }
    HttpPost httpPost = new HttpPost(url);
    httpPost.setEntity(new UrlEncodedFormEntity(nvps, charCode));
    HttpResponse response = client.execute(httpPost);
    if(response.getStatusLine().getStatusCode()!=200){
    throw new RuntimeException("网页抓取失败,HTTP CODE:"+response.getStatusLine().getStatusCode());
    }
    InputStream is = response.getEntity().getContent();
    return StringUtil.readInputStream(is, charCode);
    }

    根据返回的信息我们分析成功与否,判断的方式就是看有没得到一个叫sid的参数

    返回成功的话 会在消息里有 index?sid=xxxxxxxxx 这一段。 这里的xxxxxxx是至关重要的,我们需要获取他。 这里我们可以使用正则表达式。来获取 大概代码如下:

    private static String regex = "iframe src=/"index.jsp//?sid=([^/"]+)";
    public static String getByRegex(String regex, int index, String txt) {
    Pattern p = Pattern.compile(regex,Pattern.DOTALL);
    Matcher m = p.matcher(txt);
    if (m.find()) {
    return m.group(index);
    }
    return null;
    }

    点通讯后 我们抓包发现了一个URL 貌似记录都在里面。

    是JSON的撒。要是数据多了 我们可以在 上查看目录结构

    但是我们请求这个URL后 发现它就返回了

    <?xml version="1.0" encoding="UTF-8" ?>
    <result>
    <code>S_OK</code>
    </result>

    看来这条路不通啊。继续找把。忽然发现还有打印的操作能得到所有的我们想要的资料。

    String getUsers="http://tg4a84.mail.163.com/jy3/address/addrprint.jsp?sid=前面获取的ID";

    请求后得到如下内容

    <div>
    <div>
    <table cellpadding="0" cellspacing="0" bgcolor="f0f9fc">
    <tr>
    <td><b>&nbsp;&nbsp;&nbsp;&nbsp;<span>选择打印的项目</span></b>&nbsp;<input type="checkbox" value="phone">电话/即时通讯ID<input type="checkbox" value="home">家庭资料<input type="checkbox" value="company">单位/公司<input type="checkbox" value="other">其他信息</span></td>
    <td><div><span><input type="button"  onMouseDown="this.className='Btn BtnHv BtnDw ImpBtn'" hidefocus="ture" value="打 印"/></span></div></td>
    </tr>
    </table>
    <div><hr/>
    </div><div><div><b>三少</b></div><div></div></div>
    <table><tr><th>邮件地址:</th><td>ij2ee@139.com</td></tr><tr><th>移动电话:</th><td></td></tr><tr><th>生日:</th><td></td></tr><tr><th>联系地址:</th><td>China 中国</td></tr><tr><th>公司地址:</th><td>;;;;;;CI</td></tr><tr><th>备注:</th><td>Java技术博客 </td></tr>
    </table>
    <div><hr /></div><div><div><span>网易公司版权所有</span></div></div>
    </div>
    </div>

    下面就剩下解析了。

    具体的看源代码。

    源码下载:#thief.rar 包含源码及jar包 下下来就可以跑,在test包里有测试用例

    本文来源:

    感谢 三少 的投稿

分享到:
  • 上一篇:网站更换服务器需注意的五步骤 下一篇:查询管理网站表单excel轻松实现
  • 相关 明星娱乐 资讯
    精彩图库
    • 爱美
    • 健康
    • 情感
    • 美体