0

我正在编写一个非常简单的基于 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 上。

4

2 回答 2

0

这不是错误。

发生的情况是该图像是动态生成的,可能标头配置错误。

发生这种Frame load interrupted by policy change情况是因为 WebView 尝试打开不是“文本/图像”的内容(不支持)。

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

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

祝你好运。

于 2013-07-24T14:07:45.930 回答
0

似乎这是/曾经是 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

于 2012-11-26T02:05:41.710 回答