我正在编写一个非常简单的基于 Qt 的应用程序,它将连接一些网站。该网站要求用户使用用户名/密码登录并解决验证码。因为那个验证码,我决定使用 QWebKit 并只为用户显示网站(并在我的应用程序中拦截 cookie)。它几乎工作得很好。几乎,因为我遇到了一个非常奇怪的问题。
在 Linux 上,我的应用程序就像一个魅力。在 64 位 Windows 7(使用 VS 2010 构建的 32 位)上 - 它也可以正常工作。但同样的二进制文件在 32 位 Windows 7 下有一个非常奇怪的问题。它可以工作,但不显示验证码图像,导致无法登录。当然,我使用了 Dependency Walker 并确保所有 DLL 都可以访问。
Captcha 不是流行的 reCaptcha 之类的,而是Minteye 滑块 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 上。