zoukankan      html  css  js  c++  java
  • php curl 获取 邮箱通讯录 sns(hotmail)

    <?php
    
    define("COOKIEJAR", tempnam(ini_get("upload_tmp_dir"), "cookie"));   //定义COOKIES存放的路径,要有操作的权限
    define("TIMEOUT", 10000); //超时设定
    error_reporting(E_ALL);
    
    
    $msn = new mail_msn();
    $res = $msn->getAddressList('email@hotmail.com', 'password');
    
    $data = json_decode($res, true);
    unset($data['ic1']);        //自己的
    foreach ($data as $key => $val) {
        if (!strstr($key, 'Template')) {
            $list['username'] = $val['3'];
            $list['email'] = $val['6'];
            $lists[] = $list;
        }
    }
    
    var_dump($lists);
    
    class mail_msn {
    
        function getAddressList($username, $password) {
            //第一步:模拟抓取登入页面的数据,并记下cookies
            $cookies = array();
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_URL, "http://login.live.com/login.srf?wa=wsignin1.0&rpsnv=11&ct=" . time() . "&rver=6.1.6206.0&wp=MBI&wreply=http:%2F%2Fmail.live.com%2Fdefault.aspx&lc=2052&id=64855&mkt=zh-cn&cbcxt=mail&snsc=1");
            curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIEJAR);
            curl_setopt($ch, CURLOPT_TIMEOUT, TIMEOUT);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            $str = curl_exec($ch);
            curl_close($ch);
    
            //数据文件 模拟JS生成的cookie
            $CkTst = 'G' . time() * 1000;
            $wlidperf = "throughput=3&latency=948&FR=L&ST=" . (time() * 1000 + 1254);
            $fp = fopen(COOKIEJAR, "a+");
            $str_new = "login.live.com\tTRUE\t/\tFALSE\t0\tCkTst\t$CkTst\r\n";
            $str_new .= "login.live.com\tTRUE\t/\tFALSE\t0\twlidperf\t$wlidperf\r\n";
            fwrite($fp, $str_new);
            fclose($fp);
    
            //参数的分析
            $matches = array();
            preg_match('/<input\s*type="hidden"\s*name="PPFT"\s*id="(.*?)"\s*value="(.*?)"\s*\/>/i', $str, $matches);
            $PPFT = $matches[2];
    
            $type = 11;
    
            $LoginOptions = 3;
    
            $Newuser = 1;
    
            $idsbho = 1;
    
            $i2 = 1;
    
            $i12 = 1;
            $i3 = '562390';
            $i14 = '868';
            $i15 = '1338';
    
            $PPSX = 'Pa';
            //合并参数
            $postfiles = "login=" . $username . "&passwd=" . $password . "&type=" . $type . "&LoginOptions=" . $LoginOptions . "&Newuser=" . $Newuser . "&idsbho=" . $idsbho . "&i2=" . $i2 . "&i3=" . $i3 . "&PPFT=" . $PPFT . "&PPSX=" . $PPSX . "&i12=1&i14=$i14&i15=$i15";
    
            //第二步:开始登入
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIEJAR);
            curl_setopt($ch, CURLOPT_URL, 'https://login.live.com/ppsecure/post.srf?wa=wsignin1.0&rpsnv=11&ct=' . (time() + 5) . '&rver=6.1.6206.0&wp=MBI&wreply=http:%2F%2Fmail.live.com%2Fdefault.aspx&lc=2052&id=64855&mkt=zh-cn&cbcxt=mail&snsc=1&bk=' . (time() + 715)); //此处的两个time()是为了模拟随机的时间
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $postfiles);
            curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIEJAR);
            curl_setopt($ch, CURLOPT_HEADER, 1);
            curl_setopt($ch, CURLOPT_TIMEOUT, TIMEOUT);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
            $content = curl_exec($ch);
            curl_close($ch);
    
    
            if (stripos($content, 'WLWorkflow') !== FALSE) {     //WLWorkflow登入页面JS
                return false;      //登入失败
            }
            //获取location链接
            $matches = array();
            preg_match('/window.location.replace\(\"(.*?)\"\)/i', $content, $matches);
            $url_contiune_1 = $matches[1]; //接下来的链接
            if (!$url_contiune_1) {
                return false;
            }
    
            //除去多余的COOKIE
            $arr_new = file(COOKIEJAR);
            $str_new = '';
            $need_arr = array(0, 1, 2, 3, 7, 9, 13, 15, 16, 17, 18, 21, 22);
            foreach ($arr_new as $k => $v) {
                if (in_array($k, $need_arr))
                    $str_new .= "$v";
            }
            $fp = fopen(COOKIEJAR, "w+");
            fwrite($fp, $str_new);
            fclose($fp);
    
            //第三步: 进入引导页面
    
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIEJAR);
            curl_setopt($ch, CURLOPT_URL, $url_contiune_1);
            curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIEJAR);
            curl_setopt($ch, CURLOPT_HEADER, 1);
            curl_setopt($ch, CURLOPT_TIMEOUT, TIMEOUT);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            $content_2 = curl_exec($ch);
    
            //echo $postfiles;
            curl_close($ch);
    
            //获取redicturl链接
            $matches = array();
            preg_match('/<a\s*href=\"(.*?)\"\s*>/i', $content_2, $matches);
            $url_contiune_2 = $matches[1]; //接下来的链接
            if (!$url_contiune_2) {
                return false;
            }
    
            //获取邮箱请求基址 读取host
            $matches = array();
            preg_match('/(.*?)\/\/(.*?)\/(.*?)/i', $url_contiune_2, $matches);
            $url_contiune_3 = trim($matches[1]) . '//' . trim($matches[2]); //首页定义的站点基址
            $url_4 = $url_contiune_3 . '/mail/ContactMainLight.aspx?n=435707983'; //n后面的数字是随机数
            if (!$url_contiune_3) {
                return false;
            }
    
            //第四步: 开始获取邮箱联系人
            //base  $url_4
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIEJAR);
            curl_setopt($ch, CURLOPT_URL, $url_4);
            curl_setopt($ch, CURLOPT_TIMEOUT, TIMEOUT);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            $str = curl_exec($ch);
            curl_close($ch);
    
    
            //分析数据 (此处的数据因为hotmail的JS处理机制,所以在页面上看不出来,源码上可以看到数据)
            return $this->hanlde_date($str);
        }
    
        function hanlde_date($data) {
            $new_str = array();
            if (!empty($data)) {
                $ops_start = stripos($data, 'ic_control_data');
                $ops_end = stripos($data, ';', $ops_start);
                $new_str = substr($data, $ops_start + strlen('ic_control_data = '), $ops_end - $ops_start - strlen('ic_control_data = '));
                return $new_str; //返回JSON对象
            } else {
                return array();
            }
        }
    
    }
    
    ?>
    

     2012年3月24 经测试可使用

  • 相关阅读:
    编程题目----约德尔测试
    编程题目----路灯
    java----java垃圾回收算法
    JAVA多线程和并发基础面试问答(转载)
    科学史上非常伟大的十位单身科学家
    MySQL----mysql57服务突然不见了的,解决方法
    linux:644、755、777权限详解
    Java 关键字 速查表
    java----鲁棒性
    习题----第六章 图(转)
  • 原文地址:https://www.cnblogs.com/ybbqg/p/2415708.html
Copyright © 2011-2022 走看看