2016-07-08 3 views
18

私はCasperJS(/ PhantomJS)のNavigatorプラットフォームプロパティを偽装したいと思います。私は、ウェブ上の他の多くの場所で提案されているページのロードでのナビゲーターオブジェクトを上書きするのは簡単解決策を見つけた:偽のナビゲータプロパティ

casper.on('page.initialized', function(){ 
    this.evaluate(function(){ 
     (function(oldNav){ 
      var newNav = {}; 
      [].forEach.call(Object.getOwnPropertyNames(navigator), function(prop){ 
       if (prop === 'platform') { 
        Object.defineProperty(newNav, prop, { 
         value: 'Win64' 
        }); }else { 
        Object.defineProperty(newNav, prop, { 
         get: function(){ 
          return oldNav[prop]; 
         } 
        }); 
       } 
      }); 
      window.navigator = newNav; 
     })(window.navigator); 
    }); 
}); 

しかし、問題は、我々はインラインフレームからナビゲーターのプロパティを取得する場合、値が残っているということです元のものは、page.initializedはメインページ用にのみ設定されています。 私はソースコードを変更してビルドを再開しました。私はgitリポジトリからPhantomjsをダウンロードし、ハードコードされたプラットフォームの値(私の場合はLinux x86_64)を探しました。ハードコードされた文字列が見つかりました./phantomjs/src/qt/qtwebkit/Source/WebCore/platform/qt/UserAgentQt.cpp

私は文字列に変更しました。私はnavigator.platformとして返りたいですが、navigator.platformには影響しませんでした。どこを変更したらよいですか?それ(プラットフォーム)は、コード化された文字列か、動的に作成されますか?

+0

私はcasperjsを変更するか、PhantomJSの独自のバージョンを構築する代わりにいくつかのメソッドを上書きすることを提案します。おそらくあなたのGoogleグループであなたの質問をする運がもっとありますhttps://groups.google.com/forum/#!forum/casperjs – CSchulz

+0

ご意見ありがとうございます。私はそれをしました。 – Alex

+0

おそらく答えとして回答を投稿することができます。 – CSchulz

答えて

3

コードを確認した後、私は次のファイルを変更する必要があることが分かった:

src/qt/qtwebkit/Source/WebCore/page/NavigatorBase.cpp 

NavigatorBase::platform()あなたがnavigator.platformとして返されるしたい目的の文字列に設定する必要があります。 しかし、それが他のものを台無しにするかどうかわからない、それが適切な解決策でない場合は、提案をお願いします。