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


Posted in PHP onJuly 23, 2014

网上的很多模拟登录程序,大都是通过服务程序apache之类的运行,获取到验证码之后显示在网页上,然后填上再POST出去,这样虽然看起来很友好,但是既然模拟登录,登录后所干的事情就不一定是短时间完成的,所以这就要受到php最大执行时间的限制,而且有些操作还有可能权限不足。

本文提供了一个程序实例,思路就是获取到验证码之后把验证码存储为一个图片,然后程序休眠20秒,在20秒之后由用户手动查看图片,并把验证码填写到code.txt文件中,20秒休眠完成后,程序会读code.txt的验证码,这样再带着验证码进行登录操作。具体代码如下:

/**
 * 模拟登录
 */

//初始化变量
$cookie_file = "tmp.cookie";
$login_url = "http://xxx.com/logon.php";
$verify_code_url = "http://xxx.com/verifyCode.php";

echo "正在获取COOKIE...\n";
$curlj = curl_init();
$timeout = 5;
curl_setopt($curl, CURLOPT_URL, $login_url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($curl,CURLOPT_COOKIEJAR,$cookie_file); //获取COOKIE并存储
$contents = curl_exec($curl);
curl_close($curl);

echo "COOKIE获取完成,正在取验证码...\n";
//取出验证码
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $verify_code_url);
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$img = curl_exec($curl);
curl_close($curl);

$fp = fopen("verifyCode.jpg","w");
fwrite($fp,$img);
fclose($fp);
echo "验证码取出完成,正在休眠,20秒内请把验证码填入code.txt并保存\n";
//停止运行20秒
sleep(20);

echo "休眠完成,开始取验证码...\n";
$code = file_get_contents("code.txt");
echo "验证码成功取出:$code\n";
echo "正在准备模拟登录...\n";

$post = "username=maben&pwd=hahahaha&verifycode=$code";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file);
$result=curl_exec($curl);
curl_close($curl);

//这一块根据自己抓包获取到的网站上的数据来做判断
if(substr_count($result,"登录成功")){
 echo "登录成功\n";
}else{
 echo "登录失败\n";
 exit;
}

//OK,开始做你想做的事吧。。。。。
PHP 相关文章推荐
PHP开发入门教程之面向对象
Dec 05 PHP
PHP 上传文件大小限制
Jul 05 PHP
网页游戏开发入门教程三(简单程序应用)
Nov 02 PHP
php park、unpark、ord 函数使用方法(二进制流接口应用实例)
Oct 19 PHP
php设计模式 Command(命令模式)
Jun 26 PHP
php5.5新数组函数array_column使用
Jul 08 PHP
PHP获取中英混合字符串长度的方法
Jun 07 PHP
Fedora下安装php Redis扩展笔记
Sep 03 PHP
使用GDB调试PHP代码,解决PHP代码死循环问题
Mar 02 PHP
php生成图片缩略图的方法
Apr 07 PHP
PHP构造函数与析构函数用法示例
Sep 28 PHP
基于Laravel(5.4版本)的基本增删改查操作方法
Oct 11 PHP
Yii使用CLinkPager分页实例详解
Jul 23 #PHP
ThinkPHP单字母函数(快捷方法)使用总结
Jul 23 #PHP
PHP中的use关键字概述
Jul 23 #PHP
ThinkPHP实现将SESSION存入MYSQL的方法
Jul 22 #PHP
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
Jul 22 #PHP
ThinkPHP权限认证Auth实例详解
Jul 22 #PHP
ThinkPHP行为扩展Behavior应用实例详解
Jul 22 #PHP
You might like
js下函数般调用正则的方法附代码
2008/06/22 PHP
2014过年倒计时示例
2014/01/31 PHP
smarty模板中拼接字符串的方法
2014/02/14 PHP
PHP中可以自动分割查询字符的Parse_str函数使用示例
2014/07/25 PHP
PHP屏蔽过滤指定关键字的方法
2014/11/03 PHP
php获取QQ头像并显示的方法
2014/12/23 PHP
Zend Framework入门教程之Zend_Db数据库操作详解
2016/12/08 PHP
php实现支持中文的文件下载功能示例
2017/08/30 PHP
js png图片(有含有透明)在IE6中为什么不透明了
2010/02/07 Javascript
关于jquery的多个选择器的使用示例
2013/10/18 Javascript
使用jquery中height()方法获取各种高度大全
2014/04/02 Javascript
实例详解jQuery表单验证插件validate
2016/01/18 Javascript
深入浅析jQuery对象$.html
2016/08/22 Javascript
Angular.js项目中使用gulp实现自动化构建以及压缩打包详解
2017/07/19 Javascript
JavaScript实现离开页面前提示功能【附jQuery实现方法】
2017/09/26 jQuery
js实现关闭网页出现是否离开提示
2017/12/07 Javascript
[14:24]Optic Gaming vs PSG LGD BO3
2018/06/07 DOTA
比较详细Python正则表达式操作指南(re使用)
2008/09/06 Python
全面解析Python的While循环语句的使用方法
2015/10/13 Python
python 实现红包随机生成算法的简单实例
2017/01/04 Python
Android基于TCP和URL协议的网络编程示例【附demo源码下载】
2018/01/23 Python
python打包生成的exe文件运行时提示缺少模块的解决方法
2018/10/31 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
2019/08/17 Python
Pytorch中的VGG实现修改最后一层FC
2020/01/15 Python
tf.concat中axis的含义与使用详解
2020/02/07 Python
Python爬虫入门教程01之爬取豆瓣Top电影
2021/01/24 Python
优秀交警事迹材料
2014/01/26 职场文书
葬礼司仪主持词
2014/03/31 职场文书
党员自我对照检查材料
2014/08/19 职场文书
民族学专业职业生涯规划范文:积跬步以至千里
2014/09/11 职场文书
2014法院四风问题对照检查材料思想汇报
2014/10/04 职场文书
教师个人自我评价
2015/03/04 职场文书
农业项目合作意向书
2015/05/08 职场文书
入团介绍人意见范文
2015/06/04 职场文书
2015年高三毕业班班主任工作总结
2015/10/22 职场文书
ThinkPHP5和ThinkPHP6的区别
2021/03/31 PHP