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语法(1)
Oct 09 PHP
PHP多线程抓取网页实现代码
Jul 22 PHP
php去除HTML标签实例
Nov 06 PHP
让ThinkPHP支持大小写url地址访问的方法
Oct 31 PHP
PHP封装的Twitter访问类实例
Jul 18 PHP
PHP实现XML与数据格式进行转换类实例
Jul 29 PHP
PHP中Session和Cookie是如何操作的
Oct 10 PHP
php 从指定数字中获取随机组合的简单方法(推荐)
Apr 05 PHP
thinkPHP框架RBAC实现原理分析
Feb 01 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
Mar 01 PHP
基于laravel Request的所有方法详解
Sep 29 PHP
PHP实现本地图片转base64格式并上传
May 29 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实现多条件查询实例代码
2010/07/17 PHP
PHP的MVC模式实现原理分析(一相简单的MVC框架范例)
2014/04/29 PHP
php 生成签名及验证签名详解
2016/10/26 PHP
laravel ORM 只开启created_at的几种方法总结
2018/01/29 PHP
从Ajax到JQuery Ajax学习
2007/02/14 Javascript
JavaScript 继承使用分析
2011/05/12 Javascript
Jquery带搜索框的下拉菜单
2013/05/06 Javascript
JavaScript执行顺序详细介绍
2013/12/04 Javascript
jquery.cookie() 方法的使用(读取、写入、删除)
2013/12/05 Javascript
js改变embed标签src值的方法
2015/04/10 Javascript
JavaScript自定义文本框光标
2017/03/05 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
2017/04/24 Javascript
JS实现的JSON序列化操作简单示例
2018/07/02 Javascript
这应该是最详细的响应式系统讲解了
2019/07/22 Javascript
基于JS判断对象是否是数组
2020/01/10 Javascript
JS表格的动态操作完整示例
2020/01/13 Javascript
js实现烟花特效
2020/03/02 Javascript
JavaScript实现Tab标签页切换的最简便方式(4种)
2020/06/28 Javascript
解决Vue @submit 提交后不刷新页面问题
2020/07/18 Javascript
vue 通过绑定事件获取当前行的id操作
2020/07/27 Javascript
Nodejs 微信小程序消息推送的实现
2021/01/20 NodeJs
python实现控制台打印的方法
2019/01/12 Python
Django Sitemap 站点地图的实现方法
2019/04/29 Python
python3 打印输出字典中特定的某个key的方法示例
2019/07/06 Python
python目标检测给图画框,bbox画到图上并保存案例
2020/03/10 Python
Python利用PyPDF2库获取PDF文件总页码实例
2020/04/03 Python
HTML5输入框下拉菜单功能的示例代码
2020/09/08 HTML / CSS
全球性的在线鞋类品牌:Public Desire
2019/04/03 全球购物
应届生求职简历的自我评价怎么写
2013/10/23 职场文书
校本教研工作制度
2014/01/22 职场文书
优秀教师的感人事迹
2014/02/04 职场文书
将相和教学反思
2014/02/04 职场文书
乡镇创先争优活动总结
2014/08/28 职场文书
学校元旦晚会开场白
2015/05/29 职场文书
Win11软件图标固定到任务栏
2022/04/19 数码科技
python如何为list实现find方法
2022/05/30 Python