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 相关文章推荐
浅谈Windows下 PHP4.0与oracle 8的连接设置
Oct 09 PHP
php多个字符串替换成同一个的解决方法
Jun 18 PHP
PHP闭包实例解析
Sep 08 PHP
php实现分页显示
Nov 03 PHP
在PHP中使用FastCGI解析漏洞及修复方案
Nov 10 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
Dec 14 PHP
解决ThinkPHP下使用上传插件Uploadify浏览器firefox报302错误的方法
Dec 18 PHP
php socket通信简单实现
Nov 18 PHP
[原创]PHPCMS遭遇会员投稿审核无效的解决方法
Jan 11 PHP
php + nginx项目中的权限详解
May 23 PHP
php读取出一个文件夹及其子文件夹下所有文件的方法示例
Jun 15 PHP
PHP实现用户登录的案例代码
May 10 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
php编写一个简单的路由类
2011/04/13 PHP
用php实现选择排序的解决方法
2013/05/04 PHP
写一段简单的PHP建立文件夹代码
2015/01/06 PHP
PHP中isset与array_key_exists的区别实例分析
2015/06/02 PHP
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
2019/05/23 PHP
addRule在firefox下的兼容写法
2006/11/30 Javascript
javascript 多级checkbox选择效果
2009/08/20 Javascript
js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS
2013/11/18 Javascript
基于jquery固定于顶部的导航响应浏览器滚动条事件
2014/11/02 Javascript
jQuery插件slider实现拖动滑块选取价格范围
2015/04/30 Javascript
js鼠标点击按钮切换图片-图片自动切换-点击左右按钮切换特效代码
2015/09/02 Javascript
Bootstrap Search Suggest使用例子
2016/12/21 Javascript
JS拉起或下载app的实现代码
2017/02/22 Javascript
网页中的图片查看器viewjs使用方法
2017/07/11 Javascript
JS实现简易留言板(节点操作)
2020/03/16 Javascript
[01:52]2014DOTA2西雅图邀请赛 V社开大会你不知道的小秘密
2014/07/08 DOTA
[58:18]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Mineski
2018/03/30 DOTA
python调用cmd复制文件代码分享
2013/12/27 Python
举例讲解Python程序与系统shell交互的方式
2015/04/09 Python
Python3使用pandas模块读写excel操作示例
2018/07/03 Python
python求质数的3种方法
2018/09/28 Python
对numpy中二进制格式的数据存储与读取方法详解
2018/11/01 Python
使用python3实现操作串口详解
2019/01/01 Python
flask框架路由常用定义方式总结
2019/07/23 Python
一行Python代码过滤标点符号等特殊字符
2019/08/12 Python
用python爬取历史天气数据的方法示例
2019/12/30 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
2020/04/24 Python
印度在线购买电子产品网站:Croma
2020/01/02 全球购物
存储过程的优缺点是什么
2015/01/10 面试题
岗位职责的含义
2013/11/17 职场文书
《闻一多先生的说和做》教学反思
2014/04/28 职场文书
租车协议书范本2014
2014/11/17 职场文书
2014年建筑工程工作总结
2014/12/03 职场文书
律政俏佳人观后感
2015/06/09 职场文书
隐形的翅膀观后感
2015/06/10 职场文书
评估“风险”创业计划的几大要点
2019/08/12 职场文书