当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 6 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 炒个冷饭吧, baidu mp3下载, 带gui的shell脚本
帖子发表于 : 2008-10-30 16:31 

注册: 2007-10-22 2:21
帖子: 15
送出感谢: 0 次
接收感谢: 0 次
最近找不到工作, 持续失业中, 非常的郁闷, 无聊之中, 写脚本自娱自乐...
没什么技术含量, 纯属学习和练习, 代码里做了详细的注释
代码:
#!/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


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 炒个冷饭吧, baidu mp3下载, 带gui的shell脚本
帖子发表于 : 2008-10-30 16:56 
头像

注册: 2006-04-12 20:05
帖子: 8495
地址: 杭州
送出感谢: 0 次
接收感谢: 8
:em05


_________________
关注我的blog: ε==3


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 炒个冷饭吧, baidu mp3下载, 带gui的shell脚本
帖子发表于 : 2008-10-30 17:30 
头像

注册: 2007-11-19 21:51
帖子: 6956
地址: 成都
送出感谢: 0 次
接收感谢: 4
恩,加上了地址解密,还带了个龟壳 :em05
ps:为啥不直接在列表那儿选择要下的歌曲呢?


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 炒个冷饭吧, baidu mp3下载, 带gui的shell脚本
帖子发表于 : 2008-11-19 14:38 

注册: 2006-09-08 18:57
帖子: 115
送出感谢: 0 次
接收感谢: 2
好强大的脚本啊!


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 炒个冷饭吧, baidu mp3下载, 带gui的shell脚本
帖子发表于 : 2008-11-19 19:33 
头像

注册: 2007-08-26 15:57
帖子: 278
送出感谢: 0 次
接收感谢: 0 次
rikhtdss 写道:
好强大的脚本啊!


我的为什么下载不下来?提示下载了,但是并没有找到下载的文件。


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 炒个冷饭吧, baidu mp3下载, 带gui的shell脚本
帖子发表于 : 2008-11-20 20:02 

注册: 2007-10-22 2:21
帖子: 15
送出感谢: 0 次
接收感谢: 0 次
回xiooli: 我本来是想在列表那选择的, 但是试了好长时间都不行, 你看我注释的那一大段, 就是那个意思
回tianping: 我终于找到工作了, 最近比较忙, 所以没有再看过这个, 恩, 我的代码注释写得很详细的, 你可以找找问题出在哪


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 6 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译