今天我们来聊一下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模拟登陆的实现原理并掌握了相关技术后,我们就可以愉快地去探索那些被限制了访问的网站了!