首页 > 解决方案 > Chrome webRequest API:onBeforeSendHeaders 事件不会更改标头

问题描述

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

清单.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"
    }
}

背景.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});
});

popup.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>Popup</title>
        <style>
            button{
                width: 100px;
            }
        </style>
    </head>
    <body>
        <button id="toggleAgent">Turn on agent</button>
        <script src="popup.js"></script>
    </body>
</html>

popup.js

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});
        }
    });
};

标签: google-chrome-extension

解决方案


推荐阅读