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 采集心得技巧
May 15 PHP
PHP程序开发范例学习之表单 获取文本框的值
Aug 08 PHP
PHP类与对象中的private访问控制的疑问
Nov 01 PHP
php中session与cookie的比较
Jan 27 PHP
php使用ob_flush不能每隔一秒输出原理分析
Jun 02 PHP
php简单生成随机数的方法
Jul 30 PHP
Yii2 rbac权限控制操作步骤实例教程
Apr 29 PHP
php微信浏览器分享设置以及回调详解
Aug 01 PHP
ThinkPHP中session函数详解
Sep 14 PHP
PHP实现十进制、二进制、八进制和十六进制转换相关函数用法分析
Apr 25 PHP
php实现生成PDF文件的方法示例【基于FPDF类库】
Jul 21 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 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实现singleton()单例模式实例
2014/11/06 PHP
php实现Mongodb自定义方式生成自增ID的方法
2015/03/23 PHP
jquery简单体验
2007/01/10 Javascript
JavaScript window.setTimeout() 的详细用法
2009/11/04 Javascript
简约JS日历控件 实例代码
2013/07/12 Javascript
node+express+ejs制作简单页面上手指南
2014/11/26 Javascript
jQuery中:submit选择器用法实例
2015/01/03 Javascript
ajax如何实现页面局部跳转与结果返回
2015/08/24 Javascript
使用jQuery获取data-的自定义属性
2015/11/10 Javascript
AngularJs学习第五篇从Controller控制器谈谈$scope作用域
2016/06/08 Javascript
js判断出两个字符串最大子串的函数实现方法
2016/11/01 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
2016/11/03 Javascript
AngularJS动态绑定ng-options的ng-model实例代码
2017/06/21 Javascript
React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)
2017/07/11 Javascript
JavaScript时间戳与时间日期间相互转换
2017/12/11 Javascript
layui 对table中的数据进行转义的实例
2019/09/12 Javascript
ionic2.0双击返回键退出应用
2019/09/17 Javascript
基于 Vue 的 Electron 项目搭建过程图文详解
2020/07/22 Javascript
[34:39]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第二局
2016/03/05 DOTA
一个检测OpenSSL心脏出血漏洞的Python脚本分享
2014/04/10 Python
python中numpy基础学习及进行数组和矢量计算
2017/02/12 Python
Python语言生成水仙花数代码示例
2017/12/18 Python
python 模拟银行转账功能过程详解
2019/08/06 Python
Python实现栈和队列的简单操作方法示例
2019/11/29 Python
jupyter note 实现将数据保存为word
2020/04/14 Python
Python tempfile模块生成临时文件和临时目录
2020/09/30 Python
python实现快速文件格式批量转换的方法
2020/10/16 Python
python palywright库基本使用
2021/01/21 Python
Lookfantastic挪威官网:英国知名美妆购物网站
2017/07/26 全球购物
Omio葡萄牙:全欧洲低价大巴、火车和航班搜索和比价
2019/02/09 全球购物
澳大利亚礼品卡商店:Gift Card Store
2019/06/24 全球购物
PHP如何调用MYSQL存储过程
2014/05/30 面试题
纪律教育月活动总结
2014/08/26 职场文书
新教师教学工作总结
2015/08/12 职场文书
大学生自我鉴定怎么写
2019/05/07 职场文书
浅谈sql_@SelectProvider及使用注意说明
2021/08/04 Java/Android