[c#]喜马拉雅FM音频批量下载器开发手记

本文详细介绍了使用C#开发喜马拉雅FM音频批量下载器的过程,包括程序原理、布局和实现步骤,如获取sound_ids、解析json、批量下载等。并提供了资源下载链接。
摘要由CSDN通过智能技术生成

[c#]喜马拉雅FM音频批量下载器开发手记

0、序言

第一次写C博,也不知道写些啥,正好近期做了一个用于喜马拉雅FM音频的批量下载器,虽然网络上之前就有,但是功能上来讲还没有满足自己需求,于是就照猫画虎弄了一个,比较懒,模仿了原作者的程序布局,希望看到了原谅则个!

1、程序原理

一直比较喜欢在喜马拉雅上下载有声小说,之前用移动端下载,奈何平时跑步经常只带一个头戴的mp3,所以常常需要把移动端的音频文件导到mp3里,改名什么的非常麻烦,于是萌生了去网站上下载的念头,进入网站,发现除了可以在线收听之外,还是需要在移动端下,虽然可以用资源嗅探挨个下载,费时费力,于是就想着既然浏览器可以解析到下载地址,那我必然可以分析出来,于是打开网站,进入一个专辑列表,点播放,进入开发者工具查看源代码,看到了以下HTML代码:

<div class="detailContent" sound_id="30496241">

注意到sound_id这个属性,英文字面上很好理解,声音编号,转到开发者工具(我使用的是遨游浏览器),点击网络(如图):
遨游浏览器开发者工具的'网络'位置
然后刷新页面,点击播放得到页面元素,并使用搜索过滤功能查找符合sound_id的页面元素:
搜索过滤
我搜索时找到了3个,看到json文件(地址组成为http://www.ximalaya.com/tracks/*.json,*的内容就是sound_id),毫不犹豫点进去:
找到的页面元素
可以看到截图所示的内容:
json文件内容
id、album_title、title、play_path、duration这些属性基本上一看就知道是些什么了。但是这只是一个音频的内容,难道我们要这样一个一个的找么,显然这不符合要求,于是,继续看网页源代码,发现如下代码:

<div class="personal_body" sound_ids="30496241,31457522,31478901,9654201,29151468,28253955,27433095,27015072,30256103,21214704,11213572,5470344,11408078,16069093,23015547,23553784,22941804,23242077,24275776,25617727,25092603,18592189,26049529,25702509,15147957,18153439,24583960,2832441,19796676,6115826,6626242,6366263">

看到sound_ids这个属性基本上万事就妥了,明显是一个id的序列。
于是就有了基本思路:1、获取专辑网址(这个应该由用户输入)–>2、获取专辑网页元素中的sound_ids–>3、从音频编号序列逐个获取音频编号–>4、使用编号按http://www.ximalaya.com/tracks/*.json规则获取json文件–>5、反序列化json文件–>6、获取id、album_title、title、play_path、duration这些属性并记录–>7、完成批量下载。

2、程序布局

程序的基本布局如图所示:
程序基本布局
程序由1个ToolStrip、1个TreeView、4个GroupBox、1个TextBox、3个Button、1个Label、3个CheckBox、1个DataGridView、1个FolderBrowserDialog、1个saveFileDialog、1个openFileDialog、1个timer组成。Toolstrip主要用实现常用功能按钮,TreeView用于显示专辑列表,TextBox支持多行,主要用于用户录入专辑网址,Label用于程序运行状态显示,DataGridView则用于显示下载列表,其他的控件功能在图上都可以看到。

3、程序实现

3.1获取sound_ids

需要获取sound_ids首先需要获取专辑网页的源代码,实现代码如下:

// 获取目标网页源代码
        private static string GetWebClient(string url)
        {
            try
            {
                string strHTML = "";
                WebClient myWebClient = new WebClient();
                Stream myStream = myWebClient.OpenRead(url);
                StreamReader sr = new StreamReader(myStream, System.Text.Encoding.GetEncoding("utf-8"));
                strHTML = sr.ReadToEnd();
                myStream.Close();
                return strHTML;
            }
            catch
            {
                return "网络状况不佳!";
            }
        }

然后分析网页源代码获取sound_ids:

// 获取Html字符串中指定标签的指定属性的值 
        private static List<string> GetHtmlAttr(string html, string tag, string attr)
        {
            Regex re = new Regex(@"(<" + tag + @"[\w\W].+?>)");
            MatchCollection imgreg = re.Matches(html);
            List<string> m_Attributes = new List<string>();
            Regex attrReg = new Regex(@"([a-zA-Z1-9_-]+)\s*=\s*(\x27|\x22)([^\x27\x22]*)(\x27|\x22)", RegexOptions.IgnoreCase);
            for (int i = 0; i < imgreg.Count; i++)
            {
                MatchCollection matchs = attrReg.Matches(imgreg[i].ToString());
                for (int j = 0; j < matchs.Count; j++)
                {
                    GroupCollection groups = matchs[j].Groups;
                    if (attr.ToUpper() == groups[1].Value.ToUpper())
                    {
                        m_Attributes.Add(groups[3].Value);
                        break;
                    }
                }
            }
            return m_Attributes;
        }

将两个方法整合方便使用:

// 获取sound_ids
        public static string GetSoundIDs(string url)
        {
            List<string> strs = GetHtmlAttr(GetWebClient(url), "div", "sound_ids");
            if
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值