文档加载后覆盖自定义导航器

时间:2016-07-02 22:20:49

标签: javascript google-chrome-extension

我正在编写一个简单的Chrome扩展程序,试图欺骗您当前的用户代理。我刚刚发现了this question并在我的代码中实现了它。

以下是尝试替换当前用户代理字符串的内容脚本,设置为在document_start运行:

let useragent, actualCode, timer = null;
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
  if (request.useragent) {
    sendResponse({error: false});
    useragent = request.useragent;
  }
  else sendResponse({error: true});
});

var receivedUA = function() {
  if (useragent != null) {
    window.clearInterval(timer);
    actualCode = function(userAgent) {
      console.log('im being called');
      'use strict';
      let navigator = window.navigator;
      let modifiedNavigator;

      if ('userAgent' in Navigator.prototype) {
        modifiedNavigator = Navigator.prototype;
      } else {
        modifiedNavigator = Object.create(navigator);
        Object.defineProperty(window, 'navigator', {
          value: modifiedNavigator,
          configurable: false,
          enumerable: false,
          writable: false
        });
        Object.defineProperty(navigator, 'navigator', {
          value: modifiedNavigator,
          configurable: false,
          enumerable: false,
          writable: false
        });
      }

      Object.defineProperties(modifiedNavigator, {
        userAgent: {
          value: userAgent.useragent,
          configurable: false,
          enumerable: true,
          writable: false
        },
        appVersion: {
          value: userAgent.appversion,
          configurable: false,
          enumerable: true,
          writable: false
        },
        platform: {
          value: userAgent.platform,
          configurable: false,
          enumerable: true,
          writable: false
        }
      });

      console.dir(modifiedNavigator);

    };
    let evt = new Event('reset');
    document.documentElement.addEventListener('reset', actualCode(useragent));
    document.documentElement.dispatchEvent(evt);
    document.documentElement.removeEventListener('reset', actualCode(useragent));
  }
  else {
    window.clearTimeout(timer);
    timer = window.setTimeout(receivedUA, 100);
  }
}
receivedUA();

但是,我正在测试whatsmyua.com并在文档开始加载时调用代码,但在加载后,它会显示我的真实用户代理,并在控制台上键入window.navigator.userAgent返回相同。我在这里缺少什么?

2 个答案:

答案 0 :(得分:0)

使用chrome.webRequest API here时,您应该避免这种复杂性。这是一个稍微修改过的示例,它将从上面的链接输出User-Agent标头的对象:

chrome.webRequest.onBeforeSendHeaders.addListener(
    function(details) {
        for (var i = 0; i < details.requestHeaders.length; ++i) {
            if (details.requestHeaders[i].name === 'User-Agent') {
              console.log(details.requestHeaders[i]);
              break;
            }
          }
          return {requestHeaders: details.requestHeaders};
    },
    {urls: ["<all_urls>"]},
    ["blocking", "requestHeaders"]
);

另外..你应该将它添加到你的后台脚本中(参见here

答案 1 :(得分:0)

如果您检查http://www.whatsmyua.com/的源代码,您可以看到它在主体开头的内联脚本中加载页面时获得了用户代理:

function getUa() { return decodeURIComponent(location.hash.replace('#', '')) || navigator.userAgent; }

所以答案就是时间:谁会更快 - 你的内容脚本或页面脚本。 页面正在赢。它在content-script覆盖之前检索用户代理。

您可以将该页面下载为html,在localhost上运行,并在其中添加时间戳记以测量时间。

另外,请确保您使用"run_at": "document_start"作为上下文脚本。