用Chrome扩展API获取豆瓣FM音乐地址

标签:Google Chrome

豆瓣FM是我很喜欢的一个服务,不过比起百度ting来说,它不提供下载和点播功能,让我这种听到好歌就想收藏的人比较郁闷。
虽说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有点不合适,因为它可不区分是不是豆瓣的音乐…

13条评论 你不来一发么↓ 顺序排列 倒序排列

    向下滚动可载入更多评论,或者点这里禁止自动加载

    想说点什么呢?