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
用cookies来跟踪识别用户
Oct 09 PHP
简单的用PHP编写的导航条程序
Oct 09 PHP
php采集速度探究总结(原创)
Apr 18 PHP
PHP XML数据解析代码
May 26 PHP
利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法
Dec 19 PHP
CI(CodeIgniter)框架中的增删改查操作
Jun 10 PHP
浅谈ThinkPHP的URL重写
Nov 25 PHP
PHP中使用hidef扩展代替define提高性能
Apr 09 PHP
PHP解密Unicode及Escape加密字符串
May 17 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
Dec 21 PHP
thinkPHP框架乐观锁和悲观锁实例分析
Oct 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 无法加载mysql的module的时候的配置的解决方案引发的思考
2012/01/27 PHP
解析php session_set_save_handler 函数的用法(mysql)
2013/06/29 PHP
PHP随机生成唯一HASH值自定义函数
2015/04/20 PHP
FastCGI 进程意外退出造成500错误
2015/07/26 PHP
Laravel如何实现自动加载类
2019/10/14 PHP
Laravel框架中集成MongoDB和使用详解
2019/10/17 PHP
Jquery 实现Tab效果 思路是js思路
2010/03/02 Javascript
js全屏显示显示代码的三种方法
2013/11/11 Javascript
Nodejs极简入门教程(三):进程
2014/10/27 NodeJs
AngularJS实现DOM元素的显示与隐藏功能
2016/11/22 Javascript
jstree的简单实例
2016/12/01 Javascript
EasyUi 打开对话框后控件赋值及赋值后不显示的问题解决办法
2017/01/19 Javascript
xmlplus组件设计系列之文本框(TextBox)(3)
2017/05/03 Javascript
vue中slot(插槽)的介绍与使用
2018/11/12 Javascript
小程序的上传文件接口的注意要点解析
2019/09/17 Javascript
微信小程序如何实现radio单选框单击打勾和取消
2020/01/21 Javascript
浅谈vue权限管理实现及流程
2020/04/23 Javascript
利用PHP实现递归删除链表元素的方法示例
2020/10/23 Javascript
[15:28]DOTA2 HEROS教学视频教你分分钟做大人-剧毒术士
2014/06/13 DOTA
使用Python开发SQLite代理服务器的方法
2018/12/07 Python
解决python xlrd无法读取excel文件的问题
2018/12/25 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
2019/02/18 Python
Python3实现的反转单链表算法示例
2019/03/08 Python
python实现kmp算法的实例代码
2019/04/03 Python
Python Django中间件,中间件函数,全局异常处理操作示例
2019/11/08 Python
Python性能分析工具py-spy原理用法解析
2020/07/27 Python
莫斯科珠宝厂官方网站:Miuz
2020/09/19 全球购物
英国户外服装、鞋类和设备的领先零售商:Millets
2020/10/12 全球购物
体育教学随笔感言
2014/02/24 职场文书
安全承诺书范文
2014/03/26 职场文书
教师爱岗敬业演讲稿
2014/05/05 职场文书
学生会干部自我鉴定2014
2014/09/18 职场文书
毕业论文指导教师评语
2014/12/30 职场文书
百家讲坛观后感
2015/06/12 职场文书
员工升职自我评价
2019/03/26 职场文书
PostgreSQL数据库去除重复数据和运算符的基本查询操作
2022/04/12 PostgreSQL