[裹脚布一样]从巨鲸网下载MP3的shell[/裹脚布一样]

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
wiewi
帖子: 628
注册时间: 2008-11-20 22:50
系统: ArchLinux

[裹脚布一样]从巨鲸网下载MP3的shell[/裹脚布一样]

#1

帖子 wiewi » 2011-07-25 14:15

声明:1 程序很脆弱,各种问题、bug、漏洞,楼主不善编程,请轻拍。
2 巨鲸网提供海量正版免费音乐,据说姚明有投资,楼主很土前段时间才知道。
3 目前已知的问题中比较严重的一个是有时候下载需要验证码,我这里没办法处理,结果就是下载到一堆的html。用浏览器打开巨鲸,随便点首歌下载,输入一次验证码,脚本就可以下载到了
4 符合某个条件的结果如果排列超过一页,默认只下载第一页的,后面的不做处理。比如搜索‘周杰伦’的歌,会有很多页,程序只下载第一页的将近100首。
5 关于wget,为防止下载中文曲目乱码,一开始使用的是--local-encoding=UTF-8,需要支持IRI的wget,那个blog的链接暂时打不开了;后来搜到别人说的--restrict-file-names选项,改成现在这样。
[bash]
[root@new-host-13 ~]# cat downmp3
#!/bin/bash
# Download top100 songs in http://www.top100.cn
# 11/07/22, First Edition
# 11/07/24, 按歌名、歌手搜索完成,按专辑搜索完成
# Author: Wei Li, [email protected]
# Mail: [email protected]

# Site
SITE='www.top100.cn'
LINK='www.top100.cn/download/download.aspx?Productid='

DIR=$HOME/tmp/downmp3
PACK=$DIR/package
LIST=$DIR/list
PAGE=$DIR/page
VALUE=$DIR/value
DOWN=$DIR/download
DOWNDIR=$HOME/music

Usage(){
cat << USAGE
======================================================================
Usage: Get MP3 files from http://www.top100.cn
`basename $0` option [keywords]
`basename $0` -h / --help Show help information
`basename $0` -t / --top Get top classic songs
`basename $0` -p / --pop Get top 100 pop songs
`basename $0` -c / --country Get top 100 country songs
`basename $0` -r / --rock Get top 100 rock songs
`basename $0` -s / --search [ -a | -S | -A ] keywords
Search songs with keywords of artist | song | album
=======================================================================
USAGE
exit 0
}

GetHtml(){
# Get html names and generate full url for different packages
wget "http://$SITE/packages/" -O $PACK 2>/dev/null | iconv -f GBK

cat "$PACK" | grep 'info-pk'| awk -F'><' '{print $2}' | awk '{print $2}' | awk -F '/' '{print $3}' | sed 's/.$//' | uniq > $LIST
sed -i 's/^/http:\/\/www.top100.cn\/packages\//g' $LIST
}

GetValue(){
# Get mp3 links from a package
wget $1 -O $PAGE | iconv -f GBK
cat $PAGE | sed -n '/value/{/checksong/p}' | awk '{print $9}' | awk -F '"' '{print $2}' | sed 's/^m//g' >> $VALUE
}

GetMp3(){
while read line
do
wget $LINK$line -O $DOWN | iconv -f GBK
url=`cat $DOWN | sed -n '/href="http/p' | awk -F '"' '{print $2}' | uniq`

# 有防盗链接,且启用IRI支持,否则下载后文件名乱码;-nc跳过已存在文件不下载。
wget -c $url --ref=$LINK$line --restrict-file-names=nocontrol -nc
done < $VALUE
}

Clear(){
# for i in `ls $DIR`
# do
# rm -f $DIR/"$i"
# echo
# done
rm -f $DIR/*
#exit 0
}

GetTop100()
{
GetHtml

[ -f "$VALUE" ] && rm -f "$VALUE"

while read line
do
GetValue $line
done < $LIST

mkdir -pv $DOWNDIR && cd $DOWNDIR
GetMp3
Clear
exit 0
exit 0
}

GetSong(){
case $1 in
pop)
DEST=$DOWNDIR/pop
FILE=$DIR/pop
WEBPAGE='http://www.top100.cn/categories/allsong-69.shtml'
;;
rock)
DEST=$DOWNDIR/rock
FILE=$DIR/rock
WEBPAGE='http://www.top100.cn/categories/allsong-84.shtml'
;;
country)
DEST=$DOWNDIR/country
FILE=$DIR/country
WEBPAGE='http://www.top100.cn/categories/allsong-67.shtml'
;;
esac

[ -d "DEST" ] || mkdir -pv $DEST
cd $DEST

[ -f "$FILE" ] && rm -f "$FILE"
wget -c $WEBPAGE -O $FILE | iconv -f GBK
[ -f "$VALUE" ] && rm -f "$VALUE"
cat $FILE | sed -n '/argument/{/checkbox/p}' | awk -F '"' '{print $8}' | sed 's/^m//g' >> $VALUE
GetMp3
Clear
exit 0
}

Search()
{
case $1 in
-a | --artist)
# 默认只下载搜索结果的第一页
SEARCH="http://www.top100.cn/search/allartist.aspx?keyword=$2"
NAME=`echo $2 | tr -d ' '`
wget "$SEARCH" -O $DIR/$NAME | iconv -f GBK

RESULT="www.top100.cn/artist/`cat $DIR/$NAME | grep "所有单曲" | awk -F '/' '{print $3}' | awk -F '"' '{print $1}'`"
GetValue $RESULT
mkdir -pv $DOWNDIR/$NAME && cd $DOWNDIR/$NAME
unset NAME
GetMp3
Clear
exit 0
;;
-S | --song)
IFS=$'\n'
NAME=`echo $2 | tr -d ' '`
SEARCH="http://www.top100.cn/search/allsong.aspx?keyword=$2"
wget $SEARCH -O $DIR/$NAME | iconv -f GBK ; sed -i '1,75d' $DIR/$NAME # 删除文件头部
SONGS=(`cat "$DIR"/$NAME | sed -n "/"$2"/{/javascript/p}" | sed 's/<[^>]*>//g' | sed 's/^...//g'| sed 's/\\r//'`)
ARTISTS=(`cat $DIR/$NAME | grep 'artist' | sed 's/<[^>]*>//g' | sed 's/^...//g'| sed 's/\\r//'`)
ALBUMS=(`cat $DIR/$NAME | grep 'album' | sed 's/<[^>]*>//g' | sed 's/^...//g'| sed 's/\\r//'`)

i=0
while [ ! -z "${SONGS}" ]
do
echo -e "$[i+1]: ${SONGS} | ${ARTISTS} | ${ALBUMS}\n"
((i=i+1))
done

echo "Enter your choice(1 for Default):"
read choice

if [ -z "$choice" ];then
choice=1
fi

CODE=`cat $DIR/$NAME | sed -n "/$2/{/title/p}" | sed 's/.*(.//' | sed 's/.).*//' | sed 's/^m//' | sed -n "$choice"p`

wget $LINK$CODE -O $DOWN | iconv -f GBK

url=`cat $DOWN | sed -n '/href="http/p' | awk -F '"' '{print $2}' | uniq`
cd $DOWNDIR
# 有防盗链接,且启用IRI支持,否则下载后文件名乱码;-nc跳过已存在文件不下载。
wget -c $url --ref=$LINK$line --restrict-file-names=nocontrol -nc
Clear
exit 0
;;

-A | --album)
IFS=$'\n'
SEARCH="http://www.top100.cn/search/allalbum.aspx?keyword=$2"
NAME=`echo $2 | tr -d ' '`

wget "$SEARCH" -O $DIR/$NAME

ALBUMS=(`cat $DIR/$NAME | grep '语种' | sed 's/<[^>]*>/ /g' | awk -F ':' '{print $2}'|sed 's/艺术家//g'`)
ARTISTS=(`cat $DIR/$NAME | grep '语种' | sed 's/<[^>]*>/ /g' | awk -F ':' '{print $3}'|sed 's/语种//g'`)
i=0
while [ -n "${ALBUMS}" ];
do
echo -e ""$[i+1]": "${ALBUMS}" | "${ARTISTS}"\n"
((i=i+1))
done

echo "Enter your choice(1 for Default):"
read choice

if [ -z "$choice" ];then
choice=1
fi
CODE=`cat $DIR/$NAME | grep '语种' | sed -n "$i"p | awk -F '"' '{print $4}' | awk -F '/' '{print $3}'`
URL="http://www.top100.cn/album/$CODE"
GetValue $URL
mkdir -pv $DOWNDIR/${ALBUMS[$choice-1]} && cd $DOWNDIR/${ALBUMS[$choice-1]}
GetMp3
Clear
exit 0
;;

*)
Usage
;;
esac

}

[ -d "$DIR" ] || mkdir -pv "$DIR"
[ -d "$DOWNDIR" ] || mkdir -pv "$DOWNDIR"
Clear

case $1 in
-h | --help) Usage;;
-t | --top) GetTop100;;
-p | --pop) GetSong pop;;
-c | --country) GetSong country;;
-r | --rock) GetSong rock;;
-s | --search) shift; Search "$@";;
*) Usage;;
esac
[/bash]
图片一张,公司电脑上截的,全屏,没处理。
附件
Screenshot.png
===我的小窝===
无聊吗?点我吧,楼主迫切期待你的光临~~
又一个轮子
------------------------------------
这年头,没有1000贴都不好意思见人了
------------------------------------
献丑不如藏拙
------------
achen.han
帖子: 442
注册时间: 2010-09-08 23:33

Re: [裹脚布一样]从巨鲸网下载MP3的shell[/裹脚布一样]

#2

帖子 achen.han » 2011-07-25 14:24

支持一下。
头像
月下叹逍遥
论坛版主
帖子: 33994
注册时间: 2010-10-07 14:23
系统: Archdows10
来自: 某系某星某洲某国某省某市
联系:

Re: [裹脚布一样]从巨鲸网下载MP3的shell[/裹脚布一样]

#3

帖子 月下叹逍遥 » 2011-07-25 14:39

:em11
浮生七十今三十,从此凄惶未可知
头像
liuerfire
帖子: 145
注册时间: 2010-04-24 21:57

Re: [裹脚布一样]从巨鲸网下载MP3的shell[/裹脚布一样]

#4

帖子 liuerfire » 2011-07-25 22:31

:em11 :em11 :em11 :em11
我是要成为海贼王的男人!
个人博客
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: [裹脚布一样]从巨鲸网下载MP3的shell[/裹脚布一样]

#5

帖子 eexpress » 2011-07-25 23:07

广告真多的网站。
网页格式不规范。
● 鸣学
rediscover
帖子: 3173
注册时间: 2010-01-13 23:26

Re: [裹脚布一样]从巨鲸网下载MP3的shell[/裹脚布一样]

#6

帖子 rediscover » 2011-07-25 23:10

用 gmbox 就很好了。 :em06
Here I am.
Ubuntu 桌面培训 - 全中文官方文档,含汉化截图,提供PDF
charliephil
帖子: 4
注册时间: 2011-07-23 3:29

Re: [裹脚布一样]从巨鲸网下载MP3的shell[/裹脚布一样]

#7

帖子 charliephil » 2011-07-27 14:07

搞的什么东东!!不要搞破坏哦!!
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
联系:

Re: [裹脚布一样]从巨鲸网下载MP3的shell[/裹脚布一样]

#8

帖子 xiooli » 2011-07-27 14:56

发现个语法错误,不是 for default,是 by default
回复