淘先锋技术网

首页 1 2 3 4 5 6 7

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