本帖最后由 hudie631489527 于 2010-10-07 23:18:31 编辑

解决方案 »

  1.   

    2.HOTMAIL(MSN)<?php
    define( "COOKIEJAR", tempnam( ini_get( "upload_tmp_dir" ), "cookie" ) );   //定义COOKIES存放的路径,要有操作的权限
    define( "TIMEOUT", 1000 ); //超时设定
    class 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.0.5285.0&wp=MBI&wreply=http:%2F%2Fmail.live.com%2Fdefault.aspx&lc=2052&id=64855&mkt=en");
                    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);                //参数的分析
                    $matches = array();       
                    preg_match('/<input\s*type="hidden"\s*name="PPFT"\s*id="(.*?)"\s*value="(.*?)"\s*\/>/i', $str, $matches); 
                    $PPFT = $matches[2];
                    
                    preg_match('/srf_sRBlob=\'(.*?)\';/i', $str, $matches); 
                    $PPSX = $matches[1];
                    
                    $type = 11;
                    
                    $LoginOptions = 3;
                    
                    $Newuser = 1;
                    
                    $idsbho = 1;
                    
                    $i2 = 1;
                    
                    $i12 = 1;
                    
                    $i3 = '562390';
                    
                    $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";
          
                    //第二步:开始登录
                    $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.0.5285.0&wp=MBI&wreply=http:%2F%2Fmail.live.com%2Fdefault.aspx&lc=2052&id=64855&mkt=en&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;
                    }
                    //第三步: 进入引导页面
                    
                    $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;
                    }
                    
                    //跳过进入首页
                    /*
                    $ch = curl_init();
                    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                    curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIEJAR);
                    curl_setopt($ch, CURLOPT_URL, $url_contiune_2);
                    curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIEJAR);
                    curl_setopt($ch, CURLOPT_HEADER, 1); 
                    curl_setopt($ch, CURLOPT_TIMEOUT, 1000);
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                    $content_3 = curl_exec($ch);
                     
                    curl_close($ch);
                    */
                    //获取邮箱请求基址 读取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);
                    //分析数据 (此处的数据因为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();
                    }
                    
                                        
            }
    }$msn = new MSN;$res = $msn->getAddressList('[email protected]','123456');echo $res;
    ?><script type="text/javascript">
    var data = <?php echo $res; ?>alert(data['ic1'][6]);
    alert(data['ic1'][3]);
    </script> 
      

  2.   

    3.YAHOO<?php
    define( "COOKIEJAR", tempnam( ini_get( "upload_tmp_dir" ), "cookie" ) );   //定义COOKIES存放的路径,要有操作的权限
    define( "TIMEOUT", 1000 ); //超时设定
    class YAHOO
    {        private function login($username, $password)
            {               
                    //第一步:模拟抓取登录页面的数据,并记下cookies
                    $cookies = array();
                    $matches = array();
                    
                    //获取表单
                    $login_url = "https://login.yahoo.com/config/login?.src=fpctx&.intl=us&.done=http%3A%2F%2Fwww.yahoo.com%2F";
                    $ch = curl_init($login_url);
                    
                    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                    curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIEJAR);
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                    $contents = curl_exec($ch);
                    curl_close($ch);
                    
                    //构造参数
                    $name = array('tries','src','md5','hash','js','last','promo','intl','bypass','partner','u','v','challenge','yplus','emailCode','pkg','stepid','ev','hasMsgr','chkP','done','pd','pad','aad'); 
                    $postfiles = array();
                    $matches = array();
                    foreach($name as $v) {
                         preg_match('/<input\s*type="hidden"\s*name=".'.$v.'"\s*value="(.*?)"\s*>/i', $contents, $matches);
                        if(!empty($matches)) {
                            $postfiles['.'.$v] = $matches[1];
                            $matches = array(); 
                        } 
                        if($v == 'pd') {
                            $postfiles['.'.$v] = urlencode($postfiles['.'.$v]);
                        }       
                    }                $postfiles['pad'] = 5; 
                    $postfiles['aad'] = 6;
                    $postfiles['login'] = urlencode($username);
                    $postfiles['passwd'] = $password;
                    $postfiles['.persistent'] = 'y'; 
                    $postfiles['save'] = ''; 
                    $postfiles['.done'] = urlencode($postfiles['.done']);
                    //$postfiles['.pd'] = urlencode($postfiles['.pd']); 
                    $postargs = '';
                    
                    foreach($postfiles as $k => $v){
                        $postargs .= $k.'='.$v.'&';        
                    }
                    $postargs = substr($postargs,0,-1);
                    $request = "https://login.yahoo.com/config/login?";
                    
                    //开始登录
                    $ch = curl_init();
                    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                    curl_setopt($ch, CURLOPT_URL, $request);
                      
                    curl_setopt($ch, CURLOPT_POST, 1);
                    curl_setopt($ch, CURLOPT_POSTFIELDS, $postargs);
                    curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIEJAR);
                    curl_setopt($ch, CURLOPT_TIMEOUT, TIMEOUT);
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                    $contents = curl_exec($ch);
                    curl_close($ch);                 if (stripos($contents,'submit') != FALSE)
                    {                        
                            return 0;
                    }        
                    return 1;
            }
            
            //获取邮箱通讯录-地址
            public function getAddressList($username, $password)
            {               
                    if (!$this->login($username, $password))
                    {
                            return 0;
                    }
                
                //开始进入模拟抓取
                //get mail list from the page information username && emailaddress
                $url = "http://address.mail.yahoo.com/";
                $data = array( );
                if ( !$data = $this->hanlde_date( $url, $names, $emails) )
                {
                    return FALSE;
                }
                echo '<pre>';
                print_r($data);
                return $data;
            }
            function hanlde_date( $url, &$names, &$emails)
            {
                $ch = curl_init( );
                curl_setopt( $ch, CURLOPT_COOKIEFILE, COOKIEJAR );
                curl_setopt( $ch, CURLOPT_URL, $url );
                curl_setopt( $ch, CURLOPT_TIMEOUT, TIMEOUT );
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                $contents = curl_exec($ch);
                curl_close($ch); 
                $temparr = array();
                preg_match_all('/InitialContacts\s*=\s*(.*?);/i',$contents,$temparr);
                return $temparr[1][0].';';       //匹配出JSON对象数组
            }
    }
    $yahoo = new YAHOO;$res = $yahoo->getAddressList('[email protected]','123456');
    ?>
    <script type="text/javascript">
    var data = <?php echo $res; ?>
    var obj1 = data[0];
    alert(data[0]['contactName']);
    </script>  注:163,126在网上的源码都有,在此就不一一的列出来了哦当然此代码是自己个人的拙作,只是为了给大家此类问题做一个指引
      

  3.   

    msn的获取结果再处理一下就好了,结果比较凌乱
      

  4.   

    主要是 Curl 和 正则。不错。
      

  5.   

    楼主还在不在?我正想要这些,测试了一晚,gmail和msn都可以,就是yahoo返回的数据不知道怎么处理,
    yahoo返回的格式是这样的[{"guid":"","contactId":"1",...}{...}{...}]
    我要转成php数组,但当成json数据转数组也不行,请问怎么处理yahoo这个数据?谁知道?
      

  6.   

    这三个返回来的都是json数据,也是比较好处理的啊,它就是一个json数组用数组的形式访问就行了
      

  7.   

    还以为对大家没有啥用,过两天把JSON结果处理一下,在贴上来
      

  8.   

    為什麼我用 php的foreach取數組會出錯?有[]個號好象不能用json處理,php怎麼處理?
      

  9.   

    楼主帮我看看php怎么处理yahoo返回的数据,
    ===============
    $yahoo = new YAHOO;
    $email_json = $yahoo->getAddressList($email, $password);
    foreach($email_json as $key => $value){}
    ===============
    $email_json正常返回两个我的yahoo好友,格式为[{"guid":"","contactId":"1",...},{...}]
    但是我在用foreach读取时出错:Warning: Invalid argument supplied for foreach() in 
    我用json_decode($email_json, true)转数组再用foreach读也是出同样的错,请问我到底怎么处理返回的数据?试了一晚都没解决。
      

  10.   

    我改用js来读取yahoo的返回数据了,
    请问楼主有QQ找好友的吗?我想再要一个QQ的
      

  11.   


    我分享一下我处理获取结果的代码:
    $msn = new MSN;
    $email_json = $msn->getAddressList($email, $password);
    $email_arr = json_decode($email_json, true);
    foreach($email_arr as $key => $value){
      if(count($value)==19){
        echo "<p style='margin:10px;'>名字:".$value[3]."/邮箱:".$value[6]."</p>";
      }
    }
    ==========================
    $gamil = new GMAIL;
    $email_json = $gamil->getAddressList($email, $password);
    $email_arr = json_decode($email_json, true);
    $email2_arr=$email_arr['Body'];
    foreach($email2_arr['Contacts'] as $key => $value){
      echo "<p style='margin:10px;'>名字:".$value['DisplayName']."/邮箱:".$value['Emails'][0]['Address']."</p>";
    }
    =================
    yahoo的:
    <?php
    $yahoo = new YAHOO;
    $email_json = $yahoo->getAddressList($email, $password);
    ?>
    <script type="text/javascript">
    var data = <?php echo $email_json; ?>
    for(var i=0;i<data.length;i++){
      alert("名字:"+data[i]['contactName']+"/邮箱:"+data[i]['email']);
    }
    </script>
      

  12.   

    hao  hao  hao a 
      

  13.   

    刚开始学PHP的飘过,希望以后会有帮助,先留位标记一下先
      

  14.   

    看到有朋友说163.com的登录方式,这个好像网上有,不过比较难找,还有结果的处理方式,由于今天QQ邮箱有些问题,我的JS文件拿不下来,所以明天晚上在给大家
      

  15.   

    操作GAMIL,HOTMAIL,YAHOO邮箱返回的JOSN的JS(在下JS不熟悉,通常用JQUERY)
    <html>
    <head>
    <script language="javascript" type="text/javascript" src="script_mail.js"></script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script></head>
    <body>
    <div id="showData"></div>
    </body>
    </html>
    <script type="text/javascript">
    var data = [code=PHP]<?php echo $res; ?>;
    handleDate(data, 'showData' , 'yahoo');</script>[/code]
    $res是上面PHP获取的JSON数据
    script_mail.js文件内容
    //操作
    function handleDate(data, id, t) {
        var topObj = $("#"+id);
        //form
        var formObj = $("<form>");
        //ul
        var ulObj = $("<ul>");
        ulObj.attr('id', 'email_ul');
        switch(t) {
            case 'msn' :
                for( i in data) {
                    //尋找ic(1~f)之間的資料
                    if(i.indexOf('icTm') == -1) {
                        //用戶名
                        //alert(data[i][3]);    
                        //郵箱
                        //alert(data[i][6]);
                        //按用戶名和用戶郵箱創建li, 返回LI對象
                        var LiInput = createLiInput(data[i][3], data[i][6], i);
                        LiInput.appendTo(ulObj);
                    }
                }    
                break;
            case 'gmail':
                for( i in data.Body.Contacts) {
                    var LiInput = createLiInput(data.Body.Contacts[i]['DisplayName'], data.Body.Contacts[i]['Emails'][0]['Address'], i);
                    LiInput.appendTo(ulObj);
                }
                break;
            case 'yahoo':
                for( i in data) {
                    var LiInput = createLiInput(data[i]['contactName'], data[i]['email'], i);
                    LiInput.appendTo(ulObj);
                }
                break;
            default:
                break;
        }    
        ulObj.appendTo(formObj);
        var str = '<b>全選</b><input type="checkbox" name="chkall" id="chkall" onclick="checkAll(this.form, \'email\')" /><input type="button" value="確認" onclick="submitCheck_hd()" />';
        formObj.append(str);
        formObj.appendTo(topObj);
    }
    function createLiInput(username, email , i) {
        var objLi = $("<li>");
        objLi.attr('name', i+'_li');//name
        objLi.attr('id', i+'_li');//ID
        
        var ie = !-[1,];  //IE的判定
        
        if(ie) {
            var objInput = $("<input name='email[]' type='checkbox' />");
        }else {
            var objInput = $("<input />");
            objInput.attr('name', 'email[]');
            objInput.attr('type', 'checkbox');//type
        }
        
        
        objInput.attr('id', i);//ID
        objInput.attr('value', email);
        var objText = $('<b>'+username+'</b>');
        
        //objLi.appendChild(objInput);
        objInput.appendTo(objLi);
        objText.appendTo(objLi);
        return objLi;
    }
      

  16.   

    163邮箱的获取源码,由于没有用到,在此也就没有细化,返回的数据非JSON
    此文件在GBK编码下可用,因为对于登录的判断有一个转码过程,大家也可以修改
    163源码
    <?php
    define( "COOKIEJAR", tempnam( ini_get( "upload_tmp_dir" ), "cookie" ) );   //定义COOKIES存放的路径,要有操作的权限
    define( "TIMEOUT", 1000 ); //超时设定class contacts163
    {    function checklogin( $user, $password )
        {
            $ch = curl_init( );
            curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
            curl_setopt( $ch, CURLOPT_URL, "http://reg.163.com/logins.jsp?type=1&product=mail163&url=http://entry.mail.163.com/coremail/fcg/ntesdoor2?lightweight%3D1%26verifycookie%3D1%26language%3D-1%26style%3D1" );
            curl_setopt( $ch, CURLOPT_POST, 1 );
            curl_setopt( $ch, CURLOPT_POSTFIELDS, "username=".$user."&password=".$password."&type=1" );
            curl_setopt( $ch, CURLOPT_COOKIEJAR, COOKIEJAR );
            curl_setopt( $ch, CURLOPT_TIMEOUT, TIMEOUT );
            ob_start( );
            curl_exec( $ch );
            $contents = ob_get_contents( );
            ob_end_clean( );
            curl_close( $ch );
            $contents = iconv("UTF-8","GBK",$contents);
            //die($contents);
            //echo "<textarea>".iconv("UTF-8","GBK",$contents)."</textarea>";
            //echo strip_tags($contents);        if ( strpos( $contents, "登录成功" ) !== false )
            {
                return 1;
            }
            return 0;
        }    function getcontacts( $user, $password, &$result )
        {
            if ( !$this->checklogin( $user, $password ) )
            {
                
                return 0;
            }
            $bRet = $this->_getcookie( $user );
            $bRet = $this->readcookies( COOKIEJAR, $cookies );
            $cookieid = substr( trim( $cookies['Coremail'] ), -32 );        if ( !$cookieid )
            {
                return 0;
            }
            
            $ch = curl_init( );
            curl_setopt( $ch, CURLOPT_URL, "http://g1a126.mail.163.com/a/s?sid=".$cookieid."&func=global:sequential" );
            curl_setopt( $ch, CURLOPT_COOKIEFILE, COOKIEJAR );
            curl_setopt( $ch, CURLOPT_HTTPHEADER, array( "Content-Type: application/xml" ) );
            $str = "<?xml version=\"1.0\"?><object><array name=\"items\"><object><string name=\"func\">pab:searchContacts</string><object name=\"var\"><array name=\"order\"><object><string name=\"field\">FN</string><boolean name=\"ignoreCase\">true</boolean></object></array></object></object><object><string name=\"func\">user:getSignatures</string></object><object><string name=\"func\">pab:getAllGroups</string></object></array></object>";
            curl_setopt( $ch, CURLOPT_POST, 1 );
            curl_setopt( $ch, CURLOPT_POSTFIELDS, $str );
            curl_setopt( $ch, CURLOPT_TIMEOUT, TIMEOUT );
            ob_start( );
            curl_exec( $ch );
            $contents = ob_get_contents( );
            ob_end_clean( );
            curl_close( $ch );
            $pattern = "/([\\w_-])+@([\\w])+([\\w.]+)/";
            if ( preg_match_all( $pattern, $contents, $tmpres, PREG_PATTERN_ORDER ) )
            {
                $result = array_unique( $tmpres[0] );
            }
            return 1;
        }    function _getcookie( $user )
        {
            $ch = curl_init( );
            curl_setopt( $ch, CURLOPT_URL, "http://entry.mail.163.com/coremail/fcg/ntesdoor2?lightweight=1&verifycookie=1&language=-1&style=1&username=$user" );
            curl_setopt( $ch, CURLOPT_COOKIEFILE, COOKIEJAR );
            curl_setopt( $ch, CURLOPT_COOKIEJAR, COOKIEJAR );
            ob_start( );
            curl_exec( $ch );
            $contents = ob_get_contents( );
            ob_end_clean( );
            curl_close( $ch );
        }
        function readcookies( $file, &$result )
        {
            $fp = fopen( $file, "r" );
            while ( !feof( $fp ) )
            {
                $buffer = fgets( $fp, 4096 );
                $tmp = split( "\t", $buffer );
                $result[trim( $tmp[5] )] = trim( $tmp[6] );
            }
            return 1;
        }}
    $res = array();$mail163 = new contacts163;$mail163->getcontacts('[email protected]',123456, &$res);print_R($res);?>
      

  17.   

    到了弄这个的时候才发现,UCH里面的这个地方是用漫游型式做的,让人很是无解,啥都改不了!唉,既然都答应了说可以,现在实际情况不行了,所以觉得不好意思,为了快速解决这问题,在GOOGLE,百度上搜了个遍,结果又出忽意料,就一个126邮箱的开源例子,其它的都没有,有一牛哥留着QQ说要其它的源码,可以加QQ买!不对此人评论了!俺花了点时间,整了整,结果就幸运的弄出来了几个,因为时间有限,目前手上的项目一直在弄,所以就没有管其它的,现在给出 GMAIL,HOTMAIL(MSN),YAHOO的邮箱联系人的PHP源代码