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中文字母数字验证码实现代码
Apr 25 PHP
PHP访问MYSQL数据库封装类(附函数说明)
Dec 04 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-1 开始了解php
Jul 03 PHP
PHP5.4中json_encode中文转码的变化小结
Jan 30 PHP
laravel安装和配置教程
Oct 29 PHP
php简单防盗链实现方法
Jul 29 PHP
YII Framework框架教程之缓存用法详解
Mar 14 PHP
PHP实现表单提交时去除斜杠的方法
Dec 26 PHP
详解PHP中的序列化、反序列化操作
Mar 21 PHP
php魔法函数与魔法常量使用介绍
Jul 23 PHP
PHP基于Closure类创建匿名函数的方法详解
Aug 17 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
Nov 19 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实现找出有序数组中绝对值最小的数算法分析
2017/08/07 PHP
PHP数组去重的更快实现方式分析
2018/05/09 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
JavaScript中Array 对象相关的几个方法
2006/12/22 Javascript
对YUI扩展的Gird组件 Part-1
2007/03/10 Javascript
运用jquery实现table单双行不同显示并能单行选中
2009/07/25 Javascript
javascript textContent与innerText的异同分析
2010/10/22 Javascript
基于jQuery的计算文本框字数的代码
2012/06/06 Javascript
JS 控件事件小结
2012/10/31 Javascript
得到jQuery detach()后节点中的某个值实现代码
2013/02/05 Javascript
谈谈JavaScript中的函数与闭包
2013/04/14 Javascript
深入理解javaScript中的事件驱动
2013/05/21 Javascript
Javascript学习笔记之数组的构造函数
2014/11/23 Javascript
非jQuery实现照片散落桌子上,单击放大的LightBox效果
2014/11/28 Javascript
最流行的Node.js精简型和全栈型开发框架介绍
2015/02/26 Javascript
jQuery.each使用详解
2015/07/07 Javascript
jQuery validate验证插件使用详解
2016/05/11 Javascript
Jquery揭秘系列:ajax原生js实现详解(推荐)
2016/06/08 Javascript
AngularJS国际化详解及示例代码
2016/08/18 Javascript
原生JS:Date对象全面解析
2016/09/06 Javascript
简单实现Vue的observer和watcher
2016/12/21 Javascript
js实现PC端根据IP定位当前城市地理位置
2017/02/22 Javascript
使用vue构建移动应用实战代码
2017/08/02 Javascript
EasyUI创建人员树的实例代码
2017/09/15 Javascript
[01:56]无止竞 再出发——中国军团出征2017年DOTA2国际邀请赛
2017/07/05 DOTA
web.py中调用文件夹内模板的方法
2014/08/26 Python
使用pyecharts在jupyter notebook上绘图
2020/04/23 Python
python面向对象实现名片管理系统文件版
2019/04/26 Python
pytorch:实现简单的GAN示例(MNIST数据集)
2020/01/10 Python
详解Windows下PyCharm安装Numpy包及无法安装问题解决方案
2020/06/18 Python
农林经济管理专业自荐信
2014/09/01 职场文书
一份教室追逐打闹的检讨书
2014/09/27 职场文书
创业计划书之个人工作室
2019/08/22 职场文书
导游词之绍兴柯岩古镇
2020/01/09 职场文书
分析JVM源码之Thread.interrupt系统级别线程打断
2021/06/29 Java/Android
Go 语言结构实例分析
2021/07/04 Golang