没什么技术含量, 纯属学习和练习, 代码里做了详细的注释
代码: 全选
#!/bin/bash
MUSIC_DIR="~/Desktop" #音乐下载到的目录
search_key() {
keyword=`zenity --entry --title=百度MP3下载 --text=请输入歌名:` #获取歌名
if (($?==1)); then #歌名为空就退出
exit 0
fi
if [ `locale | grep "LANG=.*UTF-8"` ]; then #检查输出的歌名编码, 并转换成url中的编码
key=`echo "$keyword" | iconv -c -f utf-8 -t gbk | \
od -t x1 -A n | tr "\n" " " | tr " " % | sed 's/%%/%/g;s/%0a%$//'`
else
key=`echo "$keyword" | \
od -t x1 -A n | tr "\n" " " | tr " " % | sed 's/%%/%/g;s/%0a%$//'`
fi
#获取歌曲列表的那个网页
wget "http://mp3.baidu.com/m?f=ms&tn=baidump3&ct=134217728&lf=&rn=&word="$key"&lm=-1" \
-O ./tmp_src1.htm -q
#下面这段为什么不行呢, 谁能告诉我啊...
#w3m -dump "./tmp_src1.htm" | grep -E -m 31 "歌曲名|^[0-9]" | \
# sed 's/试听//g' | sed 's/歌词/ /g' | sed 's/铃声/ /g' | \
# sed 's/\[d9\]//g' | sed 's/链接速//g' >> list.tmp
#
#opt=$(zenity --list --text "请选择你要下载的歌曲" --checklist --column "选择" --column "歌曲列表" \
# `i=0
# while read line; do
# echo -n "FALSE \"$line\""
# done < list.tmp`
# --separator=":")
#
#echo $opt
#去除无用的信息, 然后显示歌曲列表
w3m -dump "./tmp_src1.htm" | grep -E -m 31 "歌曲名|^[0-9]" | \
sed 's/试听//g' | sed 's/歌词/ /g' | sed 's/铃声/ /g' | \
sed 's/\[d9\]//g' | sed 's/链接速//g' | \
zenity --title="歌曲列表" --text-info --width 530 --height 540 &
}
download_list() {
songid=`zenity --entry --title=百度MP3下载 --text=请输入你要下载的歌曲序号:`
if (($?==1)); then #没有输入, 退出
killall -q zenity
exit 0
fi
tmp_src2=`cat "tmp_src1.htm" | \
LANG=C grep -A5 "<td class=tdn>"$songid"</td>" | \
LANG=C grep "class=d" | \
LANG=C sed 's/" title.*$//g' | \
sed 's/^.*href="//g'`
#上面这段从grep那行开始, 每一行的作用分别是:
#1.得到第$songid首歌附近的代码 2.得到有url的那行 3.去尾 4.去头
#下载小页面
wget "$tmp_src2" -O ./tmp_src2.htm -q
#从小页面的js中得到歌曲的加密地址
codeurl=`cat ./tmp_src2.htm | LANG=C grep "function" | \
LANG=C sed 's/^.*I="//g' | LANG=C sed 's/",J=.*$//g'`
#下面的部分是解密歌曲地址
head=`echo $codeurl | cut -c1` #取首字母
thirdc=`echo $codeurl | cut -c4` #根据冒号的位置判断url类型(ftp还是http)
forthc=`echo $codeurl | cut -c5`
if [ "$thirdc" == ':' ]; then
key="fghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcde" #ftp
elif [ "$forthc" == ':' ]; then
key="hijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg" #http
else
key="Unknow Url" #这可以换成别的处理方法
fi
#根据首字母构造字符串
urlQue=`echo "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" | \
sed "s/^\(.*\)${head}\(.*\)/${head}\2\1/g"` #把$codeurl首字母以前的字母都放在最后面
#用tr转换
realurl=`echo $codeurl | tr $urlQue $key`
#解密歌曲地址部分结束
#下载歌曲, 并用zenity显示进度
wget -P $MUSIC_DIR "$realurl" 2>&1 | \
sed -u 's/.*\ \([0-9]\+%\)\ \+\([0-9.]\+\ [KMB\/s]\+\)$/\1\n# 下载中... \2/' | \
zenity --progress --title="下载歌曲"
}
#清理零时文件
clean() {
rm -f ./tmp_src1.htm
rm -f ./tmp_src2.htm
killall -q zenity
}
#----------------------------------------main-------------------------------------------#
goonrun=0
while [ $goonrun = 0 ]; do
clean
search_key
goonlist=0
while [ $goonlist = 0 ]; do
download_list
zenity --question --text "要继续下载列表中的歌曲吗?"
let goonlist=$?
done
zenity --question --text "下载另一首歌吗?"
let goonrun=$?
done
clean