【问题标题】:Fake navigator properties假导航器属性
【发布时间】:2016-11-10 11:38:07
【问题描述】:

我想伪造 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);
    });
});

但问题是,如果我们从 Iframe 中获取 Navigator 属性,则值仍然是原始值,因为 page.initialized 仅为主页设置它。 所以我选择在它的源代码中更改它并重新构建它。我从 git repo 下载了 Phantomjs,并搜索了一个硬编码的平台值(我的情况是 Linux x86_64)。我在./phantomjs/src/qt/qtwebkit/Source/WebCore/platform/qt/UserAgentQt.cpp中找到了硬编码字符串

我将其更改为我希望作为 navigator.platform 返回的字符串,但它不影响 navigator.platform。我应该在哪里改变它?它(平台)是硬编码的字符串还是动态创建的?

【问题讨论】:

  • 我建议更改 casperjs 或覆盖一些方法,而不是构建自己的 PhantomJS 版本。也许你有更多的运气在他们的 Google Group groups.google.com/forum/#!forum/casperjs 中提问
  • 感谢您的评论。我做到了。
  • 也许您可以发布您的解决方案作为答案。

标签: javascript phantomjs casperjs overwrite navigator


【解决方案1】:

查看代码后发现应该改如下文件:

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

NavigatorBase::platform() 应设置为您希望作为 navigator.platform 返回的所需字符串。 但我不确定它是否会搞砸其他事情,如果不是合适的解决方案,请提出建议。

【讨论】:

  • 后来怎么样了?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多