Chrome扩展程序可根据公共IP修改请求标头

时间:2014-10-10 15:09:55

标签: javascript google-chrome google-chrome-extension

我正在尝试创建一个小型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地址一次,然后根据该地址添加标头。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:4)

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

您的代码如下所示:

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

这就是&#34;对请求进行排队,以及何时完成呼叫someFunction&#34;。然后语句终止,你的函数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);
    }
  );
}

那就是说,您可能希望限制代码所造成的损害。在EVERY SINGLE网络请求上运行阻止代码会降低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};
}