使用PHP中的curl绕过验证码

7
我正在尝试自动化一个验证码保护页面的登录过程。我使用“死亡之插件”将图像转换为文本,看起来效果不错。我使用curl加载登录页面,检索验证码图像url,将其发送到DBC,获取文本并提交带有验证码文本的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捕获的(因此有人可能会注意到我是否遗漏了什么)。

Browser request parameters

PHP/curl提交代码完全适用于非基于验证码的网站,因此POST参数提交似乎有效。
可能是我在这里缺少一些非常基础的东西,任何帮助将不胜感激。
我还查看了这些帖子,但没有找到我要寻找的答案。 如何使用CURL登录验证码和会话 如何使用PHP cURL检索验证码并保存会话?

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


1
当然,使用验证码的目的就是阻止你做这件事情...如果网站的作者希望你使用curl访问页面,他一开始就不会实现验证码。 - Mark Baker
1
正因为如此,解决这个问题就取决于你自己。虽然这是一个编程问题,但SO并不是用来帮助恶作剧的。 - mario
谢谢大家。这仍然是一个简单的问题,关于如何在传递cookie的同时保持会话不中断。在这种特定情况下,我正在尝试从多个来源检索联盟信息。但是,如果您感到不舒服提供帮助,我尊重您的意见。 - sagibb
1个回答

5

您正在使用

curl_setopt ($ch, CURLOPT_POST, 0);

在第二个curl_exec中,应该是这样的。
curl_setopt ($ch, CURLOPT_POST, 1);

?


谢谢!是的,你说得对。实际上我不太确定POST参数的提交方式是如何工作的,但它确实起作用了(我看到表单在第二个响应中被填充了)。我已经修复了这个问题,但它并没有解决这个问题... - sagibb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接