[PHP自动化-进阶]002.CURL模拟登录带有验证码的网站
引言:继前文《模拟登录并采集数据》,大家似乎看不过瘾,这会再出一发,模拟实现带验证码网站的登录。
这篇文章主要介绍了PHP使用CURL实现对带有验证码的网站进行模拟登录的方法,可以帮助读者加深对CURL操作的理解与应用,需要的朋友可以参考下。
网上的很多模拟登录程序,大都是通过服务程序Apache之类的运行,获取到验证码之后显示在网页上,然后填上再POST出去,这样虽然看起来很友好,但是既然模拟登录,登录后所干的事情就不一定是短时间完成的,所以这就要受到php最大执行时间的限制,而且有些操作还有可能权限不足。
本文提供了一个程序实例,思路就是获取到验证码之后把验证码存储为一个图片,然后程序休眠20秒,在20秒之内由用户手动查看图片,并把验证码填写到code.txt文件中,20秒休眠完成后,程序会读code.txt的验证码,这样再带着验证码进行登录操作。
简单,恶心,粗鲁,粗暴……。

切入主题
下面直接上高清代码,:)。
///////////////
// 初始化变量
///////////////
// 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,开始做你想做的事吧。。。。。
未完待续……。

本站文章为宝宝巴士 SD.Team原创,转载务必在明显处注明:(作者官方网站:宝宝巴士)
转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4791957.html
[PHP自动化-进阶]002.CURL模拟登录带有验证码的网站的更多相关文章
- php使用curl模拟登录带验证码的网站[开发篇]
需求是这样的,需要登录带验证码的网站,获取数据,但是不可能人为一直去记录数据,想通过自动采集的方式进行,如下是试验出来的结果代码!有需要的可以参考下! <?php namespace Home\ ...
- php使用curl模拟登录带验证码的网站
需求是这样的,需要登录带验证码的网站,获取数据,但是不可能人为一直去记录数据,想通过自动采集的方式进行,如下是试验出来的结果代码!有需要的可以参考下! <?php namespace Home\ ...
- C# 利用 HttpWebRequest 和 HttpWebResponse 模拟登录有验证码的网站
原文:C# 利用 HttpWebRequest 和 HttpWebResponse 模拟登录有验证码的网站 我们经常会碰到需要程序模拟登录一个网站,那如果网站需要填写验证码的要怎样模拟登录呢?这篇文章 ...
- [PHP自动化-进阶]001.CURL模拟登录并采集数据
引言:PHP可以通过libcurl实现模拟登录,提交数据,违法乱纪,烧杀抢虐等等事项. 简单说明一下"libcurl",补一下脑: libcurl目前支持http.https.ft ...
- PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
网上的很多模拟登录程序,大都是通过服务程序apache之类的运行,获取到验证码之后显示在网页上,然后填上再POST出去,这样虽然看起来很友 好,但是既然模拟登录,登录后所干的事情就不一定是短时间完成的 ...
- php curl模拟登录(半转载)
参考:http://our2848884.blog.163.com/blog/static/146854834201282039334/ php curl模拟登录 参考:http://blog.c ...
- php_curl模拟登录有验证码实例
<?php/** * @author 追逐__something * @version $id */define('SCRIPT_ROOT',dirname(__FILE__).'/');$ac ...
- (转)php_curl模拟登录有验证码实例
三年来的第一篇博客,还记得那是一个夜深人静的夜晚, 独自一人坐在不到10平米的小屋里,指头迅速的敲打着键盘,这天真TMD热.BJ生活啊. 唉! 最近一直在参加一个论坛批量发帖的项目开发. 模拟登录,模 ...
- Java模拟登录带验证码的教务系统(原理详解)
一:原理 客户端访问服务器,服务器通过Session对象记录会话,服务器可以指定一个唯一的session ID作为cookie来代表每个客户端,用来识别这个客户端接下来的请求. 我们通过Chrome浏 ...
随机推荐
- 在Windows中快速配置vim
vim原本是在Linux中的编辑器,如果使用熟练写代码速度可以远高于其它编辑器 当然很多OI比赛也会要求在Linux中进行 然而: 想学Linux,首先要有一个Linux,但有了Linux,这个直播间 ...
- unittest 管理接口用例(数据分离-读取excel)
1.公共模块 ---> login.xls """ common (package) ---> ReadFile.py """ ...
- libevent(四)event_base 2
接上文libevent(三)event_base event_io_map event_list是双向链表,min_heap是小根堆,那event_io_map是什么呢? #ifdef WIN32 # ...
- ASP.NET Core MVC 如何获取请求的参数
一次HTTP请求,就是一次标准IO操作.请求是I,是输入:响应式O,是输出.任何web开发框架,其实都是在干这两件事: 接受请求并进行解析获取参数 根据参数进行渲染并输出响应内容 所以我们学习一个框架 ...
- java读源码 之 queue源码分析(PriorityQueue,附图)
今天要介绍的是基础容器类(为了与并发容器类区分开来而命名的名字)中的另一个成员--PriorityQueue,它的大名叫做优先级队列,想必即使没有用过也该有所耳闻吧,什么?没..没听过?emmm... ...
- 【Hadoop离线基础总结】oozie任务串联
目录 需求 1.准备工作目录 2.准备调度文件 3.开发调度的配置文件 4.上传资源文件夹到hdfs对应路径 5.执行调度任务 需求 执行shell脚本 → 执行MR程序 → 执行hive程序 1.准 ...
- Day_10【常用API】扩展案例2_获取输入日期是哪一年的哪一天的星期几
分析以下需求,并用代码实现 1)已知日期字符串:"2015-10-20",将改日期字符串转换为日期对象 2)将(1)中的日期对象转换为日历类的对象 3)根据日历对象获取改日期是星期 ...
- 数据结构——ArrayList的源码分析(你所有的疑问,都会被解答)
一.首先来看一下ArrayList的类图: 1,实现了RandomAccess接口,可以达到随机访问的效果. 2,实现了Serializable接口,可以用来序列化或者反序列化. 3,实现了List接 ...
- [hdu5351]找规律,大整数模板
题意:f(1)="a",f(2)="b",f(i)=f(i-1)+f(i-2),"+"表示连接符.给定n,m,求f(n)的前m个字符的“ne ...
- SpringBoot基础实战系列(二)springboot解析json与HttpMessageConverter
SpringBoot解析Json格式数据 @ResponseBody 注:该注解表示前端请求后端controller,后端响应请求返回 json 格式数据前端,实质就是将java对象序列化 1.创建C ...