通过HTTP抓取QQ好友过程

来源:互联网 发布:淘宝定制的可以退货吗 编辑:程序博客网 时间:2024/05/22 14:16

/**
  * QQ邮箱登录流程(注意:要在一个HttpClient中完成,因为会保存cookie;否则必须传递cookie)
  *
  * 1. 取登录页
  *    http://mail.qq.com/cgi-bin/loginpage
  *   
  * 2. 取验证码页(注意:取验证码时,服务器发送回一个名verifysession的cookie,这个在请求登录时还要用到)
  *    http://ptlogin2.qq.com/getimage?aid=23000101&Math.random()
  *    (aid可能是腾讯应用的id)
  *   
  * 3.将以上取得的信息组成一个login页面,如下:
  *   1)需要下载tencent的js文件
  *     http://rescdn.qqmail.com/zh_CN/htmledition20091109/js/safeauth.js
  *     这个用于js中hex2b64()方法的实现
  *   2)得到post action地址(域每次会变,因此要保留域的值,如:m123.mail.qq.com)
  *     http://m123.mail.qq.com/cgi-bin/login?sid=0,2,zh_CN
  *   3)得到RSA相关Key(以下是qq web login页相关的代码)
  *     PublicKey,PublicTs  可以从http://mail.qq.com/cgi-bin/loginpage的结果中得到
  *     此代码用来给pp(页面上用于填充密码,在提交时用于密码的掩码)填充值,并生成加密的密码(p域)
  *     <pre>
  *      var PublicKey = "CF87D7B4C864F4842F1D337491A48FFF54B73A17300E8E42FA365420393AC0346AE55D8AFAD975DFA175FAF0106CBA81AF1DDE4ACEC284DAC6ED9A0D8FEB1CC070733C58213EFFED46529C54CEA06D774E3CC7E073346AEBD6C66FC973F299EB74738E400B22B1E7CDC54E71AED059D228DFEB5B29C530FF341502AE56DDCFE9";
   var RSA = new RSAKey();
   RSA.setPublic(PublicKey, "10001");
   var PublicTs="1257819936";
   
   var Res = RSA.encrypt(document.form1.pp.value + '/n' + document.form1.ts.value + '/n');
   if (Res)
   {
    document.form1.p.value = hex2b64(Res);
   }
   var MaskValue = "";
   for (var Loop = 0; Loop < document.form1.pp.value.length; Loop++, MaskValue += "0");
   document.form1.pp.value = MaskValue;
  *    </pre>
  *    4)表单域
  *    sid=0,2,zh_CN  [常量]
  *    firstlogin=false  [一般为false,是否第一次登录]
  *    starttime   [开始时间, tencent js中document.form1.starttime.value = (new Date()).valueOf();]
  *    redirecturl  [可以为空]
  *    f=html   [常量]
  *    p  [真实的密码域(js得到),计算见js]
  *    delegate_url   [可以为空]
  *    s   [可以为空]
  *    ts  [时间戳,和js中PublicTs是同一个值]
  *    from   [可以为空]
  *    uin  [QQ号]
  *    pp   [页面中的密码域,在提交时由js变成为掩码,全为0,计算见js,掩码位数同密码的位数]
  *    verifycode   [所填入的验证码]
  *    aliastype   [邮箱域,常量?  @qq.com]
  *   
  * 4. 真正的登录验证
  *    http://m151.mail.qq.com/cgi-bin/login?sid=0,2,zh_CN
  *    在登录成功后,会有一个页面(这是个跳转页面),要取出sid,后面每个链接都要sid
  *    <pre>
  *      <html>
    <title>QQ邮箱</title>
    <script>
    var urlHead="http://m135.mail.qq.com/cgi-bin/";
    var targetUrl="";
    var mailto="";
     targetUrl = urlHead + "frame_html?sid=QZwGDj90yKVccHow";
     if (targetUrl == "")
     {
      targetUrl = "" != "" ? "" : "/cgi-bin/loginpage";
     }
     if (targetUrl.indexOf("?") != -1)
     {
      targetUrl+="&r=f8bdd91785667fd0f67f992a08aac239";
     }
    document.write("<META http-equiv=Refresh content=/'0; url=/"" + targetUrl + "/"/'/>");
    </script>
    <script type="text/javascript">
     location.replace( targetUrl );
    </script>
   </html>
  *    </pre>
  * 5. 取好友
  *    利用上面的sid
  *    取QQ+邮箱好友
  *    http://m151.mail.qq.com/cgi-bin/addr_listall?sid=Y74I8cCPs94nFB5U&category=all
  *    取QQ好友
  *    http://m151.mail.qq.com/cgi-bin/addr_listall?sid=Y74I8cCPs94nFB5U&category=qq
  *    取邮箱好友?
  *   
  *    取常用联系人/不常用(common/uncommon)
  *    http://m151.mail.qq.com/cgi-bin/addr_listall?sid=Y74I8cCPs94nFB5U&category=common
  *   
  *  6.变化
  *  1)换了新的验证码链接,是把验证码分布多台机器,某台机器只能验证这台机器的验证码
  *  因此,
  *  http://mail.qq.com/cgi-bin/getverifyimage?aid=23000101&0.38779593481782704  这样的链接得到的验证码是不对的
  *  应该先得到相应的domain(如:m158.mail.qq.com),再组成验证码链接
  *  形如:http://m158.mail.qq.com/cgi-bin/getverifyimage?aid=23000101&0.38779593481782704
  * 
  */

 

 /**
     * QQ错误代码
     * 在页面中以 errtype=1 形式出现,同时在页面中找不到sid
     * 1 -- 密码错误
     * 2 -- 验证码错误
     * 17 -- 登录太多次
     */

原创粉丝点击