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

Posted

技术标签:

【中文标题】QWebKit 在特定平台上不显示某些图像【英文标题】:QWebKit does not show some images on specific platforms 【发布时间】: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:当你发布你的答案时,我没有在做那个项目。我会检查您的解决方案是否可行。 【参考方案1】:

这似乎是/曾经是 QtWebkit 实现中的一个错误,您可以在此处阅读有关它的更多信息: https://bugs.webkit.org/show_bug.cgi?id=37597

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

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

【讨论】:

我正在使用最新的稳定 Qt (4.8.3),其中包含 WebKit 534.34(大约一岁)。如果找不到任何其他解决方案,我将尝试使用 Qt 5 的 beta 版本。感谢您的帮助 - 我认为这可能是 WebKit 错误。 使用 Qt 5 它也不起作用。我不确定这是不是同样的问题,因为开发人员工具根本不起作用。我非常确信他们没有更新 webkit,它与 Qt 4 中的相同...... 我记得从 Qt5 开始,webkit 的工作是从 Qt 中分离出来的,以便更加模块化。所以你也许可以得到一个新的 QtWebkit 模块,但我不确定。【参考方案2】:

这不是错误。

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

Frame load interrupted by policy change 出现是因为 WebView 尝试打开不是 "text/image" 的内容(不支持)。

你应该使用这个(https://***.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 并查看它尝试发送的类型,您必须重新实现 QWebPage 的内容类型:

virtual bool extension(Extension extension, const ExtensionOption *option = 0,
                       ExtensionReturn *output = 0);

virtual bool supportsExtension(Extension extension) const;

祝你好运。

【讨论】:

以上是关于QWebKit 在特定平台上不显示某些图像的主要内容,如果未能解决你的问题,请参考以下文章

如何让 QWebKit 显示图像?

RichTextBox 滚动条在某些 PC 上不显示

内容 url 在 Firefox 浏览器上不显示图像

IOS上不显示图片

iOS 14 启动屏幕故事板在 iOS 14 设备上不显示图像

WatchOs 上不显示 ScrollView 内的列表