php使用curl模拟登录带验证码的网站[开发篇]
需求是这样的,需要登录带验证码的网站,获取数据,但是不可能人为一直去记录数据,想通过自动采集的方式进行,如下是试验出来的结果代码!有需要的可以参考下!
<?php
namespace Home\Controller;
use Think\Controller;
class LoginController extends Controller
{
protected $cookieName = array('cookie_verify', 'cookie_verify');
protected $cookiePath = '/cookie/';
protected $cookiePathFile = array();
public function index()
{
$this->display();
}
public function _initialize(){
foreach($this->cookieName as $key => $name)
{
$this->cookiePathFile[] = ROOT_PATH . $this->cookiePath . $this->cookieName[$key] . '_xxx.txt';
}
} /**
* 登录xxx
*/
public function pc28Login()
{
$username = I('username');
$password = I('password');
$verifyCode = I('verify');
$loginData = array(
'__VIEWSTATE' => '/wEPDwUKMTU0MzAzOTU4NmQYAQUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgEFDExvZ2luX1N1Ym1pdL/yae69NsY163G3yuP0lxjz8oXu', //不把参数补全可能会不被响应哦
'__VIEWSTATEGENERATOR' => 'DC42DE27',
'txt_UserName' => $username,
'txt_PWD' => $password,
'txt_VerifyCode' => $verifyCode,
'SMONEY' => 'ABC',
'Login_Submit.x' => '52',
'Login_Submit.y' => '19',
);
$getBack = $this->_cookieRequest('http:///noLogin.aspx', $loginData, false, true);
if(preg_match('/<div[^\<div]*?id\s*=\s*[\'\"]{1}div_msg[\'\"]{1}.*?>(.*?)<\/div>/s', $getBack, $match)){
echo 'matched\r\n';
print_r($match);
}else{
echo $getBack, '<br />';
$paramsFull = parse_url($getBack);
parse_str($paramsFull['query'], $paramsFull['parsedQuery']);
if(!empty($paramsFull['parsedQuery']['Warn'])) {
$msg = "您好,欢迎来P,请先登录。";
switch ($paramsFull['parsedQuery']['Warn'])
{
case '2':
$msg = '您输入的验证码错误,请重试';
break;
case '3':
$msg = '该帐号不存在,还没帐号?';
break;
case '5':
$msg = '账户已注销';
break;
case '6':
$msg = '密码错误,如果连续错误3次半小时内不能登录!';
break;
case '20':
$msg = '今日密码错误3次及以上,请于半小时后再来登录!';
break;
case '21':
$msg = '今日您所在IP的所有帐号密码错误9次以上,请于半小时后再来登录!';
break;
case '22':
$msg = '登录失败,您所在IP今日登录的帐号过多!';
break;
case '23':
$msg = '登录失败,验证码失效!';
break;
case '32':
$msg = '该帐号已经绑定其他xx帐号!';
break;
case '33':
$msg = '一台电脑一天只能注册一个帐号!';
break;
}
$this->error($msg, '', 5);
}else{ $_SESSION['user_id'] = '123456'; //登录设置session
$this->success('登录P网站成功', U('Index/index'), 5);
}
}
} /**
* 获取验证码
*/
public function getVerifyCode()
{
$img = $this->_cookieRequest('http:///VerifyCode_Login.aspx?id=' . rand(10000,999999), null, true, 1);
echo $img;
} /**
* 删除cookie
*/
public function clearCookie()
{
for($i = 0; $i <count($this->cookieName); $i++)
{
setcookie($this->cookieName[$i], '', time() - 3600);
}
// unlink($this->cookiePathFile);
$this->success('清除cookie成功!');
} /**
* 带COOKIE的访问curl
* @param $url 访问地址
* @param bool|array $data 传递的数据
* @param bool $redirect 是否获取重定向的地址
* @param bool $isLogin 是否为登录,登录需要保存COOKIE
* @return mixed 地址或者返回内容
*/
public function _cookieRequest($url, $data = null, $redirect = false, $isLogin = false, $cookieNum = 0)
{ $ch = curl_init();
$params[CURLOPT_URL] = $url; //请求url地址
$params[CURLOPT_HEADER] = false; //是否返回响应头信息
$params[CURLOPT_RETURNTRANSFER] = true; //是否将结果返回
$params[CURLOPT_FOLLOWLOCATION] = true; //是否重定向
$params[CURLOPT_USERAGENT] = 'Mozilla/5.0 (Windows NT 5.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1'; if($data)
{
$params[CURLOPT_POST] = true;
$params[CURLOPT_POSTFIELDS] = http_build_query($data);
}
//判断是否有cookie,有的话直接使用
if (!empty($_COOKIE[$this->cookieName[$cookieNum]]) && is_file($this->cookiePathFile[$cookieNum]))
{
$params[CURLOPT_COOKIEFILE] = $this->cookiePathFile[$cookieNum]; //这里判断cookie if($isLogin)
{
$params[CURLOPT_COOKIEJAR] = $this->cookiePathFile[$cookieNum]; //写入cookie信息,可能每次都会有写入
}
}
else
{
// $cookie_jar = tempnam($cookie_path, 'cookie'); //产生一个cookie文件
$params[CURLOPT_COOKIEJAR] = $this->cookiePathFile[$cookieNum]; //写入cookie信息
setcookie($this->cookieName[$cookieNum], $this->cookiePathFile[$cookieNum], time() + 120); //保存cookie路径
}
curl_setopt_array($ch, $params); //传入curl参数
$content = curl_exec($ch);
$headers = curl_getinfo($ch);
// echo $content;
curl_close($ch);
if ($url != $headers["url"] && $redirect == false)
{
return $headers["url"];
}
return $content;
}
}
登录以后,就可以使用带cookie的访问其他页面了!
php使用curl模拟登录带验证码的网站[开发篇]的更多相关文章
- php使用curl模拟登录带验证码的网站
需求是这样的,需要登录带验证码的网站,获取数据,但是不可能人为一直去记录数据,想通过自动采集的方式进行,如下是试验出来的结果代码!有需要的可以参考下! <?php namespace Home\ ...
- [PHP自动化-进阶]002.CURL模拟登录带有验证码的网站
引言:继前文<模拟登录并采集数据>,大家似乎看不过瘾,这会再出一发,模拟实现带验证码网站的登录. 这篇文章主要介绍了PHP使用CURL实现对带有验证码的网站进行模拟登录的方法,可以帮助读者 ...
- Java模拟登录带验证码的教务系统(原理详解)
一:原理 客户端访问服务器,服务器通过Session对象记录会话,服务器可以指定一个唯一的session ID作为cookie来代表每个客户端,用来识别这个客户端接下来的请求. 我们通过Chrome浏 ...
- C# 利用 HttpWebRequest 和 HttpWebResponse 模拟登录有验证码的网站
原文:C# 利用 HttpWebRequest 和 HttpWebResponse 模拟登录有验证码的网站 我们经常会碰到需要程序模拟登录一个网站,那如果网站需要填写验证码的要怎样模拟登录呢?这篇文章 ...
- 使用C#登录带验证码的网站
我在上一篇文章中已经讲解了一般网站的登录原来和C#的登录实现,很多人问到对于使用了验证码的网站该怎么办,这里我就讲讲验证码的原理和对应的登录方法.验证码的由来几年前,大部分网站.论坛之类的是没有验证码 ...
- Python爬虫模拟登录带验证码网站
问题分析: 1.爬取网站时经常会遇到需要登录的问题,这是就需要用到模拟登录的相关方法.python提供了强大的url库,想做到这个并不难.这里以登录学校教务系统为例,做一个简单的例子. 2.首先得明白 ...
- php_curl模拟登录有验证码实例
<?php/** * @author 追逐__something * @version $id */define('SCRIPT_ROOT',dirname(__FILE__).'/');$ac ...
- (转)php_curl模拟登录有验证码实例
三年来的第一篇博客,还记得那是一个夜深人静的夜晚, 独自一人坐在不到10平米的小屋里,指头迅速的敲打着键盘,这天真TMD热.BJ生活啊. 唉! 最近一直在参加一个论坛批量发帖的项目开发. 模拟登录,模 ...
- php curl模拟登录(半转载)
参考:http://our2848884.blog.163.com/blog/static/146854834201282039334/ php curl模拟登录 参考:http://blog.c ...
随机推荐
- java.util.Stack类中的peek()方法
java.util.stack类中常用的几个方法:isEmpty(),add(),remove(),contains()等各种方法都不难,但需要注意的是peek()这个方法. peek()查看栈顶的对 ...
- 【391】栈与队列,Python实现
参考:python实现stack(栈)和队列(queue) - hjhmpl123的博客 - CSDN博客 参考:Python3 数据结构 | 菜鸟教程 栈和队列是两种基本的数据结构,同为容器类型.两 ...
- javascript正则表达式中 (?=exp)、(?<=exp)、(?!exp)
(?=exp) 百度百科给的解释:非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用.例如,“Windows(?=95|98|NT|2000) ...
- 【笔记】计算机原理,网络,Linux操作系统
一,计算机原理 1,化繁为简的思想,产生二进制,产生把所有计算归结为加法运算 二,网络 1,分层思想,产生ISO七层协议,商用了TCP/IP的五层协议 三,Linux操作系统 1,分层思想,硬件-&g ...
- 【python深入】单例模式
单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 比如,某 ...
- Python local error
原来在python的函数中和全局同名的变量,如果你有修改变量的值就会变成局部变量,在修改之前对该变量的引用自然就会出现没定义这样的错误了,如果确定要引用全局变量,并且要对它修改,必须加上global关 ...
- 【转载】我为什么弃用OpenStack转向VMware vsphere
我为什么弃用OpenStack转向VMware Vsphere,一切皆为简单.高效.因为我们在工作过程中涉及到大量的测试工作,每天都有成百个虚拟机的创建和销毁工作. 工作任务非常繁重,我们的持续集成平 ...
- [leetcode]366. Find Leaves of Binary Tree捡树叶
Given a binary tree, collect a tree's nodes as if you were doing this: Collect and remove all leaves ...
- 【CSS】自定义checkbox样式
修改原生checkbox样式. 效果 原理 1.利用CSS3属性 appearance. 该属性(强制)更改(改变)默认(原生)样式. Firefox 支持替代的 -moz-appearance 属性 ...
- 关于前端设置cookie
cookie既可以后端设置也可以在前端设置,例如登陆/注册功能,每次都要向服务器请求用户数据,这种就可以把cookie放到前端储存起来. 当网页要发http请求时,浏览器会先检查是否有相应的cooki ...