在PHP中用curl绕过Captcha

时间:2012-05-20 14:04:43

标签: php session cookies curl captcha

我正在尝试自动化验证码受保护页面上的登录进度。我正在使用Death By Captcha将图像翻译成文本,似乎运行良好。我使用curl加载登录页面,检索验证码图像URL,将其发送到DBC,获取文本并使用验证码文本向登录页面提交POST请求。

我遇到的问题是,当我提交帖子请求时,验证码图像会发生变化。由于我在通过浏览器重新加载/或错误地提交表单时没有得到相同的行为(我一遍又一遍地得到相同的图像),我假设问题与cookie或其他我想做的事情有关遗失与会话有关。

这是我用来检索数据并提交表单的代码:

$ch = curl_init();  
// Not sure that I need it, just make sure that the session doesn't change...   
curl_setopt($ch, CURLOPT_COOKIESESSION, false);
curl_setopt($ch, CURLOPT_URL, $loginUrl);
// It seems that PHPSESSID cookie parameter might be the parameter that keep the image the same, but it didn't work. I even read it dynamically from the cookie file but it still didn't work
//curl_setopt($ch, CURLOPT_COOKIE, "PHPSESSID=2bp3nhkp3bgftfrr1rjekg03o2");
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieName);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieName);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, $loginUrl);
$result = curl_exec($ch);

// Resolve the captcha and append it to the post parameters
$captchaText = $this->resolveCaptcha($result);
$postData .= '&LoginForm%5BverifyCode%5D='.$captchaText;

// Resubmit the form with the updated form data
curl_setopt($ch, CURLOPT_REFERER, $loginUrl);           
curl_setopt($ch, CURLOPT_URL, $loginUrl);
curl_setopt ($ch, CURLOPT_POST, 1); //FIXED
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postData);           
$result = curl_exec($ch);

当我打印最终结果时,我可以看到验证码文本已成功提交但图像本身已更改......

我还附上了Tamper在标准Firefox会话中捕获的请求参数的屏幕截图(所以有人可能会发现我错过了什么)。

Browser request parameters

PHP / curl提交代码完全适用于非基于验证码的网站,因此POST参数提交似乎正常。

可能是我在这里遗漏了一些非常基本的东西,任何帮助都会非常感激。

我也看过这些帖子,但找不到我正在寻找的答案。

How CURL Login with Captcha and Session

How to retrieve captcha and save session with PHP cURL?

https://stackoverflow.com/questions/8633282/curl-to-download-a-captcha-and-submit-it

1 个答案:

答案 0 :(得分:3)

你正在使用

curl_setopt ($ch, CURLOPT_POST, 0);

在第二个curl_exec中。不应该是

curl_setopt ($ch, CURLOPT_POST, 1);