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获得文件扩展名三法
Nov 25 PHP
基于PHP遍历数组的方法汇总分析
Jun 08 PHP
destoon在360浏览器下出现用户被强行注销的解决方法
Jun 26 PHP
php中注册器模式类用法实例分析
Nov 03 PHP
Yii2实现自定义独立验证器的方法
May 05 PHP
Laravel框架实现的记录SQL日志功能示例
Jun 19 PHP
PHP数据对象映射模式实例分析
Mar 29 PHP
laravel 实现向公共模板中传值 (view composer)
Oct 22 PHP
Laravel Eloquent分表方法并使用模型关联的实现
Nov 25 PHP
PHP网页缓存技术优点及代码实例
Jul 29 PHP
php如何实现数据库的备份和恢复
Nov 30 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验证码类
2016/05/15 PHP
php伪静态验证码不显示的解决方案
2019/09/26 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
JS面向对象、prototype、call()、apply()
2009/05/14 Javascript
在JavaScript中监听IME键盘输入事件
2011/05/29 Javascript
JavaScript实现的购物车效果可以运用在好多地方
2014/05/09 Javascript
js图片卷帘门导航菜单特效代码分享
2015/09/10 Javascript
JavaScript实现仿淘宝商品购买数量的增减效果
2016/01/22 Javascript
JavaScript弹出对话框的三种方式
2016/03/23 Javascript
URL的参数中有加号传值变为空格的问题(URL特殊字符)
2016/11/04 Javascript
BootStrap3使用错误记录及解决办法
2016/12/22 Javascript
详谈js中window.location.search的用法和作用
2017/02/13 Javascript
ReactNative实现图片上传功能的示例代码
2017/07/11 Javascript
[js高手之路]图解javascript的原型(prototype)对象,原型链实例
2017/08/28 Javascript
Vue-cli 使用json server在本地模拟请求数据的示例代码
2017/11/02 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(下)
2018/04/18 Javascript
js与jQuery实现获取table中的数据并拼成json字符串操作示例
2018/07/12 jQuery
详解vue中使用protobuf踩坑记
2019/05/07 Javascript
vue中echarts的用法及与elementui-select的协同绑定操作
2020/11/17 Vue.js
Python如何抓取天猫商品详细信息及交易记录
2018/02/23 Python
Python实现购物车购物小程序
2018/04/18 Python
Python用csv写入文件_消除空余行的方法
2018/07/06 Python
使用tensorflow实现线性svm
2018/09/07 Python
使用 Python 实现简单的 switch/case 语句的方法
2018/09/17 Python
PyQt5 加载图片和文本文件的实例
2019/06/14 Python
python3在同一行内输入n个数并用列表保存的例子
2019/07/20 Python
对pytorch中的梯度更新方法详解
2019/08/20 Python
Python工程师必考的6个经典面试题
2020/06/28 Python
深入浅析css3 中display box使用方法
2015/11/25 HTML / CSS
含精油的天然有机化妆品:Indemne
2019/08/27 全球购物
家长评语大全
2014/01/22 职场文书
投资合作协议书范本
2014/04/17 职场文书
反四风个人对照检查材料
2014/09/26 职场文书
如何利用map实现Nginx允许多个域名跨域
2021/03/31 Servers
JavaScript的Set数据结构详解
2022/02/18 Javascript
Redis 异步机制
2022/05/15 Redis