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之第五天
Oct 09 PHP
php中判断字符串是否全是中文或含有中文的实现代码
Sep 16 PHP
解决FastCGI 进程超过了配置的活动超时时限的问题
Jul 03 PHP
php无限极分类递归排序实现方法
Nov 11 PHP
php数组查找函数总结
Nov 18 PHP
ThinkPHP添加更新标签的方法
Dec 05 PHP
php实现utf-8转unicode函数分享
Jan 06 PHP
Laravel 5 框架入门(二)构建 Pages 的管理功能
Apr 09 PHP
学习php设计模式 php实现状态模式
Dec 07 PHP
ThinkPHP中where()使用方法详解
Apr 19 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
Mar 29 PHP
PHP生成随机密码4种方法及性能对比
Dec 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
从零开始学YII2框架(四)扩展插件yii2-kartikgii
2014/08/20 PHP
php实现cookie加密的方法
2015/03/10 PHP
使用正则去除php代码中的注释方法
2016/11/03 PHP
php读取和保存base64编码的图片内容
2017/04/22 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
PHP工厂模式、单例模式与注册树模式实例详解
2019/06/03 PHP
在网页里看flash的trace数据的js类
2009/01/10 Javascript
javascript+iframe 实现无刷新载入整页的代码
2010/03/17 Javascript
javascript开发中因空格引发的错误
2010/11/08 Javascript
jquery操作select详解(取值,设置选中)
2014/02/07 Javascript
用console.table()调试javascript
2014/09/04 Javascript
js中hash和ico的关联分析
2015/02/05 Javascript
smartcrop.js智能图片裁剪库
2015/10/14 Javascript
JS如何设置cookie有效期为当天24点并弹出欢迎登陆界面
2016/08/04 Javascript
在vue项目中使用sass的配置方法
2018/03/20 Javascript
JavaScript中join()、splice()、slice()和split()函数用法示例
2018/08/24 Javascript
js隐式转换的知识实例讲解
2018/09/28 Javascript
vuejs+element UI table表格中实现禁用部分复选框的方法
2019/09/20 Javascript
对Layer弹窗使用及返回数据接收的实例详解
2019/09/26 Javascript
vue3+typeScript穿梭框的实现示例
2020/12/29 Vue.js
python实现提取百度搜索结果的方法
2015/05/19 Python
win10系统下Anaconda3安装配置方法图文教程
2018/09/19 Python
对python内置map和six.moves.map的区别详解
2018/12/19 Python
用Python将结果保存为xlsx的方法
2019/01/28 Python
在django admin中配置搜索域是一个外键时的处理方法
2020/05/20 Python
HTML5 canvas画矩形时出现边框样式不一致的解决方法
2013/10/14 HTML / CSS
奥地利网上现代灯具和灯饰店:Lampenwelt.at
2018/01/29 全球购物
屈臣氏马来西亚官网:Watsons马来西亚
2019/06/15 全球购物
大专学生推荐信范文
2013/11/19 职场文书
秋季运动会表扬稿
2014/01/16 职场文书
质量承诺书怎么写
2014/05/24 职场文书
奶茶店创业计划书
2014/08/14 职场文书
超级礼物观后感
2015/06/15 职场文书
四大名著读书笔记
2015/06/25 职场文书
2016大学迎新欢迎词
2015/09/29 职场文书
Linux7.6二进制安装Mysql8.0.27详细操作步骤
2021/11/27 MySQL