0

私はいくつかのウェブサイトとインターフェースする非常に単純なQtベースのアプリケーションをプログラミングしています。そのWebサイトでは、ユーザーがユーザー名/パスワードを使用してログインし、キャプチャを解決する必要があります。そのキャプチャのために、私はQWebKitを使用して、ユーザーのWebサイトを表示する(そしてアプリでCookieを傍受する)ことにしました。それはほとんどうまくいきます。ほとんど、私は本当に奇妙な問題を抱えているからです。

Linuxでは、私のアプリは魅力のように機能しました。64ビットWindows7(VS 2010で32ビットビルド)-問題なく動作しました。しかし、同じバイナリには32ビットWindows 7で非常に奇妙な問題があります。動作しますが、キャプチャ画像が表示されないため、ログインできません。もちろん、Dependency Walkerを使用して、すべてのDLLにアクセスできることを確認しました。

キャプチャは人気のある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ビットWindows7でのみ何かを台無しにしないように、ユーザーエージェント文字列をハードコードされた文字列に変更しました。何かが足りない場合を除いて、サーバーとの対話は同じであり、問​​題はクライアント側にあります。

唯一の違いは(そして私の問題に関連していると確信しています)、開発者ツールを介して特定のURLに移動しようとしたときのWebKitの動作です(QWebKitで有効にできます)。ログインページのJavascriptコンソールを開いて、次のように入力します。

window.location = "http://www.google.com"

それは私のすべてのプラットフォームで動作します。しかし、キャプチャ画像の1つのアドレスを入力すると、次のようになります。

window.location = "http://img2.minteye.com/slider/image.ashx...

結果は異なります。Linuxと64ビットのWindows7では動作し、画像を見ることができます。問題のある32ビットWindows7では、WebKitにエラーが表示Frame load interrupted by policy changeされます。それだけです。そのエラーが何を意味し、「ポリシー」がどのように変更されたかはわかりません。グーグル検索は私を助けませんでした-私は彼らがこのエラーを見たと不平を言う人々による投稿を見つけました、しかし誰もそれを引き起こす原因を説明しませんでした(WebKitソースもあまり役に立ちません)。誰かが知っているなら、私は私の問題の回避策を得ることができるかもしれません。

また、この問題が32ビットバージョンのWindows7でのみ発生する理由についても非常に興味があります。

4

2 に答える 2

0

これはバグではありません。

何が起こるかというと、この画像は動的に生成されたもので、おそらくヘッダーの設定が間違っていたのでしょう。

これは、WebView が「テキスト/画像」ではないもの (サポートされていない)Frame load interrupted by policy changeを開こうとするために発生します。

これを使用する必要があります ( 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 のコードは次のとおりです

于 2012-11-26T02:05:41.710 に答える