引言:继前文《模拟登录并采集数据》,大家似乎看不过瘾,这会再出一发,模拟实现带验证码网站的登录。

这篇文章主要介绍了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模拟登录带有验证码的网站的更多相关文章

  1. php使用curl模拟登录带验证码的网站[开发篇]

    需求是这样的,需要登录带验证码的网站,获取数据,但是不可能人为一直去记录数据,想通过自动采集的方式进行,如下是试验出来的结果代码!有需要的可以参考下! <?php namespace Home\ ...

  2. php使用curl模拟登录带验证码的网站

    需求是这样的,需要登录带验证码的网站,获取数据,但是不可能人为一直去记录数据,想通过自动采集的方式进行,如下是试验出来的结果代码!有需要的可以参考下! <?php namespace Home\ ...

  3. C# 利用 HttpWebRequest 和 HttpWebResponse 模拟登录有验证码的网站

    原文:C# 利用 HttpWebRequest 和 HttpWebResponse 模拟登录有验证码的网站 我们经常会碰到需要程序模拟登录一个网站,那如果网站需要填写验证码的要怎样模拟登录呢?这篇文章 ...

  4. [PHP自动化-进阶]001.CURL模拟登录并采集数据

    引言:PHP可以通过libcurl实现模拟登录,提交数据,违法乱纪,烧杀抢虐等等事项. 简单说明一下"libcurl",补一下脑: libcurl目前支持http.https.ft ...

  5. PHP使用CURL实现对带有验证码的网站进行模拟登录的方法

    网上的很多模拟登录程序,大都是通过服务程序apache之类的运行,获取到验证码之后显示在网页上,然后填上再POST出去,这样虽然看起来很友 好,但是既然模拟登录,登录后所干的事情就不一定是短时间完成的 ...

  6. php curl模拟登录(半转载)

    参考:http://our2848884.blog.163.com/blog/static/146854834201282039334/   php curl模拟登录 参考:http://blog.c ...

  7. php_curl模拟登录有验证码实例

    <?php/** * @author 追逐__something * @version $id */define('SCRIPT_ROOT',dirname(__FILE__).'/');$ac ...

  8. (转)php_curl模拟登录有验证码实例

    三年来的第一篇博客,还记得那是一个夜深人静的夜晚, 独自一人坐在不到10平米的小屋里,指头迅速的敲打着键盘,这天真TMD热.BJ生活啊. 唉! 最近一直在参加一个论坛批量发帖的项目开发. 模拟登录,模 ...

  9. Java模拟登录带验证码的教务系统(原理详解)

    一:原理 客户端访问服务器,服务器通过Session对象记录会话,服务器可以指定一个唯一的session ID作为cookie来代表每个客户端,用来识别这个客户端接下来的请求. 我们通过Chrome浏 ...

随机推荐

  1. 设置 Linux 支持中文

    1.首先在 command 输入 locale,可以看到 Linux 下默认的系统语言的是英文 2.vim ~/.bashrc 打开这个文件,该文件夹相当于系统配置文件 3.打开后,将后三行命令输入到 ...

  2. 面试中的volatile关键字

    在Java的面试当中,面试官最爱问的就是volatile关键字相关的内容.经过多次面试之后,你是否思考过,为什么他们那么爱问volatile关键字相关的问题?而对于你,如果作为面试官,是否也会考虑采用 ...

  3. EI检索

    第一步: 网址:http://www.elsevier.com/online-tools/engineering-village 第二步: 网址:http://www.engineeringvilla ...

  4. 第一章 Windows内核概述

    第一章 Windows内核概述 这一章节描述了Windows内核知识中最重要的几个概念,这些话题在这本书之后会有更详细的描述,那些会与当前的主题密切相关.要确保你理解这个章节的概念,因为这些概念构成了 ...

  5. ssh chroot 设置

    目的 让特定的用户登录linux服务器后,对其操作权限进行限制: 不能使用任何方式杀掉服务器现有的进程 最好只能查看相关的目录和文件 最好只能运行特定的命令,比如cat.ls.tail等 场景模拟 一 ...

  6. Javascript模块化编程-require.js

    转自:https://www.cnblogs.com/digdeep/p/4607131.html Javascript模块化编程(一):模块的写法 随着网站逐渐变成"互联网应用程序&quo ...

  7. CODING 敏捷实战系列课第四讲:从头搭建持续集成 DevOps 流水线

    <从头搭建持续集成 DevOps 流水线>由资深敏捷教练.极限编程学院高级讲师.CODING 特邀敏捷顾问李小波老师主讲,将基于 CODING 展示如何编写 Jenkinsfile 搭建 ...

  8. 前端组件:支持多选,支持选项筛选的下拉框选择器(基于Jquery和Bootstrap)

    效果图一:多选 效果图二:选项筛选 最后奉献源码,复制出来直接可用 <!DOCTYPE html> <html> <head> <meta charset=& ...

  9. java基础序--列化和反序列化

    一.什么是序列化和反序列化: 序列化:是指把java堆内存中的对象转换成字节(二进制流)的过程.也就是通过某种方式将java对象存储在磁盘内存中,这个过程称为序列化 反序列化:是把磁盘上的对象转恢复成 ...

  10. 改进Page Object公共方法封装(base_page)

    import os from time import sleep from selenium import webdriver from selenium.webdriver.common.by im ...