在PHP中使用curl绕过验证码

在PHP中使用curl绕过验证码,php,session,cookies,curl,captcha,Php,Session,Cookies,Curl,Captcha,我正在尝试在受验证码保护的页面上自动执行登录过程。我正在使用死亡验证码将图像翻译成文本,它似乎工作得很好。我正在使用curl加载登录页面,检索captcha图像url,将其发送到DBC,返回文本,并使用captcha文本向登录页面提交POST请求 我遇到的问题是,当我提交post请求时,验证码图像会发生变化。由于我在通过浏览器重新加载/或错误提交表单时没有得到相同的行为(我一次又一次地得到相同的图像),因此我假设问题与cookies或与会话相关的我丢失的其他东西有关 这是我用来检索数据和提交表单

我正在尝试在受验证码保护的页面上自动执行登录过程。我正在使用死亡验证码将图像翻译成文本,它似乎工作得很好。我正在使用curl加载登录页面,检索captcha图像url,将其发送到DBC,返回文本,并使用captcha文本向登录页面提交POST请求

我遇到的问题是,当我提交post请求时,验证码图像会发生变化。由于我在通过浏览器重新加载/或错误提交表单时没有得到相同的行为(我一次又一次地得到相同的图像),因此我假设问题与cookies或与会话相关的我丢失的其他东西有关

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

$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);
当我打印最终结果时,我可以看到验证码文本已成功提交,但图像本身已更改

我还附上了在标准Firefox会话中用Tamper捕获的请求参数的屏幕截图(这样,如果我遗漏了什么,可能会有人发现)

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

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

我也看了这些帖子,但没有找到我想要的答案

您正在使用的

curl_setopt ($ch, CURLOPT_POST, 0);
在第二个curl_exec中。不是吗

curl_setopt ($ch, CURLOPT_POST, 1);

当然,使用验证码是为了阻止您这样做。。。如果站点的作者希望您使用curl访问页面,那么他一开始就不会实现captcha,正是出于这个原因,您需要解决这个问题。虽然这是一个编程问题,但也不是为了帮助恶作剧。谢谢大家。这仍然是一个简单的问题,关于如何在传递cookie时保持会话的机智。在这个特定的例子中,我试图从多个来源检索分支机构信息。不过,如果你觉得不舒服,那么我尊重你的意见。谢谢!是的,你说得对。事实上,我不太清楚POST参数的提交是如何工作的,但确实如此(我看到表单是在第二次响应中填写的)。我已经解决了这个问题,但没有解决问题。。。