我正在尝试编写一个扩展程序,当它检测到Chrome请求它们时会下载音频文件。我将这个项目基于Google提供的两个样本“Download_links”和“catifier”的代码。这是我现在拥有的:
var RequestMatcher = chrome.declarativeWebRequest.RequestMatcher;
var IgnoreRules = chrome.declarativeWebRequest.IgnoreRules;
var RedirectRequest = chrome.declarativeWebRequest.RedirectRequest;
var songFileURL = "http://somefile.mp3";
...
function registerRules() {
var redirectRule = {
priority: 100,
conditions: [
new RequestMatcher({
contentType: ['audio/mp3']
}),
],
actions: [
chrome.downloads.download({url: songFileURL}),
]
};
...
当我加载它并尝试它时,我收到一个错误:Uncaught Error: Invalid value for argument 1. Property '.0': Value does not match any valid type choices.
无论我尝试什么,我都无法弄清楚导致此错误的原因。我对Chrome扩展程序和JavaScript一般都很公平,所以我确信这是一个简单的解决方法,但我无法理解。有什么想法吗?
答案 0 :(得分:3)
我认为问题在于您指定了不受支持的操作。可以在the chrome.declarativeWebRequest
page上找到可用操作列表。
我认为您应该使用chrome.webRequest.onBeforeRequest
,onHeadersReceived
或onComplete
来跟踪媒体链接并从那里启动自定义下载,可能会以某种延迟方式,因为我不确定{ {1}}只能从另一个请求处理程序工作。
要开始,您可以查看Google的CatBlock示例,或其他related answer或another one。基本上,您需要通过downloads
添加适当的事件处理程序,并在处理程序调用{{1}}中,其中addListener
作为输入参数传递给处理程序。
您应根据自己的要求决定选择哪个事件(例如chrome.downloads.download({url: request.url})
或request
)。据我了解,您不希望阻止原始请求,因此等待原始下载完成,然后在onBeforeRequest
处理程序中处理它可能会很有用,这样Chrome就可以通过仅复制来优化该过程从缓存中下载文件。
作为替代方案,您可以通过从每个声音文件的onComplete
处理程序返回onComplete
来阻止初始下载,然后将其作为单个文件开始下载,可能涉及{cancel: true}
选项。