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

学习了一些CURL的基础知识并做了这个示例,关于CURL的知识可以从php的官网上查看,点击查看。
示例代码调试方式:把$userName和$password换成自己163邮箱的用户名和密码即可。
注意:用户名和密码一定要正确,否则报错,没有做容错处理。

示例代码如下:

 代码如下 复制代码

<?php
//==================账号信息==================
//用户名
$userName = 'xxxxxxxx';
//密码
$password = 'xxxxxxxx';
//邮箱
$email = $userName . '@163.com';
//==================登录==================
//登录地址(登录地址并不是form表单设置的地址,通过js修改了form的action属性,需要查看登录页面源码才能发现)
$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}";
//登录时发送的post数据(查看form表单,注意有隐藏域)
$postArray = array(
    "url2" => "http://mail.163.com/errorpage/error163.htm",
    "savelogin" => 0,  "username" => trim($userName), "password" => $password,
);
$postString = '';
foreach($postArray as $key => $value){
    $postString .= "{$key}={$value}&";
}
$postString = trim($postString, '&');
//初始化CURL对象
$curl = curl_init();
//设置请求地址
curl_setopt($curl, CURLOPT_URL, $loginUrl);
//禁用后CURL将终止从服务端进行验证
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
//启用时将获取的信息以文件流的形式返回,而不是直接输出
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
//启用时会将头文件的信息作为数据流输出
curl_setopt($curl, CURLOPT_HEADER, TRUE);
//设置POST参数
curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postString);
//执行给定的CURL会话
//成功时返回 TRUE,失败时返回 FALSE
//然而,如果 CURLOPT_RETURNTRANSFER选项被设置,函数执行成功时会返回执行的结果,失败时返回 FALSE
$html = curl_exec($curl);
//把获取到的数据写入文件中以便查看
//file_put_contents('temp1.txt', $html);
//分割头文件和内容
list($head, $content) = explode("\r\n\r\n", $html, 2);
//把获取到的数据写入文件中以便查看
//file_put_contents('temp2.txt', $head);
//file_put_contents('temp3.txt', $content);
$head = explode("\r\n", $head);
//获取cookie信息
$cookieString = '';
foreach ($head as $value){
    if(stripos($value, "Set-Cookie: ") !== false){
        $cookieString .= str_replace("Set-Cookie: ", "", $value);
    }
}
//从content里分析出sid值(读取通讯录信息的参数)
$startString = 'top.location.href = "';
$endString = '";</script>';
$start = strpos($content, $startString);
$end = strpos($content, $endString);
$tempUrl = substr($content, $start + strlen($startString), $end - $start - strlen($startString));
$tempUrlVals = parse_url($tempUrl);
parse_str($tempUrlVals['query'], $queryVals);
$sid = $queryVals['sid'];
//==================读取邮箱==================
//读取邮箱地址
$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";
//设置请求地址
curl_setopt($curl, CURLOPT_URL, $readUrl);
//设置POST参数
curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, 'order=[{"field":"N","desc":"false"}]');
//注意这里要设置从登录操作中获取的cookie
curl_setopt($curl, CURLOPT_COOKIE, $cookieString);
//禁用头文件输出
curl_setopt($curl, CURLOPT_HEADER, FALSE);
//执行给定的CURL会话
//成功时返回 TRUE,失败时返回 FALSE
//然而,如果 CURLOPT_RETURNTRANSFER选项被设置,函数执行成功时会返回执行的结果,失败时返回 FALSE
$content = curl_exec($curl);
//把获取到的数据写入文件中以便查看
//file_put_contents('temp4.txt', $content);
//关闭一个CURL会话,并释放资源
curl_close($curl);
echo '<pre>';
print_r(json_decode($content, true));
echo '</pre>';

例子二,这个更高级一些可以输入信息

 代码如下 复制代码

<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<title>登陆163邮箱</title>
</head>
<body>
<form id="login" action="mail.php" method="POST">
<label for="username">用户名:</label><input id="username" name="username" type="text" />
<label for="password">密码:</label><input id="password" name="password" type="password" />
<input type="submit" value="取得通讯录列表" />
</form>
</body>
</html>

mail.php

 代码如下 复制代码

<?php
    define("COOKIEJAR",ini_get( "upload_tmp_dir" ).DIRECTORY_SEPARATOR."cookie.txt");
   
    if( !isset($_POST['username']) || !isset($_POST['username']) ){
        echo 'ERROR QUEST';
        exit();
    }
   
    $username = $_POST['username'];
    $pos = strrpos($username,'@');
    if($pos === false){
        $username .= "@163.com";
    }
    $password = $_POST['password'];
   
    //登陆163邮箱,获得登陆后的cookie
    $options = array(
      CURLOPT_URL => "https://reg.163.com/logins.jsp",
      CURLOPT_SSL_VERIFYPEER => false,
      CURLOPT_POST => 1,
      CURLOPT_POSTFIELDS => "username=".$username."&password=".$password,
      CURLOPT_COOKIEJAR => COOKIEJAR,
    );
    curl_quest($options);
   
    //利用上一步获得的cookie进一步取得cookie
    $options2 = array(
      CURLOPT_URL => "http://fm163.163.com/coremail/fcg/ntesdoor2?verifycookie=1&lightweight=1",
      CURLOPT_COOKIEFILE => COOKIEJAR,
      CURLOPT_COOKIEJAR => COOKIEJAR,
    );
    curl_quest($options2);
   
    //分析cookie文件,取得coremail.
    $cookiefile = file_get_contents(COOKIEJAR);
    preg_match('|Coremail.*?%(\S*)|',$cookiefile,$sid);
   
    //发送获得通讯录xml请求.
    $postStr3 = '<?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>';
    $options3 = array(
       CURLOPT_URL => 'http://eg1a120.mail.163.com/a/s?sid='.$sid[1].'&func=global:sequential',
       CURLOPT_HTTPHEADER => array('Content-Type: application/xml'),
      CURLOPT_POST => 1,
      CURLOPT_COOKIEFILE => COOKIEJAR,
      CURLOPT_POSTFIELDS => $postStr3,
      CURLOPT_REFERER => 'http://eg1a120.mail.163.com/a/f/js3/0811050934/index_v12.htm',
    );
    $mailsxml = curl_quest($options3,true);
   
    //输出获得的通讯录xml
    header("Content-Type: application/xml");
    echo $mailsxml;
   
    function curl_quest($ops,$return = false){
        $ch = curl_init();
       curl_setopt_array($ch,$ops);
        ob_start( );
        curl_exec($ch);
        if($return){
            $content=ob_get_contents();
        }
        curl_close($ch);
        ob_end_clean();
        if($return){
            return $content;
        }
    }

?>

时间: 2024-10-25 00:20:33

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

PHP利用curl函数后台远程登录正方教务系统

从去年想这个事情怎么解决,今年终于算是把他搞清楚了,但验证码必须要填. 如果你能像360抢票哪有自动识别验证码,那就没事了.废话不多扯了.回归正题 这里要用CURL. 设计思路:先登录页面获取COOKIES,然后拿着cookies找服务器要验证码.最后提供服务器需要的全部信息. (这种思维是完全模拟游览器访问页面,根本区别出来是人还机器)  代码如下 复制代码 public function index(){   $ch = curl_init();   curl_setopt($ch, CUR

Facebook今日宣布将对用Facebook账户登入

Facebook今日宣布将对用Facebook账户登入,并申请使用用户的Facebook个人信息的第三方应用进行人工审核,从而让用户安心的授权第三方应用. Facebook的平台产品主管Eddie O'Neil表示,对于那些利用Facebook账户登入,并向用户申请使用除了公开信息(名字,头像,性别等),好友列表,以及邮件之外的数据的第三方应用,Facebook将实行严格的人工审核,从而确保第三方应用只会将这些数据用于提升用户的使用体验.审核申请会在七个工作日内得到反馈. Facebook除了实

php-PHP函数curl实现模拟登入网站

问题描述 PHP函数curl实现模拟登入网站 我想用curl函数实现模拟登入http://www.5173.com/网站,可是就是登入不了, 求大神指导 解决方案 用fiddler调试下,看看是返回什么.根本无法连接,还是服务器端的报错,还是你没有带上正确的cookie 这种山寨网站一般稳定性都很差的. 解决方案二: curl是用的post方式登录网站?提交的参数都填对数据了没. 解决方案三: 解决方案四: 把你的代码用文本形式发出来,我可以帮你看看 解决方案五: 代码发出来看看.... 解决方

php利用filter函数验证邮箱、url和ip地址的方法

php程序中验证邮箱,IP地址或url一般大家都会使用正则表达式来处理,其实在php里面有一些内置的专门验证规则.下面用实例说说如何使用php内置filter函数来验证email,ip以及URL. 1.验证邮箱 $email='Alixixi@163.com'; $result=filter_var($email,FILTER_VALIDATE_EMAIL); var_dump($result); //输出:string(17) 'Alixixi@163.com' 2.验证url地址 $url=

ThinkPHP3.2利用QQ邮箱/163邮箱通过PHPMailer发送邮件的方法

前言 我之前一直使用163邮箱发送需要处理的文件,但是如果操作过于频繁[或者有别的问题],会导致发送失败,相反现在用QQ的貌似还没出现过类似情况,不过QQ邮箱配置和163有一丢丢不一样,我还是贴一下,怕朋友们踩到坑,下面话不多说了,来一起看看详细的介绍吧. PHPMailer的优点: 可运行在任何平台之上 支持SMTP验证 发送邮时指定多个收件人,抄送地址,暗送地址和回复地址:注:添加抄送.暗送仅win平台下smtp方式支持 支持多种邮件编码包括:8bit,base64,binary和quote

java代码0用163邮箱发送邮件时报这个错

问题描述 java代码0用163邮箱发送邮件时报这个错 com.sun.mail.smtp.SMTPSendFailedException: 553 authentication is required,163 smtp14,EsCowEBZ50rSm3JWmXF+AA--.3541S2 1450351570 java代码: public class EmailTools { public static boolean send(String to,String subject,String c

[Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍

        前三篇文章介绍了安装过程和通过Selenium实现访问Firefox浏览器并自动搜索"Eastmount"关键字及截图的功能.而这篇文章主要简单介绍如何实现自动登录163邮箱,同时继续介绍Selenium+Python官网Locating Elements部分内容.         希望该篇基础性文章对你有所帮助,如果有错误或不足之处,请海涵~        [Python爬虫] 在Windows下安装PhantomJS和CasperJS及入门介绍(上)        

PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法

 这篇文章主要介绍了PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法,实例分析了php实用curl模拟登陆163邮箱的操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法.分享给大家供大家参考.具体实现方法如下:   代码如下: <?php header("Content-Type: text/html; charset=UTF-8"); error_reporting(0); /** * 登陆 *

163邮箱被盗怎么找回?

  有人反应163邮箱被盗了不知道该咋办,163邮箱被盗还会引起一系列的麻烦,那么如何找回被盗的163邮箱呢?下面小编就来跟大家说说163邮箱被盗的找回教程. 如果您忘记了密码,或发现帐号被盗,请立即通过下述任何一种方式修复密码或取回帐号! 1.通过生日和密码提示问题/答案 第一步:填写您的通行证用户名和您登记的生日,点击->>下一步; 第二步:回答您设定的密码提示问题答案.新密码和随机码点击->>下一步; 第三步:提交成功,完成新登录密码设置. 2.通过保密邮箱 第一步:填写您的