我正在编写一个简单的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
返回相同。我在这里缺少什么?
答案 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"
作为上下文脚本。