[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
线程

相关文章
相关标签/搜索