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 相关文章推荐
支持oicq头像的留言簿(二)
Oct 09 PHP
生成静态页面的PHP类
Nov 25 PHP
对象失去焦点时自己动提交数据的实现代码
Nov 06 PHP
php中防止SQL注入的最佳解决方法
Apr 25 PHP
PHP 面向对象程序设计(oop)学习笔记 (四) - 异常处理类Exception
Jun 12 PHP
ThinkPHP之A方法实例讲解
Jun 20 PHP
php上传图片生成缩略图(GD库)
Jan 06 PHP
laravel中的错误与日志用法详解
Jul 26 PHP
基于php实现的验证码小程序
Dec 13 PHP
[原创]PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
Jul 12 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 27 PHP
PHP+Mysql分布式事务与解决方案深入理解
Feb 27 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
3款值得推荐的微信开发开源框架
2014/10/28 PHP
ecshop 2.72如何修改后台访问地址
2015/03/03 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
CI(CodeIgniter)框架中URL特殊字符处理与SQL注入隐患分析
2019/02/28 PHP
asp批量修改记录的代码
2008/06/25 Javascript
javascript预览上传图片发现的问题的解决方法
2010/11/25 Javascript
jQuery+css实现图片滚动效果(附源码)
2013/03/18 Javascript
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
2014/11/20 NodeJs
jQueryMobile之Helloworld与页面切换的方法
2015/02/04 Javascript
Nodejs全局安装和本地安装的不同之处
2016/07/04 NodeJs
AngularJS基础 ng-hide 指令用法及示例代码
2016/08/01 Javascript
Ionic2调用本地SQlite实例
2017/04/22 Javascript
vue.js中实现登录控制的方法示例
2018/04/23 Javascript
详解Vue改变数组中对象的属性不重新渲染View的解决方案
2018/09/21 Javascript
JSON基本语法及与JavaScript的异同实例分析
2019/01/04 Javascript
layer弹出层扩展主题的方法
2019/09/11 Javascript
pycharm 使用心得(三)Hello world!
2014/06/05 Python
Python2.x与Python3.x的区别
2016/01/14 Python
尝试用最短的Python代码来实现服务器和代理服务器
2016/06/23 Python
详解Python在七牛云平台的应用(一)
2017/12/05 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
python GUI库图形界面开发之PyQt5表格控件QTableView详细使用方法与实例
2020/03/01 Python
基于python实现图片转字符画代码实例
2020/09/04 Python
Pytorch生成随机数Tensor的方法汇总
2020/09/09 Python
Python通过fnmatch模块实现文件名匹配
2020/09/30 Python
孝老爱亲模范事迹
2014/01/24 职场文书
《鸟岛》教学反思
2014/04/26 职场文书
工厂搬迁方案
2014/05/11 职场文书
微电影大赛策划方案
2014/06/05 职场文书
暖通工程师岗位职责
2014/06/12 职场文书
小学亲子活动总结
2014/07/01 职场文书
市场调研项目授权委托书范本
2014/10/04 职场文书
健康状况证明模板
2014/10/23 职场文书
故意伤害辩护词
2015/05/21 职场文书
银行安全保卫工作总结
2015/08/10 职场文书