需求是这样的,需要登录带验证码的网站,获取数据,但是不可能人为一直去记录数据,想通过自动采集的方式进行,如下是试验出来的结果代码!有需要的可以参考下!

<?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模拟登录带验证码的网站的更多相关文章

  1. php使用curl模拟登录带验证码的网站[开发篇]

    需求是这样的,需要登录带验证码的网站,获取数据,但是不可能人为一直去记录数据,想通过自动采集的方式进行,如下是试验出来的结果代码!有需要的可以参考下! <?php namespace Home\ ...

  2. [PHP自动化-进阶]002.CURL模拟登录带有验证码的网站

    引言:继前文<模拟登录并采集数据>,大家似乎看不过瘾,这会再出一发,模拟实现带验证码网站的登录. 这篇文章主要介绍了PHP使用CURL实现对带有验证码的网站进行模拟登录的方法,可以帮助读者 ...

  3. Java模拟登录带验证码的教务系统(原理详解)

    一:原理 客户端访问服务器,服务器通过Session对象记录会话,服务器可以指定一个唯一的session ID作为cookie来代表每个客户端,用来识别这个客户端接下来的请求. 我们通过Chrome浏 ...

  4. C# 利用 HttpWebRequest 和 HttpWebResponse 模拟登录有验证码的网站

    原文:C# 利用 HttpWebRequest 和 HttpWebResponse 模拟登录有验证码的网站 我们经常会碰到需要程序模拟登录一个网站,那如果网站需要填写验证码的要怎样模拟登录呢?这篇文章 ...

  5. 使用C#登录带验证码的网站

    我在上一篇文章中已经讲解了一般网站的登录原来和C#的登录实现,很多人问到对于使用了验证码的网站该怎么办,这里我就讲讲验证码的原理和对应的登录方法.验证码的由来几年前,大部分网站.论坛之类的是没有验证码 ...

  6. Python爬虫模拟登录带验证码网站

    问题分析: 1.爬取网站时经常会遇到需要登录的问题,这是就需要用到模拟登录的相关方法.python提供了强大的url库,想做到这个并不难.这里以登录学校教务系统为例,做一个简单的例子. 2.首先得明白 ...

  7. php_curl模拟登录有验证码实例

    <?php/** * @author 追逐__something * @version $id */define('SCRIPT_ROOT',dirname(__FILE__).'/');$ac ...

  8. (转)php_curl模拟登录有验证码实例

    三年来的第一篇博客,还记得那是一个夜深人静的夜晚, 独自一人坐在不到10平米的小屋里,指头迅速的敲打着键盘,这天真TMD热.BJ生活啊. 唉! 最近一直在参加一个论坛批量发帖的项目开发. 模拟登录,模 ...

  9. php curl模拟登录(半转载)

    参考:http://our2848884.blog.163.com/blog/static/146854834201282039334/   php curl模拟登录 参考:http://blog.c ...

随机推荐

  1. Qt 蓝牙部分翻译

    这是我第一次尝试翻译技术文档,自己英语太烂,一直不敢尝试,感谢生活,让我勇敢迈出这第一步. 大部分都是直译,如有不妥,还请制导. Qt Bluetooth The Bluetooth API prov ...

  2. QSS 的选择器

    本文连接地址:http://www.qtdebug.com/QSS-Selector.html 选择器决定了 style sheet 作用于哪些 Widget,QSS 支持 CSS2 定义的所有选择器 ...

  3. Selenide 简单实现自动化测试

    Selenide 网址:http://selenide.org/ github 地址:https://github.com/codeborne/selenide Selenide 早些年一直使用,中间 ...

  4. Jmeter从文件中读取参数值

    1. 通过函数助手,从本地文件中取值选项->函数助手对话框->选择__CSVRead函数->调用参数其中,函数助手对话框中,第一栏填写本地文件所在地址,第二栏写需要入参的值,有点类似 ...

  5. LeetCode - 38. Count and Say(36ms)

    The count-and-say sequence is the sequence of integers with the first five terms as following: 1. 1 ...

  6. Daily Scrum02 12.01

    今天是2013年12月的第一天,希望大家都有一个新的开始,一起努力!     Member Today's Task Tomorrow's Task 李孟 Task 856: 熟悉单元测试方法熟悉单元 ...

  7. PM所该学习的

     最近第二阶段实在大家都是大一大二,面临的考试很多也很难,很多时候就开始松懈了下来.可是做事情就是需要效率和时间,慢慢地,也开始懈怠了下来. 作为pm,首先自己必须比组员先了解云笔记的各种进程,做好沟 ...

  8. 关于配置tomcat多版本同eclipse的配置问题

    最近很多同学都在反应tomcat和eclipse关联的问题,其他问题网上搜索下大多都有结果,有比较疑难杂症的,下面贴出: 有的同学之前配置过tomcat6的版本或者在此之前做过配置,现在配置tomca ...

  9. 关于网站转码(SiteApp转码)

    1.Siteapp页面转码的意义?在百度移动搜索引擎中为更好满足用户信息需求,会同时为用户提供pc网页和mobile网页,但目前大多数PC页在移动终端中直接浏览的体验较差(交互.兼容和流量等).因此为 ...

  10. POJ 3801/HDU 3157 Crazy Circuits | 有下界的最小流

    题目: POJ最近总是炸 所以还是用HDU吧http://acm.hdu.edu.cn/showproblem.php?pid=3157 题解: 题很长,但其实就是给个有源汇带下界网络流(+是源,-是 ...