2014-10-10 75 views
0

我想创建一个小的Chrome扩展插件,当用户在我们的公共IP地址之一时添加标头。我相对较新的JavaScript,并可以使用一些帮助。Chrome扩展程序修改基于公共IP的请求标头

这里是让公网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); 
     }); 
} 

当我取回耻骨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地址,然后根据该地址添加标题。

任何帮助将不胜感激!

回答

3

您的功能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}; 
} 
+0

谢谢你的详细解释。你已经非常帮助! – 2014-10-16 01:55:41