当前位置:首页 > PHP教程 > php应用 > 列表

PHP curl模拟登录带验证码的网站

发布:smiling 来源: PHP粉丝网  添加日期:2021-06-27 16:17:17 浏览: 评论:0 

最近接了个项目,其中有需求是要登录带验证码的网站,获取数据,但是我们不可能人为的一直去记录数据,想通过自动采集的方式进行,下面小编给大家带来的相关代码,对php curl 模拟登录带验证码的网站感兴趣的朋友一起学习吧。

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

  1. <?php 
  2. namespace Home\Controller; 
  3. use Think\Controller; 
  4. class LoginController extends Controller 
  5. { 
  6.   protected $cookieName = array('cookie_verify', 'cookie_verify'); 
  7.   protected $cookiePath = '/cookie/'; 
  8.   protected $cookiePathFile = array(); 
  9.   public function index() 
  10.   { 
  11.     $this->display(); 
  12.   } 
  13.   public function _initialize(){ 
  14.     foreach($this->cookieName as $key => $name) 
  15.     { 
  16.       $this->cookiePathFile[] = ROOT_PATH . $this->cookiePath . $this->cookieName[$key] . '_xxx.txt'; 
  17.     } 
  18.   } 
  19.   /** 
  20.    * 登录xxx 
  21.    */ 
  22.   public function xxxLogin() 
  23.   { 
  24.     $username = I('username'); 
  25.     $password = I('password'); 
  26.     $verifyCode = I('verify'); 
  27.     $loginData = array( 
  28.       '__VIEWSTATE' => '/wEPDwUKMTU0MzAzOTU4NmQYAQUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgEFDExvZ2luX1N1Ym1pdL/yae69NsY163G3yuP0lxjz8oXu',              //不把参数补全可能会不被响应哦 
  29.       '__VIEWSTATEGENERATOR' => 'DC42DE27', 
  30.       'txt_UserName' => $username, 
  31.       'txt_PWD' => $password, 
  32.       'txt_VerifyCode' => $verifyCode, 
  33.       'SMONEY' => 'ABC', 
  34.       'Login_Submit.x' => '52', 
  35.       'Login_Submit.y' => '19', 
  36.     ); 
  37.     $getBack = $this->_cookieRequest('http://xxx.com/noLogin.aspx', $loginData); 
  38.     if(preg_match('/<div[^\<div]*?id\s*=\s*[\'\"]{1}div_msg[\'\"]{1}.*?>(.*?)<\/div>/s', $getBack, $match)){ 
  39.       echo 'matched\r\n'; 
  40.       print_r($match); 
  41.     }else{ 
  42.       echo $getBack, '<br />'; 
  43.       $paramsFull = parse_url($getBack); 
  44.       parse_str($paramsFull['query'], $paramsFull['parsedQuery']); 
  45.       if(!emptyempty($paramsFull['parsedQuery']['Warn'])) { 
  46.         $msg = "您好,欢迎来P,请先登录。"; 
  47.         switch ($paramsFull['parsedQuery']['Warn']) 
  48.         { 
  49.           case '2': 
  50.             $msg = '您输入的验证码错误,请重试'; 
  51.             break; 
  52.           case '3': 
  53.             $msg = '该帐号不存在,还没帐号?'; 
  54.             break; 
  55.           case '5': 
  56.             $msg = '账户已注销'; 
  57.             break; 
  58.           case '6': 
  59.             $msg = '密码错误,如果连续错误3次半小时内不能登录!'; 
  60.             break; 
  61.           case '20': 
  62.             $msg = '今日密码错误3次及以上,请于半小时后再来登录!'; 
  63.             break; 
  64.           case '21': 
  65.             $msg = '今日您所在IP的所有帐号密码错误9次以上,请于半小时后再来登录!'; 
  66.             break; 
  67.           case '22': 
  68.             $msg = '登录失败,您所在IP今日登录的帐号过多!'; 
  69.             break; 
  70.           case '23': 
  71.             $msg = '登录失败,验证码失效!'; 
  72.             break; 
  73.           case '32': 
  74.             $msg = '该帐号已经绑定其他xx帐号!'; 
  75.             break; 
  76.           case '33': 
  77.             $msg = '一台电脑一天只能注册一个帐号!'; 
  78.             break; 
  79.         } 
  80.         $this->error($msg, '', 5); 
  81.       }else{ 
  82.         $_SESSION['user_id'] = '123456';      //登录设置session 
  83.         $this->success('登录P网站成功', U('Index/index'), 5); 
  84.       } 
  85.     } 
  86.   } 
  87.   /** 
  88.    * 获取验证码 
  89.    */ 
  90.   public function getVerifyCode() 
  91.   { 
  92.     $img = $this->_cookieRequest('http://xxx.com/VerifyCode_Login.aspx?id=' . rand(10000,999999), null, true, 1); 
  93.     echo $img; 
  94.   } 
  95.   /** 
  96.    * 删除cookie 
  97.    */ 
  98.   public function clearCookie() 
  99.   { 
  100.     for($i = 0; $i <count($this->cookieName); $i++) 
  101.     { 
  102.       setcookie($this->cookieName[$i], '', time() - 3600); 
  103.     } 
  104. //    unlink($this->cookiePathFile); 
  105.     $this->success('清除cookie成功!'); 
  106.   } 
  107.   /** 
  108.    * 带COOKIE的访问curl 
  109.    * @param $url 访问地址 
  110.    * @param bool|array $data 传递的数据 
  111.    * @param bool $redirect 是否获取重定向的地址 
  112.    * @return mixed 地址或者返回内容 
  113.    */ 
  114.   public function _cookieRequest($url, $data = null, $redirect = false, $cookieNum = 0) 
  115.   { 
  116.     $ch = curl_init(); 
  117.     $params[CURLOPT_URL] = $url;             //请求url地址 
  118.     $params[CURLOPT_HEADER] = false;           //是否返回响应头信息 
  119.     $params[CURLOPT_RETURNTRANSFER] = true;       //是否将结果返回 
  120.     $params[CURLOPT_FOLLOWLOCATION] = true;       //是否重定向 
  121.     $params[CURLOPT_USERAGENT] = 'Mozilla/5.0 (Windows NT 5.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1'; 
  122.     if($data) 
  123.     { 
  124.       $params[CURLOPT_POST] = true; 
  125.       $params[CURLOPT_POSTFIELDS] = http_build_query($data); 
  126.     } 
  127.     //判断是否有cookie,有的话直接使用 
  128.     if (!emptyempty($_COOKIE[$this->cookieName[$cookieNum]]) && is_file($this->cookiePathFile[$cookieNum])) 
  129.     { 
  130.       $params[CURLOPT_COOKIEFILE] = $this->cookiePathFile[$cookieNum];   //这里判断cookie 
  131.     } 
  132.     else 
  133.     { 
  134. //      $cookie_jar = tempnam($cookie_path, 'cookie');            //产生一个cookie文件 
  135.       $params[CURLOPT_COOKIEJAR] = $this->cookiePathFile[$cookieNum];    //写入cookie信息 
  136.       setcookie($this->cookieName[$cookieNum], $this->cookiePathFile[$cookieNum], time() + 120);   //保存cookie路径 
  137.     } 
  138.     curl_setopt_array($ch, $params);                      //传入curl参数 
  139.     $content = curl_exec($ch); 
  140.     $headers = curl_getinfo($ch); 
  141. //    echo $content; 
  142.     curl_close($ch); 
  143.     if ($url != $headers["url"] && $redirect == false) 
  144.      { 
  145.       return $headers["url"]; 
  146.      } 
  147.       return $content; 
  148.      } 
  149.   } 

登录以后,就可以使用带cookie的访问其他页面了!

ps:php curl 登录淘宝

提交上去后显示为填写验证码,登录不上去

填写验证码提交:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
  2. <html xmlns="http://www.w3.org/1999/xhtml"> 
  3.   <head>     
  4.    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 
  5.    <title></title> 
  6.   </head> 
  7.   <body> 
  8.   <iframe id='img' src="b.php" width="950" height="300" scrolling="No" frameborder="0"></iframe> 
  9.   <form action="tb.php" method="POST"> 
  10.   <textarea name="vv" cols="50" rows="10">umto=&action=Authenticator&event_submit_do_login=anything&from=tb&fc=default&style=default&css_style=&tid=XOR_1_000000000000000000000000000000_635045544 
  11. 70A7C717F750278&support=000001&CtrlVersion=1,0,0,7&loginType=3&minititle=&minipara=&pstrong=&llnick=&sign=&need_sign=&isIgnore=&full_redirect=&popid=&callback=&guf=&not_duplite_str=&need_user_id=&poy=XOR_1_000000000000000000000000000000_625A424 
  12. A45137C6F7A7F0B786D08&gvfdcname=&gvfdcre=&from_encoding=&TPL_redirect_url=http:www.taobao.com&TPL_username=xxx&TPL_password=xxxx&need_check_code=&&TPL_checkcode=</textarea> 
  13.   <input type="submit" /> 
  14.   </form> 
  15.    
  16.   </body> 
  17. </html> 
  18. <?php 
  19. session_start(); 
  20. if(emptyempty($_SESSION['cookie_jar'])) exit(); 
  21. $cookie_jar=$_SESSION['cookie_jar']; 
  22. $post_fields=$_POST["vv"]; 
  23. $ch = curl_init('https://login.taobao.com/member/login.jhtml');  
  24. curl_setopt($ch, CURLOPT_HEADER, 0);  
  25. curl_setopt($ch, CURLOPT_USERAGENT,  
  26. "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; QQWubi 133; Embedded Web Browser from: http://bsalsa.com/; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Tablet PC 2.0; .NET4.0C; .NET4.0E; InfoPath.3; Media Center PC 6.0)");  
  27. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
  28. curl_setopt($ch, CURLOPT_POST, 1);  
  29. curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);  
  30. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);  
  31. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);  
  32. curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);  
  33. $data = curl_exec($ch);  
  34. curl_close($ch); 
  35. echo $data;exit; 
  36. $ch = curl_init('http://www.taobao.com');  
  37. curl_setopt($ch, CURLOPT_USERAGENT,  
  38. "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; QQWubi 133; Embedded Web Browser from: http://bsalsa.com/; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Tablet PC 2.0; .NET4.0C; .NET4.0E; InfoPath.3; Media Center PC 6.0)");  
  39. curl_setopt($ch, CURLOPT_HEADER, 0);  
  40. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);  
  41. curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_jar);  
  42. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE);  
  43. curl_exec($ch);  
  44. curl_close($ch);  
  45. ?> 

提取验证码:

  1. <?php 
  2. session_start(); 
  3. $cookie_jar=tempnam("./temp/","cookie"); 
  4. $_SESSION['cookie_jar']=$cookie_jar; 
  5. $post_fields = "action=Authenticator&event_submit_do_login=anything&from=tb&fc=default&style=default&css_style=&tid=XOR_1_000000000000000000000000000000_635045544 
  6. 70A7C717F750278&support=000001&CtrlVersion=1,0,0,7&loginType=3&minititle=&minipara=&pstrong=&llnick=&sign=&need_sign=&isIgnore=&full_redirect=&popid=&callback=&guf=&not_duplite_str=&need_user_id=&poy=XOR_1_000000000000000000000000000000_625A424A45137C6F7A7F0B786D08&gvfdcname=&gvfdcre=&from_encoding=&TPL_redirect_url=http:www.taobao.com&TPL_username=xxx&TPL_password=xxx";  
  7. $ch = curl_init('https://login.taobao.com/member/login.jhtml');  
  8. curl_setopt($ch, CURLOPT_USERAGENT,  
  9. "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; QQWubi 133; Embedded Web Browser from: http://bsalsa.com/; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Tablet PC 2.0; .NET4.0C; .NET4.0E; InfoPath.3; Media Center PC 6.0)");  
  10. curl_setopt($ch, CURLOPT_HEADER, 0);  
  11. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
  12. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);  
  13. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);  
  14. $data = curl_exec($ch);  
  15. curl_close($ch);  
  16. preg_match("/id=\"um_to\" name=\"umto\" value=\"(.*?)\"\/>/", $data, $arr);  
  17. $post_fields = "umto=" . $arr[1] . "&" . $post_fields."&TPL_checkcode=";  
  18. echo "<textarea cols=50 rows=10>" . $post_fields . "</textarea><br/>" ;  
  19. $ch = curl_init('https://login.taobao.com/member/login.jhtml');  
  20. curl_setopt($ch, CURLOPT_HEADER, 0);  
  21. curl_setopt($ch, CURLOPT_USERAGENT,  
  22. "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; QQWubi 133; Embedded Web Browser from: http://bsalsa.com/; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Tablet PC 2.0; .NET4.0C; .NET4.0E; InfoPath.3; Media Center PC 6.0)");  
  23. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
  24. curl_setopt($ch, CURLOPT_POST, 1);  
  25. curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);  
  26. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);  
  27. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);  
  28. curl_setopt($ch,CURLOPT_COOKIEJAR,$cookie_jar); 
  29. curl_setopt($ch,CURLOPT_COOKIEFILE,$cookie_jar);  
  30. $data = curl_exec($ch);  
  31. curl_close($ch); 
  32. preg_match("/img id=\"J_StandardCode_m\" src=\"(.*?)\" data-src=/", $data, $arr1);  
  33. echo "<img src=".$arr1[1]." />"; 
  34. exit; 
  35. ?>

Tags: curl模拟登录 PHP验证码

分享到: