我在使用 regexFilter 捕获 URL 并将其重定向到扩展页面时遇到问题。在 Chrome 上,我最终遇到了损坏的 URL 和无限的重定向循环。在勇敢的情况下,我收到 ERR_BLOCKED_BY_CLIENT。我正在尝试捕获任何 MPEG-DASH 或 HLS 流 URL 以在扩展程序中播放它。 服务人员看起来像这样:
var enabled = true;
var extension_page = chrome.runtime.getURL('/index.html');
var substitution = extension_page + "#\\0"
var rules = [{
id: 1,
action: {
type: 'redirect',
redirect: { regexSubstitution: substitution },
},
condition: {
regexFilter: '^https?://.*/(.*\\.m3u8?|.*\\.mpd|Manifest).*',
resourceTypes: ['main_frame', 'sub_frame'],
},
}];
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if (request == "getState") {
sendResponse(enabled);
return;
}
enabled = request == "ENABLE";
enabled ? chrome.action.setIcon({path: "assets/icon128.png" }) : chrome.action.setIcon({ path:"assets/icon128grey.png" });
if(true === enabled) {
chrome.declarativeNetRequest.updateDynamicRules({
removeRuleIds: rules.map(r => r.id),
addRules: rules,
});
} else {
chrome.declarativeNetRequest.updateDynamicRules(chrome.declarativeNetRequest.updateDynamicRules({
removeRuleIds: rules.map(r => r.id)
}));
}
});
chrome.declarativeNetRequest.updateDynamicRules({
removeRuleIds: rules.map(r => r.id),
addRules: rules,
});
manifest.json 看起来像这样
{
"name": "Native MPEG-Dash + HLS Playback",
"version": "5.0.0",
"description": "Allow the browser to play HLS (m3u8) or MPEG-Dash (mpd) video urls 'natively'",
"manifest_version": 3,
"icons": { "128": "assets/icon128.png" },
"background": {
"service_worker": "new_service_worker.js",
"type": "module"
},
"permissions": [
"tabs",
"declarativeNetRequest",
"storage"
],
"host_permissions": [
"<all_urls>"
],
"options_ui": {
"page": "options.html"
},
"action": {
"default_title": "Native MPEG-Dash + HLS Playback",
"default_icon": "assets/icon128.png",
"default_popup": "popup.html"
}
}
使用一个示例,我最终得到了极其错误的重定向循环:
https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fpschrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#chrome-extension://iepdffliopgmnnmohpmdhclhdhkoonea/index.html#.mpd
在 Brave 上,我最终遇到了 ERR_BLOCKED_BY_CLIENT。此外,将流媒体 URL 直接粘贴到 Brave 地址栏也可以。
此解决方案位于 通过 declarativeNetRequest + extensionPath 重定向时获取原始 URL
我尝试了不同的正则表达式变体,但没有成功。
所以我发现,尽管我完全删除并重新安装了扩展程序,但还是有一些旧规则在微风中飘扬。所以不要自己做这件事
var rules = [{
id: 2,
action: {
type: 'redirect',
redirect: { regexSubstitution: substitution },
},
condition: {
regexFilter: '^https?://.*/.*\\.m3u8?|.*\\.mpd|Manifest.*',
resourceTypes: ['main_frame', 'sub_frame'],
},
}];
chrome.declarativeNetRequest.updateDynamicRules({
removeRuleIds: rules.map(r => r.id),
addRules: rules,
});
我使用 getDynamicRules 删除了之前的所有规则,然后添加了正确的规则
chrome.declarativeNetRequest.getDynamicRules().then(function(oldRules) {
chrome.declarativeNetRequest.updateDynamicRules({
removeRuleIds: oldRules.map(r => r.id),
addRules: rules,
});
console.log(chrome.declarativeNetRequest.getDynamicRules());
});
我在重定向时仍然遇到 ERR_BLOCKED_BY_CLIENT。
编辑
按照此处的建议添加 web_accessible_resources 解决了 ERR_BLOCKED_BY_CLIENT Chrome 阻止重定向到扩展页面
"web_accessible_resources": [{
"resources": [ "/index.html" ],
"matches": [ "<all_urls>" ]
}]