使用cURL实现模拟登录

cURL简介

PHP支持的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。libcurl目前支持http、https、ftp、gopher、telnet、dict、file和ldap协议。libcurl同时也支持HTTPS认证、HTTP POST、HTTP PUT、 FTP 上传(这个也能通过PHP的FTP扩展完成)、HTTP 基于表单的上传、代理、cookies和用户名+密码的认证。在使用cURL之前,请确保安装并开启了php_curl扩展。

cURL的使用

<?php
// 初始化一个 cURL 对象
$curl = curl_init();
// 设置你需要抓取的URL
curl_setopt($curl, CURLOPT_URL, 'http://blog.phphu.com');
// 设置header
curl_setopt($curl, CURLOPT_HEADER, 1);
// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
// 运行cURL,请求网页
$data = curl_exec($curl);
// 关闭URL请求
curl_close($curl);
// 显示获得的数据
var_dump($data);
?>

登录的流程

客户端打开登录页面->填写表单信息->提交表单
服务器端验证登录信息->返回登录结果->登录成功将返回cookie数据
客户端->网页服务器->客户端

cURL模拟登录的原理

由PHP构造http请求,此时的客户端是我们发送请求的这台服务器。为什么要强调这一点呢?普通登录cookie信息是存放在客户端的,而cURL方式cookie是存放在发起请求的PHP服务器上的。
PHP服务器->网页服务器->PHP服务器
如果复杂一点,引入用户交互的话就是下面这种情况:
客户端->PHP服务器->网页服务器->PHP服务器->客户端

cURL模拟登录实现

下面就以51job为例

<?php
//设置选项,包括URL
$ch = curl_init();
$cookie_file= tempnam('./tmp', 'cookie');
//表单参数用户名密码
$data = array('username' => 'aaa', 'userpwd' => 'bb');
//指定表单提交的地址
curl_setopt($ch, CURLOPT_URL, 'https://mylogin.51job.com/90817185675377454865/my/My_Pmc.php');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
//cookie存放位置
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_setopt($ch, CURLOPT_REFERER, 'http://51job.com/');
// 对认证证书来源的检查
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
// 从证书中检查SSL加密算法是否存在
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
//执行并获取HTML文档内容
$output = curl_exec($ch);
//释放curl句柄
curl_close($ch);

//利用成功登录cookie数据访问首页
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, 'http://www.51job.com');
curl_setopt($ch2, CURLOPT_HEADER, 0);
// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 0);
// 运行cURL,请求网页
curl_setopt($ch2, CURLOPT_COOKIEFILE,$cookie_file);
$data = curl_exec($ch2);
curl_close($ch2);
var_dump($data);
?>

两点需要注意
1.需要指定cookie存放的路径,确保目录存在;
2.由于51job登录采用的https协议,需要设置

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
此条目发表在PHP分类目录。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>