ヘッダーを変更するはずのページで拡張機能を実行したときにログに記録される完全なエラーを次に示します。
Error in event handler: TypeError: Error in invocation of webRequestInternal.eventHandled(string eventName, string subEventName, string requestId, integer webViewInstanceId, optional webRequest.BlockingResponse response): Error at parameter 'response': Error at property 'requestHeaders': Error at index 1: Error at property 'value': Invalid type: expected string, found object.
at subEventCallback (extensions::webRequestEvent:82:28)
ハンドラーが呼び出されるたびにログに記録され、ご想像のとおり、リクエストは正常に変更されません。
また、これとまったく同じコードが以前は機能していましたが、拡張機能の残りの部分を変更したため、機能しなくなりました。したがって、これはどこかで愚かな小さな間違いであると想定する必要がありますが、変更を元に戻しても問題は解決しませんでした。残念ながら、私は愚かなのでバージョン管理を使用しませんでしたが、教訓を学びました。
そして、ここにコードと関連ファイルがあります。問題は ua-req.js のハンドラーにあります。いくつかの詳細をそこにあるデータの説明に置き換えました。それらは山かっこで囲まれています。
マニフェスト.json
{
"manifest_version": 2,
"name": "<name>",
"version": "<version>",
"background": {
"scripts": [
"constants.js",
"ua-cache.js",
"ua-req.js"
],
"persistent": true
},
"permissions": [
"cookies",
"storage",
"webRequest",
"webRequestBlocking",
"*://*.<URL>.com/*"
]
}
ua-cache.js
// Since getting the user agent from storage is async, it will only get done
// in time and be accessible from our listener if it's fetched and cached
// in a separate script that's loaded before it
// after this, cachedUA will be a string
var cachedUA = FB_UA;
const UA_LIST = "<STORAGE_KEY>";
(function() {
chrome.storage.local.get(UA_LIST, (res) => {
cachedUA = res[UA_LIST] || EDGE_UA; // or in case of a cache miss
});
})();
ua-req.js
chrome.webRequest.onBeforeSendHeaders.addListener(
function(details) {
for (let i = 0; i < details.requestHeaders.length; ++i) {
if (details.requestHeaders[i].name == "User-Agent") {
details.requestHeaders[i].value = cachedUA;
break;
}
}
return {requestHeaders: details.requestHeaders};
}, {urls: [URL_FILTER]}, ["blocking", "requestHeaders"]);
定数.js
// fallback user agent if pastes cannot be fetched
const FB_UA = "<FALLBACK_USERAGENT>";
// domain of search engine
const ENGINE_TLD = "<URL>.com";
const URL_FILTER = `*://*.${ENGINE_TLD}/*`;
また、私はこの拡張機能を Vivaldi で実行していますが、他のブラウザーでは試していません。通常の Chrome では問題を再現できない可能性があります。Vivaldi は個人用の拡張機能であり、Vivaldi は日常的に使用するブラウザーであるため、Vivaldi で動作させる必要があります。
前もって感謝します。