[PHP自動化-進階]002.CURL模擬登陸帶有驗證碼的網站

引言:繼前文《模擬登陸並採集數據》,你們彷佛看不過癮,這會再出一發,模擬實現帶驗證碼網站的登陸。php

這篇文章主要介紹了PHP使用CURL實現對帶有驗證碼的網站進行模擬登陸的方法,能夠幫助讀者加深對CURL操做的理解與應用,須要的朋友能夠參考下。html

網上的不少模擬登陸程序,大都是經過服務程序Apache之類的運行,獲取到驗證碼以後顯示在網頁上,而後填上再POST出去,這樣雖然看起來很友好,可是既然模擬登陸,登陸後所幹的事情就不必定是短期完成的,因此這就要受到php最大執行時間的限制,並且有些操做還有可能權限不足。瀏覽器

本文提供了一個程序實例,思路就是獲取到驗證碼以後把驗證碼存儲爲一個圖片,而後程序休眠20秒,在20秒以內由用戶手動查看圖片,並把驗證碼填寫到code.txt文件中,20秒休眠完成後,程序會讀code.txt的驗證碼,這樣再帶着驗證碼進行登陸操做。cookie

簡單,噁心,粗魯,粗暴……。curl

 

切入主題網站


下面直接上高清代碼,:)。url

///////////////
// 初始化變量
///////////////
// Cookie文件名稱
$cookie_file = "tmp.cookie";
// 驗證碼文件名稱
$vcode_file  = "code.txt";
// 登陸網址
$login_url   = "http://xxx.com/logon.php";
// 驗證碼網址
$vcode_url   = "http://xxx.com/verifyCode.php";


echo "===================================\n";
echo "正在獲取COOKIE...                  \n";
echo "===================================\n";
// 初始化CURL對象
$ch = curl_init();

// 設置請求URL
curl_setopt($ch, CURLOPT_URL, $login_url);
// 設置不輸出到瀏覽器(說明:直接返回字符串,不然直接輸出)
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 設置鏈接超時時間(說明:5秒)
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
// 設置Cookie保存文件(說明:把返回來的cookie信息保存在$cookie_file文件中)
curl_setopt($ch,CURLOPT_COOKIEJAR, $cookie_file);

// 執行請求
$contents = curl_exec($ch);
// 關閉鏈接
curl_close($ch);



echo "===================================\n";
echo "COOKIE獲取完成,正在取驗證碼...    \n";
echo "===================================\n";
// 初始化CURL對象
$ch = curl_init();

// 設置請求URL
curl_setopt($ch, CURLOPT_URL, $vcode_url);
// 設置Cookie使用文件(說明:使用指定路徑下的cookie文件,並跟隨請求傳遞)
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
// 設置返回響應頭信息[無](說明:該設置一般是須要加上的,用於製做下一次請求的肥料。)
curl_setopt($ch, CURLOPT_HEADER, 0);
// 設置不輸出到瀏覽器(說明:直接返回字符串,不然直接輸出)
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// 執行請求(說明:得到圖片字符集)
$img = curl_exec($ch);
// 關閉鏈接
curl_close($ch);



echo "===================================\n";
echo "正在保存驗證碼圖片...              \n";
echo "===================================\n";
$fp = fopen("verifyCode.jpg", "w");
fwrite($fp, $img);
fclose($fp);



echo "===================================\n";
echo "驗證碼取出完成,正在休眠...        \n";
echo "20秒內請把驗證碼填入code.txt並保存.\n";
echo "===================================\n";
// 線程睡眠20秒
sleep(20);



echo "===================================\n";
echo "休眠完成,開始取驗證碼...          \n";
echo "===================================\n";
$code = file_get_contents(vcode_file);
echo "驗證碼成功取出:$code\n";



echo "===================================\n";
echo "正在準備模擬登陸...                \n";
echo "正在準備模擬登陸...                \n";
echo "===================================\n";
// 初始化CURL對象
$ch = curl_init();

// 設置請求URL
curl_setopt($ch, CURLOPT_URL, $url);
// 設置返回響應頭信息[無](說明:該設置一般是須要加上的,用於製做下一次請求的肥料。)
curl_setopt($ch, CURLOPT_HEADER, false);
// 設置不輸出到瀏覽器(說明:直接返回字符串,不然直接輸出)
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 設置請求攜帶數據
curl_setopt($ch, CURLOPT_POSTFIELDS, "username=superdo&pwd=do.org.cn&verifycode=$code");
// 設置Cookie使用文件(說明:使用指定路徑下的cookie文件,並跟隨請求傳遞)
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);

// 執行請求
$result = curl_exec($ch);
// 關閉鏈接
curl_close($ch);
 
// 這一塊根據本身抓包獲取到的網站上的數據來作判斷
if (substr_count($result, "登陸成功")) {
    echo "登陸成功\n";
} else {
    echo "登陸失敗\n";
    exit;
}
 
// OK,開始作你想作的事吧。。。。。

 

未完待續……。spa

 

 

 

本站文章爲 寶寶巴士 SD.Team 原創,轉載務必在明顯處註明:(做者官方網站: 寶寶巴士 
轉載自【寶寶巴士SuperDo團隊】 原文連接: http://www.cnblogs.com/superdo/p/4791957.html
線程

相關文章
相關標籤/搜索