私はいくつかのウェブサイトとインターフェースする非常に単純な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でのみ発生する理由についても非常に興味があります。