现在百度的mp3连接是通过加密的有javascript生成的,所以一般的脚本已经无法
下载了,现在我编了一个脚本可以下载,不过它依赖于一个基于Gecko的浏览
器,conkeror (www.conkeror.org)使用Debian的可以直接安装:
apt-get install conkeror
下载之后将一些代码复制到~/.conkerorrc文件中(这是默认的rc,如果你进行了定
制请放到合适的rc中),然后启动conkeror,修改mp3path为自己的mp3存储路
径,Alt-x输入top500脚本会自动下载,可以通过一个类似firefox的下载管理器来
查看下载信息。
注意:
1. 脚本没30秒下载一首歌
2. 脚本不会处理下载失败的情况
3. 如果嫌load太慢的话可以按一下 r 键
这个浏览器是模仿Emacs,但它的功能还相当不完善,调试javascript脚本也相当
不方便, 而本人又是第一次写javascript里面可能又许多不合理的地方。
脚本:
var addrs = new Array()
var songs = new Array()
var authors = new Array()
var pos = 0
var mp3path = “/data/music/mp3/”
function parse_and_download_song(buffer)
{
var href = buffer.document.getElementById(”urln”)
var element = href
var spec = element_get_load_spec(element);
file = get_file(mp3path + songs[pos] + “-” + authors[pos++] + “.mp3″)
save_uri(spec, file,
$buffer=buffer,
$use_cache = false);
if(pos < addrs.length)
{
buffer.window.minibuffer.message(”downloading “+ pos + ” of ” + addrs.length + ” song …”);
timer = call_after_timeout(function () {
remove_hook.call(buffer,”content_buffer_finished_loading_hook”,parse_and_download_song);
open_in_browser(buffer, OPEN_CURRENT_BUFFER,addrs[pos]);
add_hook.call(buffer,”content_buffer_finished_loading_hook”,parse_download_list);
}, 10000); //30 seconds
}
else
{
remove_hook.call(buffer,”content_buffer_finished_loading_hook”,parse_and_download_song);
buffer.window.minibuffer.message(”baidu top500 download finished!”);
}
}
function parse_download_list(buffer)
{
var table = buffer.document.getElementById(”Tbs”);
if(table == null)
return;
var tds = table.getElementsByClassName(”d”);
var addr;
for(var i = 0; i < tds.length; i++)
{
var a = tds[i].firstChild.href;
aa = a.split(”,”)
if(aa[1].substr(aa[1].length - 3, 3) == “mp3″)
{
addr = a;
break;
}
}
timer = call_after_timeout(function () {
remove_hook.call(buffer,”content_buffer_finished_loading_hook”,parse_download_list);
open_in_browser(buffer, OPEN_CURRENT_BUFFER,addr);
add_hook.call(buffer,”content_buffer_finished_loading_hook”,parse_and_download_song);
}, 1);
}
function parse_top_list(buffer)
{
var tables = buffer.document.documentElement.getElementsByClassName(”list”);
if(tables.length == 0)
return;
var table = tables[0];
var tds = table.getElementsByClassName(”th”);
for (var i = 0; i < tds.length; i++) {
var std = tds[i].nextSibling.nextSibling;
addrs[i] = std.firstChild.href;
if(std.firstChild.firstChild.firstChild != null)
songs[i] = std.firstChild.firstChild.firstChild.nodeValue
else
songs[i] = std.firstChild.firstChild.nodeValue
authors [i] = “”
for(var j = 1; j < std.childNodes.length;j++){
if (std.childNodes[j].firstChild != null &&
std.childNodes[j].nodeName == “A”)
authors[i] += std.childNodes[j].firstChild.nodeValue;
}
}
timer = call_after_timeout(function () {
remove_hook.call(buffer,”content_buffer_finished_loading_hook”,parse_top_list);
open_in_browser(buffer, OPEN_CURRENT_BUFFER,addrs[pos]);
add_hook.call(buffer,”content_buffer_finished_loading_hook”,parse_download_list);
}, 1);
}
function open_top500 (buffer) {
open_in_browser(buffer, OPEN_CURRENT_BUFFER,”http://list.mp3.baidu.com/topso/mp3topsong.html?id=1?top2″);
add_hook.call(buffer,”content_buffer_finished_loading_hook”,parse_top_list);
// not open a download manager window, use download_manager_show_builtin_ui instead
download_manager_builtin_ui.show(buffer.window);
remove_hook(”download_added_hook”, open_download_buffer_automatically);
}
interactive (”top500″, “download top500″,
function (I) {
open_top500(I.buffer)
});