2013-03-19 2 views
11

Я пытаюсь реализовать API chrome.webRequest в своем расширении, но по какой-то причине он просто не работает независимо от того, что я делаю. Может ли кто-нибудь опубликовать пример использования? или исправить мои ошибки? В основном, что я пытаюсь сделать, это перехватить полученные заголовки из ответа.chrome.webRequest не работает?

Это реализация для onBeforeSendHeaders, но я хотел бы использовать OnHeadersRecieved, а :

var requestFilter = { 
    urls: [ "<all_urls>" ] 
    }, 
    // The 'extraInfoSpec' parameter modifies how Chrome calls your 
    // listener function. 'requestHeaders' ensures that the 'details' 
    // object has a key called 'requestHeaders' containing the headers, 
    // and 'blocking' ensures that the object your function returns is 
    // used to overwrite the headers 
    extraInfoSpec = ['requestHeaders','blocking'], 
    // Chrome will call your listener function in response to every 
    // HTTP request 
    handler = function(details) { 
    alert(details); 
    var headers = details.requestHeaders, 
     blockingResponse = {}; 

    // Each header parameter is stored in an array. Since Chrome 
    // makes no guarantee about the contents/order of this array, 
    // you'll have to iterate through it to find for the 
    // 'User-Agent' element 
    for(var i = 0, l = headers.length; i < l; ++i) { 
     if(headers[i].name == 'User-Agent') { 
     headers[i].value = '>>> Your new user agent string here <<<'; 
     break; 
     } 
     // If you want to modify other headers, this is the place to 
     // do it. Either remove the 'break;' statement and add in more 
     // conditionals or use a 'switch' statement on 'headers[i].name' 
    } 

    blockingResponse.requestHeaders = headers; 
    return blockingResponse; 
    }; 

chrome.webRequest.onBeforeSendHeaders.addListener(handler, requestFilter, extraInfoSpec); 

это мой файл манифеста:

{ 
    "background_page": "iRBackground.html", 
    "browser_action": { 
     "default_icon": "Off.png", 
     "popup": "iRMenu.html" 
    }, 
    "content_scripts": [ { 
     "js": [ "Content.js" ], 
     "matches": [ "http://*/*" ], 
     "run_at": "document_start" 
    } ], 
    "description": "***", 
    "icons": { 
     "128": "On128x128.png", 
     "16": "On.png", 
     "48": "On48x48.png" 
    }, 
    "key": "****", 
    "manifest_version": 2, 
    "name": "***", 
    "permissions": [ "tabs", "notifications", "unlimitedStorage", "webRequest", “webRequestBlocking”, “<all_urls>”], 
    "update_url": "***/Chrome/UpdateVersion.xml", 
    "version": "1.3" 
} 

ошибка, я получаю от Chrome является: Uncaught TypeError: Cannot read property 'onBeforeSendHeaders' of undefined

Кто-нибудь видит что-то не так ??? спасибо

+0

API 'webRequest' доступен только для процесса расширения (например, для фона/события). –

+1

Этот фрагмент написан на моей странице фона .. – user1326293

+0

, пожалуйста, дайте нам полный манифест –

ответ

24

Хорошо для примера использования Я могу дать вам этот рабочий код. Я написал это так, потому что другой способ кажется мне обратным, но это только мои личные предпочтения, они должны работать одинаково.

Manifest

{ 
    "name": "Chrome webrequest test", 
    "version": "0.1", 
    "description": "A test for webrequest", 
    "manifest_version": 2, 
    "permissions": [ 
    "<all_urls>","webRequest","webRequestBlocking" 
    ], 
    "background": { 
    "scripts": ["bgp.js"], 
    "persistent": true 
    } 
} 

bgp.js

chrome.webRequest.onBeforeSendHeaders.addListener(function(details){ 
    //console.log(JSON.stringify(details)); 
    var headers = details.requestHeaders, 
    blockingResponse = {}; 

    // Each header parameter is stored in an array. Since Chrome 
    // makes no guarantee about the contents/order of this array, 
    // you'll have to iterate through it to find for the 
    // 'User-Agent' element 
    for(var i = 0, l = headers.length; i < l; ++i) { 
    if(headers[i].name == 'User-Agent') { 
     headers[i].value = '>>> Your new user agent string here <<<'; 
     console.log(headers[i].value); 
     break; 
    } 
    // If you want to modify other headers, this is the place to 
    // do it. Either remove the 'break;' statement and add in more 
    // conditionals or use a 'switch' statement on 'headers[i].name' 
    } 

    blockingResponse.requestHeaders = headers; 
    return blockingResponse; 
}, 
{urls: [ "<all_urls>" ]},['requestHeaders','blocking']); 
+1

Привет, я создал папку с двумя файлами: manifest.json и bgp.js и ввел данные u, предоставленные соответственно, и загрузил их как распакованное расширение. позже я попробовал код, который не работал, но позже я попытался вставить некоторое предупреждение() в bgp.js, которое тоже ничего не запускает ... есть идея, что я делаю неправильно? – user1326293

+0

@ user1326293 Это именно то, что у меня есть, и он работает отлично. Здесь я помещаю файлы в [zip] (https://dl.dropbox.com/u/12636410/webRequest.zip). Извлеките его, а затем повторите попытку. Есть ли какие-либо сообщения в консоли расширения? – BeardFist

+0

спасибо, я выяснил, что проблема была в моей хромовой версии ... тем не менее ваш пример помог :) спасибо – user1326293

4

Я просто фиксированной это в моем расширении здесь: https://github.com/devinrhode2/tweet-bar Что мне нужно сделать, это использовать chrome.webRequest.onBeforeSendHeaders.addListener, но это также означает, добавление в разрешения webRequest, webRequestBlocking .. было бы лучше использовать declarativeWebRequest, но этот проект не является тем impo Мне кажется.

Ключевые вещи:

  • manifest.json "background": { "persistent": true,
  • "permissions": [ "webRequest", "webRequestBlocking",

Когда вы сделаете эти изменения в manifest.json, вы должны действительно рассмотреть повторно установить расширение только чтобы убедиться, что изменения подбирается.

Это мой код фильтра. Ваш не должен быть идентичным. Посмотреть документы здесь https://developer.chrome.com/extensions/webRequest

chrome.webRequest.onBeforeSendHeaders.addListener((req) => { 
    console.log('onBeforeSendHeaders'); 
    req.requestHeaders.forEach(function(header, index){ 
    console.log(header.name+':', header.value); 
    if (headers[header.name.toLowerCase()]) { 
     console.log('set header:'+header.name, 'to:'+headers[header.name.toLowerCase()]); 
     req.requestHeaders[index].value = headers[header.name.toLowerCase()] 
    } 
    }) 
    return {requestHeaders: req.requestHeaders}; 
},{ 
    urls: ['https://twitter.com/i/tweet/create'], 
    types: ["xmlhttprequest"] 
},[ 
    'blocking', 
    'requestHeaders' 
]); 

Я также добавил эти заголовки на мой запрос XHR, который не пострадал, заставляет вас выглядеть более похоже на нормальный сайт:

//add headers: 
    var headers = { 
    'content-type': 'application/x-www-form-urlencoded', 
    accept: 'application/json, text/javascript, */*; q=0.01', 
    origin: 'https://twitter.com', 
    referer: 'https://twitter.com/', 
    'x-requested-with': 'XMLHttpRequest' 
    }; 
    console.log('change') 
    Object.keys(headers).forEach((header) => { 
    postXhr.setRequestHeader(header, headers[header]); 
    }) 
+1

«... вы должны действительно рассмотреть возможность повторной установки расширения только для того, чтобы убедиться, что изменения подхватываются». Переустановка расширения сделала трюк за меня спасибо! –

0

Вот манифест конфигурации

"permissions": [ 
    "webRequestBlocking" 
    ,"webRequest" 
    ,"http://*.beibei.com/*" 
], 
"background" : { 
    "page"  : "xxx.html", 
    "persistent" : true 
} 

Вот Javascript демонстрационный код

$(function() { 
    // add event listners 
    chrome.webRequest.onBeforeRequest.addListener(
     function(details) { 
      console.log('onBeforeRequest', details); 
     }, 
     {urls: ["http://www.beibei.com/"]}, 
     [] 
    ); 

    chrome.webRequest.onBeforeSendHeaders.addListener(
     function(details) { 
      console.log('onBeforeSendHeaders', details); 
     }, 
     {urls: ["http://www.beibei.com/"]}, 
     ["requestHeaders"] 
    ); 

    chrome.webRequest.onCompleted.addListener( 
     function(details) { 
      console.log('onCompleted', details); 
     }, 
     {urls: ["http://www.beibei.com/"]}, 
     [] 
    ); 

    // do a GET request, so that relative events will be fired, need jquery here 
    $.get('http://www.beibei.com/'); 
}); 
Смежные вопросы