基于公共IP修改请求头的Chrome扩展

Chrome Extension to Modify request headers based on Public IP

本文关键字:Chrome 扩展 请求 于公共 IP 修改      更新时间:2023-09-26

我正在尝试创建一个小型Chrome扩展,以便在用户位于我们的某个公共IP地址时添加一个标头。我对javascript还比较陌生,可能需要一些帮助。

以下是获取公共IP地址的功能:

function getIP(){
$.getJSON("http://ip-api.com/json",
        function(data){
            if(data.query == 'xxx.x.xxx.xxx'){var indist = 1;}else{var indist = 0;} 
            console.log(indist);
            return(indist);
        }); 
}

当我检索Pubic IP 时

var indist = getIP();

然后在Chrome扩展中修改标题。

chrome.webRequest.onBeforeSendHeaders.addListener(

function(details) {
        if(indist === 1){
        details.requestHeaders.push({name:"X-YouTube-Edu-Filter",value:"xxxxxxxxxxxxx"});
        return {requestHeaders: details.requestHeaders};}
},{urls: ["<all_urls>"]},["requestHeaders", "blocking"]
);

这是我的第一次尝试,我想我还没有得到结果。理想情况下,当用户在Youtube上请求任何内容时,我想检查用户的公共IP地址一次,然后根据该地址添加标题。

如有任何帮助,我们将不胜感激!

函数getIP实际上不返回任何内容,因为$.getJSON是异步的。

您的代码如下:

function getIP(){
  $.getJSON("http://ip-api.com/json", someFunction); 
}

这读作"将请求排队,完成后调用someFunction"。然后该语句终止,函数getIP结束,不返回任何内容。

因此,回调中的return值丢失了。

此外,您的范围界定是错误的:

if(data.query == 'xxx.x.xxx.xxx') {
  /* scope begins */
  var indist = 1; // Local, only exists within this branch!
  /* scope ends */
} else {
  var indist = 0;
} 
console.log(indist); // Is not related to above, probably undefined

作为一个简单的修复方法,由于您在onBeforeSendHeaders处理程序中使用了一个全局变量,因此只需在回调中分配它:

function getIP(){
  $.getJSON(
    "http://ip-api.com/json",
    function(data) {
      if(data.query == 'xxx.x.xxx.xxx') { 
        indist = 1; // GLOBAL variable
      } else {
        indist = 0;
      } 
      console.log(indist);
    }
  );
}

也就是说,您可能希望限制代码造成的损害。在每一个网络请求上运行阻塞代码会使Chrome慢到爬行。重写代码,只在满足条件时启用处理程序,然后可能只在YouTube请求上运行它。

function getIP(){
  $.getJSON(
    "http://ip-api.com/json",
    function(data) {
      chrome.webRequest.onBeforeSendHeaders.removeListener(addHeader);
      if(data.query == 'xxx.x.xxx.xxx') { 
        chrome.webRequest.onBeforeSendHeaders.addListener(
          addHeader,
          {urls: ["*://*.youtube.com/*"]},
          ["requestHeaders", "blocking"]
        );
      }
    }
  );
}
function addHeader(details) {
  details.requestHeaders.push({name:"X-YouTube-Edu-Filter",value:"xxxxxxxxxxxxx"});
  return {requestHeaders: details.requestHeaders};
}