php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
最近一直在忙,赶在这个假期结束的时候,发表一下此文,为了是让这些源码开源出来
当然这些方法可能不可取,但大致应该是这种方向了吧,由于目前做的一个UCHOME港台的站点
咱们策划说要改一下好友邀请里面的显示方式,开始我也没有在意,当时就说行!
到了弄这个的时候才发现,UCH里面的这个地方是用漫游型式做的,让人很是无解,啥都改不了!
唉,既然都答应了说可以,现在实际情况不行了,所以觉得不好意思,为了快速解决这问题,在GOOGLE,
百度上搜了个遍,结果又出忽意料,就一个126邮箱的开源例子,其它的都没有,有一牛哥留着QQ说要其它的源码,
可以加QQ买!不对此人评论了!俺花了点时间,整了整,结果就幸运的弄出来了几个,因为时间有限,目前手上的项目一直在弄,所以就没有管其它的,<FONT style="COLOR: #ff0000">现在给出 GMAIL,HOTMAIL(MSN),YAHOO的邮箱联系人的PHP源代码:
1.GMAIL
<div class="codetitle">
<a style="CURSOR: pointer" data="35531" class="copybut" id="copybut35531" onclick="doCopy('code35531')"> 代码如下: <div class="codebody" id="code35531">
<?
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"/sname="'.$v.'"/s
id="'.$v.'"/svalue="(.
?)"/s//>/i',$contents,$matches);
if(!empty($matches)) {
$$v = $matches[1];
$matches = array();
}
}
$server = 'mail';
preg_match('/<input/s
type="hidden"/sname="GALX"/s
value="(.?)"/s
//>/i',$matches);
if(!empty($matches)) {
$GALX = $matches[1];
$matches = array();
}
$timeStmp = time(); //第二步: 开始登录
$ch = curl_init();
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_TIMEOUT,TIMEOUT);
curl_setopt($ch,true);
$str = curl_exec($ch);
curl_close($ch); //第三步:check Cookies即也算是个引导页面
$ch = curl_init("https://www.google.com/accounts/CheckCookie?chtml=LoginDoneHtml"); curl_setopt($ch,true);
curl_setopt($ch,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,"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,COOKIEJAR);
/ 对于返回xml数据时需要此设置
curl_setopt($ch,CURLOPT
HTTPHEADER,array("Content-Type: application/xml"));
$str = "<?xml version=/"1.0/"?>@H301_81@<array name=/"items/">
<string name=/"func/">user:getSignatures<string name=/"func/">pab:getAllGroups";
curl_setopt($ch,$str);
/
curl_setopt($ch,1); curl_setopt($ch,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",$mails);
preg_match_all("/<string/s
name=/"FN/">(.)<//string>/Umsi",$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"></mce:script>
2.HOTMAIL(MSN)
<div class="codetitle">
<a style="CURSOR: pointer" data="27245" class="copybut" id="copybut27245" onclick="doCopy('code27245')"> 代码如下: <div class="codebody" id="code27245">
<?
PHPdefine( "COOKIEJAR",1000 ); //超时设定
class MSN
{
function getAddressList($username,并记下cookies
$cookies = array();
$ch = curl_init();
curl_setopt($ch,"
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,true);
$str = curl_exec($ch);
curl_close($ch);
//参数的分析
$matches = array();
preg_match('/<input/stype="hidden"/s
name="PPFT"/sid="(.
?)"/svalue="(.
?)"/s//>/i',$str,$matches);
$PPFT = $matches[2]; preg_match('/srf_sRBlob=/'(.
?)/';/i',$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,false);
curl_setopt($ch,'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,1);
curl_setopt($ch,$postfiles);
curl_setopt($ch,COOKIEJAR);
//curl_setopt($ch,CURLOPT_HEADER,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,$url_contiune_1);
curl_setopt($ch,1);
curl_setopt($ch,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,$url_contiune_2);
curl_setopt($ch,1000);
curl_setopt($ch,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,$url_4);
curl_setopt($ch,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"></mce:script>