php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍

前端技术 2023/09/04 PHP
最近一直在忙,赶在这个假期结束的时候,发表一下此文,为了是让这些源码开源出来
当然这些方法可能不可取,但大致应该是这种方向了吧,由于目前做的一个UCHOME港台的站点
咱们策划说要改一下好友邀请里面的显示方式,开始我也没有在意,当时就说行!
到了弄这个的时候才发现,UCH里面的这个地方是用漫游型式做的,让人很是无解,啥都改不了!
唉,既然都答应了说可以,现在实际情况不行了,所以觉得不好意思,为了快速解决这问题,在GOOGLE,
百度上搜了个遍,结果又出忽意料,就一个126邮箱的开源例子,其它的都没有,有一牛哥留着QQ说要其它的源码,
可以加QQ买!不对此人评论了!俺花了点时间,整了整,结果就幸运的弄出来了几个,因为时间有限,目前手上的项目一直在弄,所以就没有管其它的,现在给出 GMAIL,HOTMAIL(MSN),YAHOO的邮箱联系人的PHP源代码:
 
1.GMAIL
复制代码 代码如下:

<?php
define( \"COOKIEJAR\", tempnam( ini_get( \"upload_tmp_dir\" ), \"cookie\" ) );   //定义COOKIES存放的路径,要有操作的权限
define( \"TIMEOUT\", 1000 ); //超时设定
class GMAIL
{
        private function login($username, $password)
        {              
                //第一步:模拟抓取登录页面的数据,并记下cookies
                $cookies = array();
                $matches = array();
                //获取表单
                $login_url = \"https://www.google.com/accounts/ServiceLoginAuth\";
                $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(\'dsh\',\'timeStmp\',\'secTok\');
                foreach($name as $v) {
                     preg_match(\'/<input/s*type=\"hidden\"/s*name=\"\'.$v.\'\"/s*id=\"\'.$v.\'\"/s*value=\"(.*?)\"/s*//>/i\', $contents, $matches);
                    if(!empty($matches)) {
                        $$v = $matches[1];
                        $matches = array();
                    }       
                }
                $server = \'mail\';
                preg_match(\'/<input/s*type=\"hidden\"/s*name=\"GALX\"/s*value=\"(.*?)\"/s*//>/i\', $contents, $matches);
                if(!empty($matches)) {
                    $GALX = $matches[1];
                    $matches = array();
                }
                $timeStmp = time();

                //第二步: 开始登录
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                curl_setopt($ch, CURLOPT_URL, \"https://www.google.com/accounts/ServiceLoginAuth\");
                curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIEJAR);
                curl_setopt($ch, CURLOPT_POST, 1);
                $fileds = \"dsh=$dsh&Email=\".$username.\"&Passwd={$password}&GALX=$GALX&timeStmp=$timeStmp&secTok=$secTok&signIn=Sign in&rmShown=1&asts=&PersistentCookie=yes\";
                curl_setopt($ch, CURLOPT_POSTFIELDS, $fileds);
                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);

                //第三步:check Cookies即也算是个引导页面
                $ch = curl_init(\"https://www.google.com/accounts/CheckCookie?chtml=LoginDoneHtml\");

                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch,CURLOPT_COOKIEFILE,COOKIEJAR);
                curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIEJAR);                
                curl_setopt($ch, CURLOPT_TIMEOUT, TIMEOUT);    
                $str2 = curl_exec($ch);

                curl_close($ch);

                if (strpos($contents, \"安全退出\") !== false)
                {                       
                        return FALSE;
                }              
                return TURE;
        }

        //获取邮箱通讯录-地址
        public function getAddressList($username, $password)
        {              
                if (!$this->login($username, $password))
                {
                        return FALSE;
                }
                //开始进入模拟抓取
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, \"http://mail.google.com/mail/contacts/data/contacts?thumb=true&groups=true&show=ALL&enums=true&psort=Name&max=300&out=js&rf=&jsx=true\");  //out=js返回json数据,不设置返回为xml数据  
                curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIEJAR);
                /*  对于返回xml数据时需要此设置
                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_POSTFIELDS, $str);

                */
                curl_setopt($ch, CURLOPT_POST, 1);

                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_TIMEOUT, TIMEOUT);
                $contents = curl_exec($ch);
                curl_close($ch);
                //die($contents);
                //get mail list from the page information username && emailaddress
                /* 对于返回xml数据时的处理
                preg_match_all(\"/<string/s*name=/\"EMAILREF/\">(.*)<//string>/Umsi\",$contents,$mails);
                preg_match_all(\"/<string/s*name=/\"FN/\">(.*)<//string>/Umsi\",$contents,$names);
                $users = array();
                foreach($names[1] as $k=>$user)
                {
                    //$user = iconv($user,\'utf-8\',\'gb2312\');
                    $users[$mails[1][$k]] = $user;
                }
                if (!$users)
                {
                    return \'您的邮箱中尚未有联系人\';
                } 
                */
                $contents = substr($contents, strlen(\'while (true); &&&START&&&\'),  -strlen(\'&&&END&&& \'));
                return $contents;
        }
}
$gamil = new GMAIL;
$res = $gamil->getAddressList(\'username@163.com\',\'123456\');
echo $res;
?>
<mce:script type=\"text/javascript\"><!--
var data = <?php echo $res; ?>
alert(data[\'Body\']); //json数据
// --></mce:script>

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(\'username@111.com\',\'123456\');
echo $res;
?>
<mce:script type=\"text/javascript\"><!--
var data = <?php echo $res; ?>
alert(data[\'ic1\'][6]);
alert(data[\'ic1\'][3]);
// --></mce:script>

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(\'username@yahoo.com.cn\',\'123456\');
?>
<mce:script type=\"text/javascript\"><!--
var data = <?php echo $res; ?>
var obj1 = data[0];
alert(data[0][\'contactName\']);
// --></mce:script>

注:
163,126在网上的源码都有,在此就不一一的列出来了哦
当然此代码是自己个人的拙作,只是为了给大家此类问题做一个指引

本文地址:https://www.stayed.cn/item/9071

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。