php使用curl模拟登录带验证码的网站

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

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

<?phpnamespace Home\Controller;useThink\Controller;classLoginControllerextendsController

{PRotected$cookieName=array('cookie_verify', 'cookie_verify');protected$cookiePath= '/cookie/';protected$cookiePathFile=array();publicfunctionindex()

{$this->display();

}publicfunction_initialize(){foreach($this->cookieNameas$key=>$name)

{$this->cookiePathFile[] = ROOT_PATH .$this->cookiePath .$this->cookieName[$key] . '_xxx.txt';

}

}/**

* 登录xxx*/publicfunctionpc28Login()

{$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);

}

}

}/**

* 获取验证码*/publicfunctiongetVerifyCode()

{$img=$this->_cookieRequest('http:///VerifyCode_Login.aspx?id=' .rand(10000,999999),null,true, 1);echo$img;

}/**

* 删除cookie*/publicfunctionclearCookie()

{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 地址或者返回内容*/publicfunction_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/20100101Firefox/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];//这里判断cookieif($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的访问其他页面了!

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航