【发布时间】:2012-11-26 00:56:35
【问题描述】:
我正在编写一个非常简单的基于 Qt 的应用程序,它将连接一些网站。该网站要求用户使用用户名/密码登录并解决验证码。由于那个验证码,我决定使用 QWebKit 并只为用户显示网站(并在我的应用程序中拦截 cookie)。它的效果几乎很好。几乎,因为我遇到了一个非常奇怪的问题。
在 Linux 上,我的应用程序运行良好。在 64 位 Windows 7(使用 VS 2010 构建的 32 位)上 - 它也可以正常工作。但同样的二进制文件在 32 位 Windows 7 下有一个非常奇怪的问题。它可以工作,但不显示验证码图像,因此无法登录。当然,我使用了 Dependency Walker 并确保所有 DLL 都可以访问。
Captcha 不是流行的 reCaptcha 之类的,而是 Minteye slider Captcha(顺便说一句,在我看来,这很容易通过计算机解决)。正如您在我链接到的页面底部看到的那样,此验证码会下载一系列图像,用户必须使用滑块选择“正确”(无乱码)的图像。
问题是,没有明显的原因,我的应用程序在 32 位 Windows 7 上没有显示这些图像,而在 64 位版本上一切正常。我用的代码很简单,不过还是贴出来吧:
loginView = new QWebView();
QWebPage *page = new QWebPage();
manager = new QNetworkAccessManager();
loginView->setPage(page);
page->setNetworkAccessManager(manager);
jar = new QNetworkCookieJar();
manager->setCookieJar(jar);
page->mainFrame()->load(QUrl("http://site.to.open"));
loginView->show();
我通过 Wireshark 验证这些图像确实是从服务器下载的。我什至将用户代理字符串更改为硬编码,以确保服务器不会只为 32 位 Windows 7 搞砸一些东西。除非我遗漏了什么,与服务器的对话是相同的,问题出在客户端。
唯一不同(我很确定这与我的问题有关)是 WebKit 在尝试通过开发人员工具导航到特定 URL 时的行为(可以在 QWebKit 中启用它们,我也是如此)。当我打开登录页面的 Javascript 控制台并输入:
window.location = "http://www.google.com"
它适用于我的所有平台。但是,当我输入其中一张验证码图片的地址时:
window.location = "http://img2.minteye.com/slider/image.ashx...
结果各不相同。在 Linux 和 64 位 Windows 7 上它可以工作,我可以看到图像。在有问题的 32 位 Windows 7 上,WebKit 显示错误 Frame load interrupted by policy change,仅此而已。我不知道该错误意味着什么以及“政策”发生了什么变化。谷歌搜索对我没有帮助 - 我发现人们抱怨他们看到这个错误的帖子,但没有人解释导致它的原因(WebKit 源代码也不是很有帮助)。如果有人知道,我可能会为我的问题找到解决方法。
我也很好奇,为什么这个问题只出现在 32 位版本的 Windows 7 上。
【问题讨论】:
-
您好,我回答了这么久,不知道您是否可以为您的项目实施我的示例。
-
@GuilhermeNascimento:当你发布你的答案时,我没有在做那个项目。我会检查您的解决方案是否可行。