2014-10-10 51 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

相關問題