将请求发送到具有Captcha的不同站点上的多个表单

时间:2014-11-07 14:25:30

标签: php curl cookies cross-browser captcha

我想制作一个在多个网站上发布的多注册表单,用户不需要反复输入相同的数据,但他会将其发布在此表单上。问题是某些网站可能有验证码所以我需要一种方法来检索我的表单上的验证码图像使用cookie,会话,卷曲我不知道哪种方法可以帮助我。

enter image description here

问题变得复杂,因为我需要存储会话ID和cookie,因为如果我提交表单,其他站点应该知道是请求验证码的用户。我用来获取catpcha的php脚本是:

$ch = curl_init($url);//Site url
curl_setopt($ch, CURLOPT_COOKIEJAR, $file); //Save the cookie to a temporary file on the server
curl_setopt($ch, CURLOPT_COOKIEFILE, $file); 
curl_setopt($ch, CURLOPT_HEADER  ,1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER  ,1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION  ,1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$content = curl_exec($ch);

preg_match("'<div class=\"captchaimage\">(.*?)<a class=\"captcha-refresh-link hide\"'si", $content, $matches ); // getting the captcha image

echo $matches[1]; //Displaying the image

我第一次使用此代码时会显示损坏的图像:

enter image description here

当我刷新页面或在另一个标签页中打开我请求验证码的网站时,它会显示想要的验证码:

enter image description here

所以我需要一些帮助,因为我没有使用curl和cookies,但我知道问题有像这个网站https://www.betall.ie/register.html这样的解决方案。我会感激一些帮助:)。

php代码在这里:http://codepad.viper-7.com/FMKrGR

2 个答案:

答案 0 :(得分:1)

curl_setopt($ch, CURLOPT_COOKIEJAR, $file);

你可以为不同的$ url使用不同的cookie文件吗?我认为这可能会有所帮助。来自不同网址的Cookie项目不会混用。

答案 1 :(得分:0)

找到了从其他网站获取验证码的解决方案示例:

function getCaptcha($file){
   header ('Content-Type: image/png');
   $ch = curl_init($url);
   curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2) Gecko/20070219 Firefox/2.0.0.2');
   curl_setopt($ch, CURLOPT_COOKIEJAR, $file);
   curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
   curl_setopt($ch, CURLOPT_HEADER, 1);
   $out['result']  = curl_exec($ch);  //getting the html of the page 
   $out['error']   = curl_error($ch);
   $out['info']    = curl_getinfo($ch);
   curl_close($ch);  

   $matches = array();
   preg_match("'<div class=\"captchaimage\">(.*?)<a class=\"captcha-refresh-link hide\"'si", $out['result'], $matches );
   if(!isset($matches[1])){
      getCaptcha($file);
      return;
   }
   $img = $matches[1];
   $src = strpos($img, 'src="') + 5;
   $srcend = strpos($img, '"', $src);
   $img_src ='https://www.example.com' .  substr($img, $src, $srcend - $src);
   $img = substr($img, 0, $src)  . 'https://www.example.com' . substr($img, $src); //Getting the image captcha via regex

   $ch = curl_init($img_src);
   curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2) Gecko/20070219 Firefox/2.0.0.2');
   curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
   curl_setopt($ch, CURLOPT_COOKIEFILE, $file);
   $out2['result'] = curl_exec($ch);
   $out2['error']  = curl_error($ch);
   $out2['info']   = curl_getinfo($ch);
   curl_close($ch); //requesting the image via curl

   return $out2['result']; //returning the image
}