php专区

 首页 > php专区 > PHP应用 > 常用功能 > php利用CURL函数登入163邮箱并获取自己的通讯录

php利用CURL函数登入163邮箱并获取自己的通讯录

分享到:
【字体:
导读:
          我们使用phpmailer登录邮件发邮件也是使用了curl原理来实现模仿用户(www phpfensi com)发邮件了,今天看了两个利用CURL函数登入163邮箱并获取自己的通讯录的例子 学习了一些CURL的基础知识并做...

php利用CURL函数登入163邮箱并获取自己的通讯录

我们使用phpmailer登录邮件发邮件也是使用了curl原理来实现模仿用户(www.phpfensi.com)发邮件了,今天看了两个利用CURL函数登入163邮箱并获取自己的通讯录的例子.

学习了一些CURL的基础知识并做了这个示例,关于CURL的知识可以从php的官网上查看,点击查看.

示例代码调试方式:把$userName和$password换成自己163邮箱的用户名和密码即可.

注意:用户名和密码一定要正确,否则报错,没有做容错处理,示例代码如下:

  1. //==================账号信息================== 
  2. //用户名 
  3. $userName = 'xxxxxxxx'
  4. //密码 
  5. $password = 'xxxxxxxx'
  6. //邮箱 
  7. $email = $userName . '@163.com'
  8. //==================登录================== 
  9. //登录地址(登录地址并不是form表单设置的地址,通过js修改了form的action属性,需要查看登录页面源码才能发现) 
  10. $loginUrl = "https://ssl.mail.163.com/entry/coremail/fcg/ntesdoor2?df=mail163_letter&from=web&funcid=loginone&iframe=1&language=-1&passtype=1&product=mail163&net=n&style=-1&race=-2_56_-2_hz&uid={$email}"
  11. //登录时发送的post数据(查看form表单,注意有隐藏域) 
  12. $postArray = array
  13.     "url2" => "http://mail.163.com/errorpage/error163.htm"
  14.     "savelogin" => 0,  "username" => trim($userName), "password" => $password
  15. ); 
  16. $postString = ''
  17. foreach($postArray as $key => $value){ 
  18.     $postString .= "{$key}={$value}&"
  19. $postString = trim($postString'&'); 
  20. //初始化CURL对象 
  21. $curl = curl_init(); 
  22. //设置请求地址 
  23. curl_setopt($curl, CURLOPT_URL, $loginUrl); 
  24. //禁用后CURL将终止从服务端进行验证 
  25. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); 
  26. //启用时将获取的信息以文件流的形式返回,而不是直接输出 
  27. curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); 
  28. //启用时会将头文件的信息作为数据流输出 
  29. curl_setopt($curl, CURLOPT_HEADER, TRUE); 
  30. //设置POST参数 
  31. curl_setopt($curl, CURLOPT_POST, TRUE); 
  32. curl_setopt($curl, CURLOPT_POSTFIELDS, $postString); 
  33. //执行给定的CURL会话 
  34. //成功时返回 TRUE,失败时返回 FALSE 
  35. //然而,如果 CURLOPT_RETURNTRANSFER选项被设置,函数执行成功时会返回执行的结果,失败时返回 FALSE 
  36. $html = curl_exec($curl); 
  37. //把获取到的数据写入文件中以便查看 
  38. //file_put_contents('temp1.txt', $html); 
  39. //分割头文件和内容 
  40. list($head$content) = explode("\r\n\r\n"$html, 2); 
  41. //把获取到的数据写入文件中以便查看 
  42. //file_put_contents('temp2.txt', $head); 
  43. //file_put_contents('temp3.txt', $content); 
  44. $head = explode("\r\n"$head); 
  45. //获取cookie信息 
  46. $cookieString = ''
  47. foreach ($head as $value){ 
  48.     if(stripos($value"Set-Cookie: ") !== false){ 
  49.         $cookieString .= str_replace("Set-Cookie: """$value); 
  50.     } 
  51. //从content里分析出sid值(读取通讯录信息的参数) 
  52. $startString = 'top.location.href = "'
  53. $endString = '";'
  54. $start = strpos($content$startString); 
  55. $end = strpos($content$endString); 
  56. $tempUrl = substr($content$start + strlen($startString), $end - $start - strlen($startString)); 
  57. $tempUrlVals = parse_url($tempUrl); 
  58. parse_str($tempUrlVals['query'], $queryVals); 
  59. $sid = $queryVals['sid']; 
  60. //==================读取邮箱================== 
  61. //读取邮箱地址 
  62. $readUrl = "http://twebmail.mail.163.com/contacts/call.do?uid={$email}&sid={$sid}&from=webmail&cmd=newapi.getContacts&vcardver=3.0&ctype=all&attachinfos=yellowpage"
  63. //设置请求地址 
  64. curl_setopt($curl, CURLOPT_URL, $readUrl); 
  65. //设置POST参数 
  66. curl_setopt($curl, CURLOPT_POST, TRUE); 
  67. curl_setopt($curl, CURLOPT_POSTFIELDS, 'order=[{"field":"N","desc":"false"}]'); 
  68. //注意这里要设置从登录操作中获取的cookie 
  69. curl_setopt($curl, CURLOPT_COOKIE, $cookieString); 
  70. //禁用头文件输出 
  71. curl_setopt($curl, CURLOPT_HEADER, FALSE); 
  72. //执行给定的CURL会话 
  73. //成功时返回 TRUE,失败时返回 FALSE 
  74. //然而,如果 CURLOPT_RETURNTRANSFER选项被设置,函数执行成功时会返回执行的结果,失败时返回 FALSE 
  75. $content = curl_exec($curl); 
  76. //把获取到的数据写入文件中以便查看 
  77. //file_put_contents('temp4.txt', $content); 
  78. (www.phpfensi.com)//关闭一个CURL会话,并释放资源 
  79. curl_close($curl); 
  80. echo '
    '
  81. print_r(json_decode($content, true)); 
  82. echo ''

例子二,这个更高级一些可以输入信息,代码如下:

  1.  
  2.  
  3. "text/html; charset=utf-8" http-equiv="Content-Type"/> 
  4. 登陆163邮箱 
  5.  
  6.  
  7. "login" action="mail.php" method="POST"
  8. for="username">用户名:"username" name="username" type="text" /> 
  9. for="password">密码:"password" name="password" type="password" /> 
  10. "submit" value="取得通讯录列表" /> 
  11.  
  12.  
  13.  

mail.php,代码如下:

  1.     define("COOKIEJAR",ini_get"upload_tmp_dir" ).DIRECTORY_SEPARATOR."cookie.txt"); 
  2.      
  3.     if( !isset($_POST['username']) || !isset($_POST['username']) ){ 
  4.         echo 'ERROR QUEST'
  5.         exit(); 
  6.     } 
  7.      
  8.     $username = $_POST['username']; 
  9.     $pos = strrpos($username,'@'); 
  10.     if($pos === false){ 
  11.         $username .= "@163.com"
  12.     } 
  13.     $password = $_POST['password']; 
  14.      
  15.     //登陆163邮箱,获得登陆后的cookie 
  16.     $options = array
  17.       CURLOPT_URL => "https://reg.163.com/logins.jsp"
  18.       CURLOPT_SSL_VERIFYPEER => false, 
  19.       CURLOPT_POST => 1, 
  20.       CURLOPT_POSTFIELDS => "username=".$username."&password=".$password
  21.       CURLOPT_COOKIEJAR => COOKIEJAR, 
  22.     ); 
  23.     curl_quest($options); 
  24.      
  25.     //利用上一步获得的cookie进一步取得cookie 
  26.     $options2 = array
  27.       CURLOPT_URL => "http://fm163.163.com/coremail/fcg/ntesdoor2?verifycookie=1&lightweight=1"
  28.       CURLOPT_COOKIEFILE => COOKIEJAR, 
  29.       CURLOPT_COOKIEJAR => COOKIEJAR, 
  30.     ); 
  31.     curl_quest($options2); 
  32.      
  33.     //分析cookie文件,取得coremail. 
  34.     $cookiefile = file_get_contents(COOKIEJAR); 
  35.     preg_match('|Coremail.*?%(\S*)|',$cookiefile,$sid); 
  36.      
  37.     //发送获得通讯录xml请求. 
  38.     $postStr3 = '"1.0"?><array name="items">"func">pab:searchContacts
  39. >"var"><array name="order">"field">FN"ignoreCase" 
  40. >true
  41. array
    >
  42. "func">user:getSignatures
  43. >
  44. "func">pab:getAllGroupsarray>'; 
  45.     $options3 = array
  46.        CURLOPT_URL => 'http://eg1a120.mail.163.com/a/s?sid='.$sid[1].'&func=global:sequential'
  47.        CURLOPT_HTTPHEADER => array('Content-Type: application/xml'), 
  48.       CURLOPT_POST => 1, 
  49.       CURLOPT_COOKIEFILE => COOKIEJAR, 
  50.       CURLOPT_POSTFIELDS => $postStr3
  51.       CURLOPT_REFERER => 'http://eg1a120.mail.163.com/a/f/js3/0811050934/index_v12.htm'
  52.     ); 
  53.     $mailsxml = curl_quest($options3,true); 
  54.      
  55.     //输出获得的通讯录xml 
  56.     header("Content-Type: application/xml"); 
  57.     echo $mailsxml
  58.      
  59.     function curl_quest($ops,$return = false){ 
  60.         $ch = curl_init();  
  61.        curl_setopt_array($ch,$ops); 
  62.         ob_start( ); 
  63.         curl_exec($ch); 
  64.         if($return){ 
  65.             $content=ob_get_contents(); 
  66.         } 
  67.         curl_close($ch); 
  68.         ob_end_clean(); 
  69.         if($return){ 
  70.             return $content
  71.         } 
  72.     } 
  73.  
  74. ?> 
分享到:
emlog中使用memcache缓存配置修改方法 - ...
emlog中使用memcache缓存配置修改方法 emlog使用的是文件缓存了,不管文件缓存多好也好不过memcache缓存了,关于memcache缓存优于文件缓存我们就不介绍了,下面简单的看看配置方法吧. 这次只是简单的HACK emlog cache程序,使用memcache缓存,毕竟memcache缓存在内存, 文件缓存在硬盘(要看I/O的...
php多进程几个例子 - php高级应用
php多进程几个例子 php多进程这个东西先是在java中有不过现在高版本的php也支持多进程这个功能,但经过测试性能不如j(www.phpfensi.com)ava了希望后期有所提高了,下面我们一起来看看我整理了几个关于php多进程例子,希望能帮助你理解多线程. php多进程的实现依赖于pcntl扩展,编译PHP的时候,可...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……