今天我們來聊一下PHP的HTTP模擬登陸,HTTP模擬登陸是指通過一個程序來模擬用戶登錄網站的過程。在現在web2.0時代,大部分網站都面向用戶開放了訪問或者一些簡單的操作,例如微博、人人、豆瓣等。但是在絕大多數網站上,都有用戶權限控制的界面,這就使得我們不能任意的去抓取我們想要的數據或者進行數據交互,因為必須要登錄后才可以被服務器接受。因此有時我們需要通過程序來模擬實現登陸操作,以獲得更多的數據或者實現一些自動化處理
HTTP模擬登陸的實現原理:
1. 向http://www.xxxxxx.com/user/login.php發送POST請求(必須是POST,不是GET),將username、password以及其它必需的POST請求發送。這里需要注意的是,有的網站傳遞的是form類型的數據,有的是以json字符串的形式傳遞,需要根據實際情況進行轉換。 2. 登陸成功后,服務器一般會在header中返回cookie信息,記錄用戶的狀態。在之后的操作中,我們需要帶上cookies,才能被服務器識別。 3. 如果登陸成功,服務器返回的狀態碼就是302,跳轉到我們需要訪問的界面。
示例一:我們通過CURL庫進行實現
function login($url , $data) { $loginUrl = $url; $cookieFile = dirname(__FILE__).'/cookie.txt'; //初始化curl,設置參數 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $loginUrl); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); //存儲獲取的cookie curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); //帶上存儲的cookie curl_setopt($ch, CURLOPT_REFERER, "http://www.xxxxxx.com"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); //傳入POST參數 //發送請求 $output = curl_exec($ch); $info = curl_getinfo($ch); curl_close($ch); return ($info['http_code'] === 302); //檢查返回狀態碼是否是302,也就是登陸成功 }
示例二:我們通過PHP的file_get_contents實現
function login($url, $data){ $streamContext = stream_context_create([ 'http' =>[ 'method' =>'POST', 'header' =>[ 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0', 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', 'Content-Type: application/x-www-form-urlencoded', 'Referer: http://www.xxxxxx.com', ], 'content' =>http_build_query($data), ] ]); //發送請求 $result = @file_get_contents($url, false, $streamContext); //檢查是否登陸成功的狀態碼 if(strpos($http_response_header[0], 202)){ return true; } return false; }
總結
以上就是通過PHP實現HTTP模擬登陸的兩種方式。當然,在實際應用的過程中,還需要注意很多方面的細節問題,例如headers、登錄時攜帶cookie等。當我們了解了HTTP模擬登陸的實現原理并掌握了相關技術后,我們就可以愉快地去探索那些被限制了訪問的網站了!