CURL模拟登录
登錄原理
驗證碼通過session保存并驗證,而session通過cookie獲取SSID
一、定義Cookie存儲路徑
必須使用絕對路徑
$cookie_jar = dirname(__FILE__)."/this_test.cookie";//指定存儲路徑
二、獲取Cookie
將cookie存入文件
$url = "http://web.mall.com/ ";??? //用來測試的本地網站的url
$ch = curl_init();??? //開啟curl連接
//curl配置
curl_setopt($ch, CURLOPT_URL, $url);??? //寫入url
curl_setopt($ch, CURLOPT_HEADER, 0);??? //是否有寫入頭信息需要寫入=>false
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);??? ?
??????????? //當CURLOPT_RETURNTRANSFER設置為1時 $content 有請求的返回值
????//當設置為0是$content沒有返回值,直接輸出請求的內容
curl_setopt($ch, CURLOPT_COOKIEJAR,$cookie_jar);??? //臨時建立的cookie文件路徑
$content = curl_exec($ch);??? //執行curl,并把結果返回給一個字符串
curl_close($ch);??? //關閉curl連接
三、把剛剛得到的cookie用來獲取驗證碼圖片
登陸界面 >表單中驗證碼相關字段與函數如下,可知驗證碼的地址
<inputtype="text"???? name="username"? class="username" placeholder="請輸入您的用戶名!"/>
<inputtype="password"?name="pwd"???? class="password"placeholder="請輸入您的用戶密碼!"/>
<inputtype="text" name="checkCode" class="Captcha"placeholder="請輸入驗證碼!">
<img class='pic'src="/login/checkpic"οnclick="this.src='/login/checkpic?aa='+Math.random()" />
<buttontype="button" οnclick="form_login()"id="login_submit" >登錄</button>
functionform_login(){
??? $(function(){
??????? $.ajax({
??????????? url:"/login/checkUser",
???????????data:$("#login_Data").serialize(),
??????????? dataType:"json",
??????????? type:"post",
??????????? success:function(msg){
??????????????? if(msg.err=="ok"){
???????????????????window.location.href="/";
??????????????? }else{
??????????????????? alert(msg.err);
??????????????? }
??????????? }
??????? });//ajax結束
??? });
}
//可知驗證碼圖片地址為http://web.mall.com/login/checkpic //現在取出驗證碼圖片 $verify_code_url="http://web.mall.com/login/checkpic"; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $verify_code_url); curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_jar); curl_setopt($curl, CURLOPT_HEADER, 0); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $img = curl_exec($curl); //獲取驗證碼圖片 curl_close($curl); $fp = fopen("verifyCode.jpg","w");//將驗證碼圖片保存到本地 fwrite($fp,$img); fclose($fp);然后通過表單把用戶名、密碼、驗證碼傳入登陸驗證的curl的php文件中去
四、POST提交到登陸驗證的地址
$check_url=”http://web.mall.com/login/CheckUser”;//驗證帳號的地址
$post = array(
??????????? 'username'=> $_POST['username'] ,
??????????? 'pwd'?????? ??=> $_POST['pwd'],
??????????? 'checkCode'=>$_POST['checkCode']
??????????? );
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://1.2.3.4/loginstudent.action");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$post);
curl_setopt($ch, CURLOPT_COOKIEFILE,$cookie_jar);
$result=curl_exec($ch);
curl_close($ch);
五、到指定頁面獲取數據
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://1.2.3.4/accountcardUser.action");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,0);??????? //直接輸出頁面
curl_setopt($ch, CURLOPT_COOKIEFILE,$cookie_jar);
$html=curl_exec($ch);
curl_close($ch);
?
六、獲取完所需要的數據后,清理cookie文件
@unlink($cookie_file);
下面是我寫了個對應案例
①【顯示登陸框】index.php
<pre name="code" class="php"><span style="font-size:18px;background-color: rgb(255, 204, 51);"><?php $cookie_jar = dirname(__FILE__)."/this_test.cookie";//指定存儲路徑 $url = "http://web.mall.com/"; //我們以模擬登陸本地網址為例 $ch = curl_init(); //開啟curl連接 //curl配置 curl_setopt($ch, CURLOPT_URL, $url); //寫入url curl_setopt($ch, CURLOPT_HEADER, 0); //是否有寫入頭信息需要寫入=>false curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //當CURLOPT_RETURNTRANSFER設置為1時 $content 有請求的返回值//當設置為0是$content沒有返回值,直接輸出請求的內容 curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar); //臨時建立的cookie文件路徑 $content = curl_exec($ch); //執行curl, 并把結果返回給一個字符串 curl_close($ch); //關閉curl連接$now_url="http://".$_SERVER["HTTP_HOST"].$_SERVER['REQUEST_URI'];//獲取當前目錄網址 require 'get_verify_code.php'; echo <<<eof </span><span style="font-size:18px;background-color: rgb(0, 204, 204);"><script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script> <script type="text/javascript" > function changeCode(){//用jq的ajax方法,切換驗證碼$.ajax({url:"{$now_url}get_verify_code.php?rand="+Math.random(),type:"post",success:function(msg){var new_src="{$now_url}verifyCode.jpg?rand="+Math.random();$("#verify_code").attr("src",new_src);}});} </script></span><span style="font-size:18px;background-color: rgb(255, 204, 51);"> </span><span style="font-size:18px;background-color: rgb(51, 255, 255);"> <center><form action="result.php" method="post"><input type="text" name="username" placeholder='請輸入用戶名'><br/><input type="password" name="password" placeholder='請輸入密碼'><br/><img src="verifyCode.jpg" id="verify_code" οnclick='changeCode();' width="150px" height="34px"><br/><input type="text" name="checkCode" placeholder='請輸入驗證碼'><br/><input type="hidden" name="cookie_jar" value="{$cookie_jar}" ><br/><input type="submit" value="提交"></form></center> </span><span style="font-size:18px;background-color: rgb(255, 204, 51);">eof;</span><span style="font-size:24px;color: rgb(51, 102, 102);"> </span> <span style="font-size:18px;background-color: rgb(255, 204, 51);"><img src="https://img-blog.csdn.net/20160725162519026?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /><img src="https://img-blog.csdn.net/20160725162542624?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" /> </span>②【獲取驗證碼】get_verify_code.php
<?php $verify_code_url="http://web.mall.com/login/checkpic"; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $verify_code_url); curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_jar); curl_setopt($curl, CURLOPT_HEADER, 0); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $img = curl_exec($curl); //獲取驗證碼圖片 curl_close($curl); $fp = fopen("verifyCode.jpg","w");//將驗證碼圖片保存到本地 fwrite($fp,$img); fclose($fp); ?>
③【輸出已登錄的頁面信息】result.php
總結
- 上一篇: Mysql优化之基础回顾篇
- 下一篇: [网站上线]Lamp环境及其后续配置