Discuz教程网

php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录(转载) .

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

1.GMAIL
  1. <?php
  2. define( "COOKIEJAR", tempnam( ini_get( "upload_tmp_dir" ), "cookie" ) ); //定义COOKIES存放的路径,要有操作的权限
  3. define( "TIMEOUT", 1000 ); //超时设定
  4. class GMAIL
  5. {

  6. private function login($username, $password)
  7. {
  8. //第一步:模拟抓取登录页面的数据,并记下cookies
  9. $cookies = array();
  10. $matches = array();
  11. //获取表单
  12. $login_url = "https://www.google.com/accounts/ServiceLoginAuth";
  13. $ch = curl_init($login_url);

  14. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  15. curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIEJAR);
  16. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  17. $contents = curl_exec($ch);
  18. curl_close($ch);

  19. //模拟参数
  20. $name = array('dsh','timeStmp','secTok');
  21. foreach($name as $v) {
  22. preg_match('/<input/s*type="hidden"/s*name="'.$v.'"/s*id="'.$v.'"/s*value="(.*?)"/s*//>/i', $contents, $matches);
  23. if(!empty($matches)) {
  24. $$v = $matches[1];
  25. $matches = array();
  26. }
  27. }
  28. $server = 'mail';
  29. preg_match('/<input/s*type="hidden"/s*name="GALX"/s*value="(.*?)"/s*//>/i', $contents, $matches);
  30. if(!empty($matches)) {
  31. $GALX = $matches[1];
  32. $matches = array();
  33. }
  34. $timeStmp = time();

  35. //第二步: 开始登录
  36. $ch = curl_init();
  37. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  38. curl_setopt($ch, CURLOPT_URL, "https://www.google.com/accounts/ServiceLoginAuth");
  39. curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIEJAR);
  40. curl_setopt($ch, CURLOPT_POST, 1);
  41. $fileds = "dsh=$dsh&Email=".$username."&Passwd={$password}&GALX=$GALX&timeStmp=$timeStmp&secTok=$secTok&signIn=Sign in&rmShown=1&asts=&PersistentCookie=yes";
  42. curl_setopt($ch, CURLOPT_POSTFIELDS, $fileds);
  43. curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIEJAR);
  44. curl_setopt($ch, CURLOPT_TIMEOUT, TIMEOUT);
  45. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  46. $str = curl_exec($ch);
  47. curl_close($ch);

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

  50. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  51. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  52. curl_setopt($ch,CURLOPT_COOKIEFILE,COOKIEJAR);
  53. curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIEJAR);
  54. curl_setopt($ch, CURLOPT_TIMEOUT, TIMEOUT);
  55. $str2 = curl_exec($ch);

  56. curl_close($ch);

  57. if (strpos($contents, "安全退出") !== false)
  58. {
  59. return FALSE;
  60. }
  61. return TURE;
  62. }

  63. //获取邮箱通讯录-地址
  64. public function getAddressList($username, $password)
  65. {
  66. if (!$this->login($username, $password))
  67. {
  68. return FALSE;
  69. }
  70. //开始进入模拟抓取
  71. $ch = curl_init();
  72. 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数据
  73. curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIEJAR);
  74. /* 对于返回xml数据时需要此设置
  75. curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/xml"));
  76. $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>";
  77. curl_setopt($ch, CURLOPT_POSTFIELDS, $str);

  78. */
  79. curl_setopt($ch, CURLOPT_POST, 1);

  80. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  81. curl_setopt($ch, CURLOPT_TIMEOUT, TIMEOUT);
  82. $contents = curl_exec($ch);
  83. curl_close($ch);
  84. //die($contents);
  85. //get mail list from the page information username && emailaddress
  86. /* 对于返回xml数据时的处理
  87. preg_match_all("/<string/s*name=/"EMAILREF/">(.*)<//string>/Umsi",$contents,$mails);
  88. preg_match_all("/<string/s*name=/"FN/">(.*)<//string>/Umsi",$contents,$names);
  89. $users = array();
  90. foreach($names[1] as $k=>$user)
  91. {
  92. //$user = iconv($user,'utf-8','gb2312');
  93. $users[$mails[1][$k]] = $user;
  94. }
  95. if (!$users)
  96. {
  97. return '您的邮箱中尚未有联系人';
  98. }
  99. */
  100. $contents = substr($contents, strlen('while (true); &&&START&&&'), -strlen('&&&END&&& '));
  101. return $contents;
  102. }
  103. }

  104. $gamil = new GMAIL;

  105. $res = $gamil->getAddressList('username@163.com','123456');

  106. echo $res;

  107. ?>

  108. <mce:script type="text/javascript"><!--
  109. var data = <?php echo $res; ?>

  110. alert(data['Body']); //json数据
  111. // --></mce:script>
复制代码

2.HOTMAIL(MSN)
  1. <?php
  2. define( "COOKIEJAR", tempnam( ini_get( "upload_tmp_dir" ), "cookie" ) ); //定义COOKIES存放的路径,要有操作的权限
  3. define( "TIMEOUT", 1000 ); //超时设定
  4. class MSN
  5. {

  6. function getAddressList($username, $password)
  7. {
  8. //第一步:模拟抓取登录页面的数据,并记下cookies
  9. $cookies = array();
  10. $ch = curl_init();
  11. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  12. 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");
  13. curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIEJAR);
  14. curl_setopt($ch, CURLOPT_TIMEOUT, TIMEOUT);
  15. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  16. $str = curl_exec($ch);
  17. curl_close($ch);

  18. //参数的分析
  19. $matches = array();
  20. preg_match('/<input/s*type="hidden"/s*name="PPFT"/s*id="(.*?)"/s*value="(.*?)"/s*//>/i', $str, $matches);
  21. $PPFT = $matches[2];

  22. preg_match('/srf_sRBlob=/'(.*?)/';/i', $str, $matches);
  23. $PPSX = $matches[1];

  24. $type = 11;

  25. $LoginOptions = 3;

  26. $Newuser = 1;

  27. $idsbho = 1;

  28. $i2 = 1;

  29. $i12 = 1;

  30. $i3 = '562390';

  31. $PPSX = 'Pa';
  32. //合并参数
  33. $postfiles = "login=".$username."&passwd=".$password."&type=".$type."&LoginOptions=".$LoginOptions."&Newuser=".$Newuser."&idsbho=".$idsbho."&i2=".$i2."&i3=".$i3."&PPFT=".$PPFT."&PPSX=".$PPSX."&i12=1";

  34. //第二步:开始登录
  35. $ch = curl_init();
  36. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  37. curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIEJAR);
  38. 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()是为了模拟随机的时间
  39. curl_setopt($ch, CURLOPT_POST, 1);
  40. curl_setopt($ch, CURLOPT_POSTFIELDS, $postfiles);
  41. curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIEJAR);
  42. //curl_setopt($ch, CURLOPT_HEADER, 1);
  43. curl_setopt($ch, CURLOPT_TIMEOUT, TIMEOUT);
  44. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

  45. $content = curl_exec($ch);
  46. curl_close($ch);

  47. if( stripos($content,'WLWorkflow') !== FALSE ) { //WLWorkflow登录页面JS
  48. return false; //登录失败
  49. }
  50. //获取location链接
  51. $matches = array();
  52. preg_match('/window.location.replace/(/"(.*?)/"/)/i', $content, $matches);
  53. $url_contiune_1 = $matches[1]; //接下来的链接
  54. if(!$url_contiune_1) {
  55. return false;
  56. }
  57. //第三步: 进入引导页面

  58. $ch = curl_init();
  59. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  60. curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIEJAR);
  61. curl_setopt($ch, CURLOPT_URL, $url_contiune_1);
  62. curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIEJAR);
  63. curl_setopt($ch, CURLOPT_HEADER, 1);
  64. curl_setopt($ch, CURLOPT_TIMEOUT, TIMEOUT);
  65. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  66. $content_2 = curl_exec($ch);

  67. //echo $postfiles;
  68. curl_close($ch);

  69. //获取redicturl链接
  70. $matches = array();
  71. preg_match('/<a/s*href=/"(.*?)/"/s*>/i', $content_2, $matches);
  72. $url_contiune_2 = $matches[1]; //接下来的链接
  73. if(!$url_contiune_2) {
  74. return false;
  75. }

  76. //跳过进入首页
  77. /*
  78. $ch = curl_init();
  79. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  80. curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIEJAR);
  81. curl_setopt($ch, CURLOPT_URL, $url_contiune_2);
  82. curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIEJAR);
  83. curl_setopt($ch, CURLOPT_HEADER, 1);
  84. curl_setopt($ch, CURLOPT_TIMEOUT, 1000);
  85. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  86. $content_3 = curl_exec($ch);

  87. curl_close($ch);
  88. */
  89. //获取邮箱请求基址 读取host
  90. $matches = array();
  91. preg_match('/(.*?)////(.*?)//(.*?)/i', $url_contiune_2, $matches);
  92. $url_contiune_3 = trim($matches[1]).'//'.trim($matches[2]); //首页定义的站点基址
  93. $url_4 = $url_contiune_3.'/mail/ContactMainLight.aspx?n=435707983'; //n后面的数字是随机数
  94. if(!$url_contiune_3) {
  95. return false;
  96. }

  97. //第四步: 开始获取邮箱联系人
  98. //base $url_4
  99. $ch = curl_init();
  100. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  101. curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIEJAR);
  102. curl_setopt($ch, CURLOPT_URL, $url_4);
  103. curl_setopt($ch, CURLOPT_TIMEOUT, TIMEOUT);
  104. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  105. $str = curl_exec($ch);
  106. //分析数据 (此处的数据因为hotmail的JS处理机制,所以在页面上看不出来,源码上可以看到数据)
  107. return $this->hanlde_date($str);

  108. }
  109. function hanlde_date($data) {
  110. $new_str = array();
  111. if(!empty($data)) {
  112. $ops_start = stripos($data,'ic_control_data');
  113. $ops_end = stripos($data,';',$ops_start);
  114. $new_str = substr($data, $ops_start + strlen('ic_control_data = '), $ops_end - $ops_start - strlen('ic_control_data = ') );
  115. return $new_str; //返回JSON对象
  116. } else {
  117. return array();
  118. }


  119. }
  120. }

  121. $msn = new MSN;

  122. $res = $msn->getAddressList('username@111.com','123456');

  123. echo $res;


  124. ?>

  125. <mce:script type="text/javascript"><!--
  126. var data = <?php echo $res; ?>

  127. alert(data['ic1'][6]);
  128. alert(data['ic1'][3]);
  129. // --></mce:script>
复制代码

3.YAHOO
  1. <?php
  2. define( "COOKIEJAR", tempnam( ini_get( "upload_tmp_dir" ), "cookie" ) ); //定义COOKIES存放的路径,要有操作的权限
  3. define( "TIMEOUT", 1000 ); //超时设定
  4. class YAHOO
  5. {

  6. private function login($username, $password)
  7. {
  8. //第一步:模拟抓取登录页面的数据,并记下cookies
  9. $cookies = array();
  10. $matches = array();

  11. //获取表单
  12. $login_url = "https://login.yahoo.com/config/login?.src=fpctx&.intl=us&.done=http%3A%2F%2Fwww.yahoo.com%2F";
  13. $ch = curl_init($login_url);

  14. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  15. curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIEJAR);
  16. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  17. $contents = curl_exec($ch);
  18. curl_close($ch);

  19. //构造参数
  20. $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');
  21. $postfiles = array();
  22. $matches = array();
  23. foreach($name as $v) {
  24. preg_match('/<input/s*type="hidden"/s*name=".'.$v.'"/s*value="(.*?)"/s*>/i', $contents, $matches);
  25. if(!empty($matches)) {
  26. $postfiles['.'.$v] = $matches[1];
  27. $matches = array();
  28. }
  29. if($v == 'pd') {
  30. $postfiles['.'.$v] = urlencode($postfiles['.'.$v]);
  31. }
  32. }

  33. $postfiles['pad'] = 5;
  34. $postfiles['aad'] = 6;
  35. $postfiles['login'] = urlencode($username);
  36. $postfiles['passwd'] = $password;
  37. $postfiles['.persistent'] = 'y';
  38. $postfiles['save'] = '';
  39. $postfiles['.done'] = urlencode($postfiles['.done']);
  40. //$postfiles['.pd'] = urlencode($postfiles['.pd']);
  41. $postargs = '';

  42. foreach($postfiles as $k => $v){
  43. $postargs .= $k.'='.$v.'&';
  44. }
  45. $postargs = substr($postargs,0,-1);
  46. $request = "https://login.yahoo.com/config/login?";

  47. //开始登录
  48. $ch = curl_init();
  49. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  50. curl_setopt($ch, CURLOPT_URL, $request);

  51. curl_setopt($ch, CURLOPT_POST, 1);
  52. curl_setopt($ch, CURLOPT_POSTFIELDS, $postargs);
  53. curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIEJAR);
  54. curl_setopt($ch, CURLOPT_TIMEOUT, TIMEOUT);
  55. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  56. $contents = curl_exec($ch);
  57. curl_close($ch);

  58. if (stripos($contents,'submit') != FALSE)
  59. {
  60. return 0;
  61. }
  62. return 1;
  63. }

  64. //获取邮箱通讯录-地址
  65. public function getAddressList($username, $password)
  66. {
  67. if (!$this->login($username, $password))
  68. {
  69. return 0;
  70. }

  71. //开始进入模拟抓取
  72. //get mail list from the page information username && emailaddress
  73. $url = "http://address.mail.yahoo.com/";
  74. $data = array( );
  75. if ( !$data = $this->hanlde_date( $url, $names, $emails) )
  76. {
  77. return FALSE;
  78. }
  79. echo '<pre>';
  80. print_r($data);
  81. return $data;
  82. }
  83. function hanlde_date( $url, &$names, &$emails)
  84. {
  85. $ch = curl_init( );
  86. curl_setopt( $ch, CURLOPT_COOKIEFILE, COOKIEJAR );
  87. curl_setopt( $ch, CURLOPT_URL, $url );
  88. curl_setopt( $ch, CURLOPT_TIMEOUT, TIMEOUT );
  89. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  90. $contents = curl_exec($ch);
  91. curl_close($ch);
  92. $temparr = array();
  93. preg_match_all('/InitialContacts/s*=/s*(.*?);/i',$contents,$temparr);
  94. return $temparr[1][0].';'; //匹配出JSON对象数组
  95. }
  96. }


  97. $yahoo = new YAHOO;

  98. $res = $yahoo->getAddressList('username@yahoo.com.cn','123456');


  99. ?>
  100. <mce:script type="text/javascript"><!--
  101. var data = <?php echo $res; ?>
  102. var obj1 = data[0];
  103. alert(data[0]['contactName']);
  104. // --></mce:script>
复制代码

注:
163,126在网上的源码都有,在此就不一一的列出来了哦
当然此代码是自己个人的拙作,只是为了给大家此类问题做一个指引
转自:http://blog.csdn.net/hudie631489527/article/details/5922097



上一篇:怎么调用discuz程序里的头部和底部文件呀?
下一篇:Discuz X防垃圾机发帖插件,彻底禁止垃圾发帖机器软件发帖
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-1 20:07

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表