Maison >développement back-end >tutoriel php >php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录(原创)
最近一直在忙,赶在这个十一假期结束的时候,发表一下此文,为了是让这些源码开源出来
当然这些方法可能不可取,但大致应该是这种方向了吧,由于目前做的一个UCHOME港台的站点
咱们策划说要改一下好友邀请里面的显示方式,开始我也没有在意,当时就说行!
到了弄这个的时候才发现,UCH里面的这个地方是用漫游型式做的,让人很是无解,啥都改不了!
唉,既然都答应了说可以,现在实际情况不行了,所以觉得不好意思,为了快速解决这问题,在GOOGLE,
百度上搜了个遍,结果又出忽意料,就一个126邮箱的开源例子,其它的都没有,有一牛哥留着QQ说要其它的源码,
可以加QQ买!不对此人评论了!俺花了点时间,整了整,结果就幸运的弄出来了几个,因为时间有限,目前手上的项目一直在弄,所以就没有管其它的,现在给出 GMAIL,HOTMAIL(MSN),YAHOO的邮箱联系人的PHP源代码:
1.GMAIL
<?phpdefine( "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;?><script type="text/javascript">var data = <?php echo $res; ?>alert(data['Body']); //json数据</script>
2.HOTMAIL(MSN)
<?phpdefine( "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;?><script type="text/javascript">var data = <?php echo $res; ?>alert(data['ic1'][6]);alert(data['ic1'][3]);</script>
3.YAHOO
<?phpdefine( "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 class="brush:php;toolbar:false">'; 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');?><script type="text/javascript">var data = <?php echo $res; ?>var obj1 = data[0];alert(data[0]['contactName']);</script>
没有对这个感兴趣的
学习了,收藏了。感谢楼主分享
楼主对模拟登录听熟悉啊
有用,
收藏
有用··收藏 多谢
msn的获取结果再处理一下就好了,结果比较凌乱
收藏了,蟹蟹
主要是 Curl 和 正则。
不错。
楼主还在不在?我正想要这些,测试了一晚,gmail和msn都可以,就是yahoo返回的数据不知道怎么处理,
yahoo返回的格式是这样的[{"guid":"","contactId":"1",...}{...}{...}]
我要转成php数组,但当成json数据转数组也不行,请问怎么处理yahoo这个数据?谁知道?
楼主还在不在?我正想要这些,测试了一晚,gmail和msn都可以,就是yahoo返回的数据不知道怎么处理,
yahoo返回的格式是这样的[{"guid":"","contactId":"1",...}{...}{...}]
我要转成php数组,但当成json数据转数组也不行,请问怎么处理yahoo这个数据?谁知道?
这三个返回来的都是json数据,也是比较好处理的啊,它就是一个json数组用数组的形式访问就行了
还以为对大家没有啥用,过两天把JSON结果处理一下,在贴上来
没有对这个感兴趣的
当然
有!
感谢LZ分享
收藏。谢谢楼主。
引用 11 楼 billssjone 的回复:
楼主还在不在?我正想要这些,测试了一晚,gmail和msn都可以,就是yahoo返回的数据不知道怎么处理,
yahoo返回的格式是这样的[{"guid":"","contactId":"1",...}{...}{...}]
我要转成php数组,但当成json数据转数组也不行,请问怎么处理yahoo这个数据?谁知道?
这三个返回来的都是js……
?什?我用 php的foreach取???出??有[]??好象不能用json?理,php怎??理?
dingdingdingdingdingdingding
啊速度撒的撒旦爱的爱上爱上
按时大速度撒的撒的撒的撒的撒旦
谢谢 高手!
学到了
学习了,谢谢~~~
楼主真是有心人,谢谢分享!
有用,
收藏
楼主真是有心人,谢谢分享!
楼主帮我看看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读也是出同样的错,请问我到底怎么处理返回的数据?试了一晚都没解决。
好东西啊
不错,收藏。
我改用js来读取yahoo的返回数据了,
请问楼主有QQ找好友的吗?我想再要一个QQ的
好东西 收藏了 感谢分享
msn的获取结果再处理一下就好了,结果比较凌乱
我分享一下我处理获取结果的代码:
$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 "
名字:".$value[3]."/邮箱:".$value[6]."
";名字:".$value['DisplayName']."/邮箱:".$value['Emails'][0]['Address']."
";thanks
so good
hen qiang大
感谢楼主分享!先试用一下!
感谢楼主分享!先试用一下!
感谢楼主分享!先试用一下!
收藏一下,以后应该是有用,感谢楼主分享
感谢分享···
不错不错
163之类的邮箱有源码吗?谁给贴出来
感谢分享
牛人,就是牛人啊