QWebKit不会在特定平台上显示某些图像

时间:2012-11-26 00:56:35

标签: qt webkit qt4 qwebview

我正在编写一个非常简单的基于Qt的应用程序,它将连接某个网站。该网站要求用户使用用户名/密码登录并解决Captcha。因为Captcha,我决定使用QWebKit并只为用户显示网站(并拦截我的应用程序中的cookie)。它的效果非常好。差不多,因为我有一个非常奇怪的问题。

在Linux上,我的应用就像一个魅力。在64位Windows 7(使用VS 2010构建32位)上 - 它也没有问题。但是同样的二进制文件在32位Windows 7下有一个非常奇怪的问题。它可以工作,但不会显示Captcha图像,使得无法登录。当然,我使用了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"

它适用于我的所有平台。但是,当我输入其中一张Captcha图像的地址时:

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上。

2 个答案:

答案 0 :(得分:0)

似乎这是/是QtWebkit实现中的错误,您可以在这里阅读更多相关信息: https://bugs.webkit.org/show_bug.cgi?id=37597

您使用的是哪个版本的Qt和QtWebkit? 尝试更新版本的Qt& s可能是一个好主意。 QtWekbit。

如果它在任何情况下都有帮助,这里是Webkit中显示此错误的代码: http://src.chromium.org/svn/branches/WebKit/472/WebKit2/WebProcess/WebCoreSupport/qt/WebErrorsQt.cpp

答案 1 :(得分:0)

这不是错误。

这个图像是动态生成的,可能是Headers配置错误。

发生Frame load interrupted by policy change因为WebView尝试打开不是“text / image”(不支持)的内容。

你应该使用它(https://stackoverflow.com/a/16782607/1518921):

//replace [QWebView] by your WebView
connect([QWebView]->page(), SIGNAL(unsupportedContent(QNetworkReply*)), this, SLOT(downloadContent(QNetworkReply*)));

...

void [main class]::downloadContent(QNetworkReply *reply){
    //Replace "[main class]" by "Class" having the signs used in WebView.

    [QWebView]->stop();
    //solution: stop loading --replace [QWebView] by your WebView, 

    /*function to donwload*/
}

此时如果你有一个下载管理器,它会要求保存图像而不是打开它,因为内容不受支持。

<强>解决方案:

  • 您可以尝试修复图片标题。

  • 如果您的服务器不存在,那么您将需要解析标题Content-type并查看它尝试发送的类型,您需要重新实现{ {1}}:

    QWebPage
祝你好运。