我們使用phpmailer登錄郵件發郵件也是使用了curl原理來實現模仿用戶(www.49028c.com)發郵件了,今天看了兩個利用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);
- (www.49028c.com)//關閉一個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;
- }
- }
- ?>
新聞熱點
疑難解答