用Chrome扩展API获取豆瓣FM音乐地址
2011 12 7 01:27 AM 5979次查看
分类:Google Chrome 标签:Google Chrome
虽说Chrome的Developer Tools可以显示资源的地址,但它只能记录打开以后的请求,而平时并不会预先打开。
于是想起Chrome扩展提供了一个实验性的WebRequest API,只要让它在后台把所有请求过滤一下,然后将.mp3文件列出来就行了。
于是创建一个扩展,在permissions里启用"experimental",并在chrome://flags里启用Experimental Extension APIs(实验性扩展程序 API)。
接着在扩展的background_page里加上这段JavaScript代码:
chrome.experimental.webRequest.onResponseStarted.addListener(
function(details) {
if (details.url.substr(-4) == '.mp3') {
console.log(details.url);
}
}
);
然后在chrome://settings/extensionSettings里启用开发者模式,载入这个扩展,并点击“检查活动视图”后你设置的background_page。再打开豆瓣FM,等到音乐播放后,那个活动视图的控制台里就会显示出音乐的地址了。
可惜的是豆瓣提供的音乐品质很低:位速率64 kbps (VBP),采样速率24kHz。所以追求品质的还是支持正版吧…
顺带一提,WebRequest API里还提供了其他事件,不过我们不需要阻塞和修改请求,所以使用onResponseStarted比较合适。加上它还是异步的,不会影响下载速度。
不过查log也比较麻烦,于是再加上一个browser action,使得点击按钮时就自动打开最近的一首音乐:
var last_music;
chrome.experimental.webRequest.onResponseStarted.addListener(
function(details) {
last_music = details.url;
console.log(last_music);
}, {urls: ["*://*/*.mp3"]}
);
chrome.browserAction.onClicked.addListener(function() {
if (last_music) {
chrome.tabs.create({url: last_music});
};
});
这里我使用了filter这个可选参数来过滤URL,并且把URL保存到last_music变量里。而在点击按钮时,就创建一个新的tab来打开last_music。然后你就可以右键另存为了…此外,filter里还能指定tabId和windowId。这样就可以用chrome.tabs.onUpdated.addListener来获悉所有的豆瓣FM的tabId,然后只抓取这些tab的音乐了。而当获取以后,还能在原始页面里插入一个下载链接。
不过我很懒,加上实验性扩展是不能发布到Chrome Web Store的,于是就这样将就了。
最后,这个玩意也在bitbucket上开源了,实在不想自己动手的就直接伸手吧…
不过话说回来,这个玩意叫Douban FM Downloader有点不合适,因为它可不区分是不是豆瓣的音乐…
向下滚动可载入更多评论,或者点这里禁止自动加载。