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+java实现自动新闻滚动窗口
Oct 09 PHP
dedecms系统的广告设置代码 基础版本
Apr 09 PHP
PHP 加密解密内部算法
Apr 22 PHP
PHP 图片上传实现代码 带详细注释
Apr 29 PHP
Yii 快速,安全,专业的PHP框架
Sep 03 PHP
完美实现wordpress禁止文章修订和自动保存的方法
Nov 03 PHP
php无限极分类递归排序实现方法
Nov 11 PHP
php匹配字符中链接地址的方法
Dec 22 PHP
PHP开发注意事项总结
Feb 04 PHP
Laravel中为什么不使用blpop取队列详析
Aug 01 PHP
Yii框架where查询用法实例分析
Oct 22 PHP
详解Laravel服务容器的优势
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
SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
2012/06/17 PHP
PHP微信开发之二维码生成类
2015/06/26 PHP
PHP实现文件上传与下载实例与总结
2016/03/13 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
PHP+ajax实现二级联动菜单功能示例
2018/08/10 PHP
PHP中Session ID的实现原理实例分析
2019/08/17 PHP
深入理解JavaScript系列(13) This? Yes,this!
2012/01/18 Javascript
『jQuery』取指定url格式及分割函数应用
2013/04/22 Javascript
JavaScript实现点击单元格改变背景色的方法
2016/02/12 Javascript
AngularJS中的包含详细介绍及实现示例
2016/07/28 Javascript
详解nodejs模板引擎制作
2017/06/14 NodeJs
nodejs 子进程正确的打开方式
2017/07/03 NodeJs
Vue源码学习之初始化模块init.js解析
2017/11/02 Javascript
js构造函数创建对象是否加new问题
2018/01/22 Javascript
vue中vee validate表单校验的几种基本使用
2018/06/25 Javascript
解决vue select当前value没有更新到vue对象属性的问题
2018/08/30 Javascript
Vue 3.x+axios跨域方案的踩坑指南
2019/07/04 Javascript
JS实现无限轮播无倒退效果
2020/09/21 Javascript
Javascript文本框脚本实现方法解析
2020/10/30 Javascript
python处理按钮消息的实例详解
2017/07/11 Python
django限制匿名用户访问及重定向的方法实例
2018/02/07 Python
浅谈python连续赋值可能引发的错误
2018/11/10 Python
Python计算时间间隔(精确到微妙)的代码实例
2019/02/26 Python
python对XML文件的操作实现代码
2020/03/27 Python
详解Python爬虫爬取博客园问题列表所有的问题
2021/01/18 Python
应聘医学检验人员自荐信
2013/09/27 职场文书
社区活动邀请函范文
2014/01/29 职场文书
《囚绿记》教学反思
2014/03/01 职场文书
廉洁使者实施方案
2014/03/29 职场文书
《鹬蚌相争》教学反思
2014/04/22 职场文书
银行柜员与客户起冲突检讨书
2014/09/27 职场文书
起诉离婚协议书样本
2014/11/25 职场文书
离婚协议书怎么写的
2014/12/14 职场文书
西湖英语导游词
2015/02/06 职场文书
责任书范本大全
2015/05/11 职场文书
2016年党员创先争优公开承诺书
2016/03/25 职场文书