Google chrome extension Chrome webRequest API:onBeforeSendHeaders事件不会更改标头

Google chrome extension Chrome webRequest API:onBeforeSendHeaders事件不会更改标头,google-chrome-extension,Google Chrome Extension,我创建了一个扩展,如果没有启用kill开关,它将发送不同的User-Agent头。Kill开关是一个按钮,一旦单击,它会将chrome.storage.sync中的“ks”值从0更改为1,并从1更改为0。在background.js中,在onBeforeSendHeaders侦听器中,我检查chrome存储中的“ks”或kill开关值。如果是1,那么扩展应该将用户代理更改为默认。如果为0,则用户代理将更改为自定义代理。问题是,如果没有检查,代码可以正常工作,但是您无法阻止侦听器更改用户代理。添加

我创建了一个扩展,如果没有启用kill开关,它将发送不同的User-Agent头。Kill开关是一个按钮,一旦单击,它会将chrome.storage.sync中的“ks”值从0更改为1,并从1更改为0。在background.js中,在onBeforeSendHeaders侦听器中,我检查chrome存储中的“ks”或kill开关值。如果是1,那么扩展应该将用户代理更改为默认。如果为0,则用户代理将更改为自定义代理。问题是,如果没有检查,代码可以正常工作,但是您无法阻止侦听器更改用户代理。添加检查时,它只发送默认值,即使“ks”为0

manifest.json

{
    "manifest_version": 2,
    "name": "UserAgent changer",
    "description": "changes user agent",
    "version": "1.0.1",
    "permissions": ["tabs","webRequest","webRequestBlocking", "*://*/*", "storage"],
    "background":{
        "scripts":["background.js"],
        "persistent": true
    },
    "browser_action": {
        "default_popup": "popup.html"
    }
}
background.js

chrome.webRequest.onBeforeSendHeaders.addListener(function(details){
    var headers = details.requestHeaders,
    blockingResponse = {};
    for( var i = 0, l = headers.length; i < l; ++i ) {
      if( headers[i].name == 'User-Agent' ) {
        chrome.storage.sync.get('ks', function(result){
            if (result.ks == 0){
                headers[i].value = 'Custom agent';
            }else{
                headers.value = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36";
            }
        });
        break;
      }
    }
  
    blockingResponse.requestHeaders = headers;
    return blockingResponse;
  },
  {urls: [ "<all_urls>" ]},['requestHeaders','blocking']);

chrome.runtime.onInstalled.addListener(function() {
    // Set kill switch to True by default
    chrome.storage.sync.set({ks: 1});
});
console.log("loaded");
btn = document.getElementById("toggleAgent");
chrome.storage.sync.get('ks', function(result){
    if (result.ks == 1){
        btn.innerText = "Turn on agent";
    }else{
        btn.innerText = "Turn off agent";
    }
});
btn.onclick = function(){
    chrome.storage.sync.get('ks', function(result){
        console.log(result);

        if (result.ks == 1){
            btn.innerText = "Turn off agent";
            chrome.storage.sync.set({ks: 0});
        }else{
            btn.innerText = "Turn on agent";
            chrome.storage.sync.set({ks: 1});
        }
    });
};

chrome.storage
是异步的,因此它在调用代码完成后运行很长时间(onBeforeSendHeaders侦听器)。不能在此侦听器中使用异步API。请切换到
window.localStorage
或将该值保留在全局变量中。@wOxxOm将更改为chrome.storage.local也有效?不,所有
chrome
API回调都是异步的。谢谢@wOxxOm,您的建议有效
chrome.storage
是异步的,因此它在调用代码完成后运行很长时间(onBeforeSendHeaders侦听器)。不能在此侦听器中使用异步API。请切换到
window.localStorage
或将该值保留在全局变量中。@wOxxOm将更改为chrome.storage.local也有效?不,所有
chrome
API回调都是异步的。谢谢@wOxxOm,您的建议有效!
console.log("loaded");
btn = document.getElementById("toggleAgent");
chrome.storage.sync.get('ks', function(result){
    if (result.ks == 1){
        btn.innerText = "Turn on agent";
    }else{
        btn.innerText = "Turn off agent";
    }
});
btn.onclick = function(){
    chrome.storage.sync.get('ks', function(result){
        console.log(result);

        if (result.ks == 1){
            btn.innerText = "Turn off agent";
            chrome.storage.sync.set({ks: 0});
        }else{
            btn.innerText = "Turn on agent";
            chrome.storage.sync.set({ks: 1});
        }
    });
};