我怕阅读者看完之后想打洗我,因此作个说明。php
这个项目构建于 2020年1月,这篇文章开始写于 2020年2月底,而后如今是 2021年1月14日。好吧我一直懒,因此没写完没发布。html
而后到 2021年,也不想细究之前怎么实现这个项目了,读者本身研究吧,啊哈哈……(太不负责任了,打洗丢掉不要了)python
一、模拟搜索:经过关键字,获取歌曲列表
二、获取歌曲关键信息(歌曲ID之类的惟一标识)
三、使用指定方法(某个url),根据歌曲ID获取歌曲播放地址
四、将歌曲下载到本地,实现下载或播放
限制:vip音乐大多无法爬取(酷我除外),并且为试听品质
代码内容相对较少,代码编写规范,我的认为是很好的入门projectgit
整个项目分三步走,第一步,构思;第二步,研究;第三步,实现。github
(如要转载,请注明出处和做者!)web
首先,咱们本身没有音乐资源,也没有谁家的服务器提供相应的服务(API),那么,就要找有这些资源的,谁有?chrome
答:酷我音乐,QQ音乐,酷狗音乐,网易云音乐……数据库
对,没错,咱们就是要撸这4个平台的音乐。那咱们要怎么撸?json
答:爬取。c#
经过网页端的试听,将试听的音乐爬取下来。(是的,这个项目只能爬取试听音质,VIP才能听的也爬不下来,因此,要求高的同窗仍是乖乖买个VIP吧)
接着,既然要爬取,那就要研究怎么拿到对方的MP3(其实就是一段URL),这个第二部分说明
最后,这个项目实际上是爬虫项目,爬虫多用python,然,本人工做须要,因此用c#。
一开始是想作成web版的,无奈解决不了跨域问题,因此作成客户端版。
总的,项目内容以下:第一部分介绍项目构(chui)思(shui),第二部分介绍如何爬取各个音乐平台的音乐,第三部分介绍软件的设计。
另外,本文章的读者应该具有:首先,知道如何打开并使用谷歌浏览器chrome的开发者工具(F12);接着,知道VS2013(或者相近版本)的基本操做,以及c#的基本语法;最后,不懂要会百度、谷歌、必应、360搜索……
各个平台爬取难度不一,酷狗<QQ<酷我<网易云。其中酷狗会封IP,须要不时(应该是定时,或者定频率,未研究)登陆网页端完成验证,其余平台未发现问题。
要爬取音乐,分两步走:1先获取音乐搜索列表,2获取指定音乐的地址
首先打开谷歌chrome,打开酷狗首页,进入搜索页面(URL:https://www.kugou.com/yy/html/search.html#searchType=song&searchKeyWord=九万字),接着打开开发者工具(F12),页面以下:
在搜索框中输入歌名,找到搜索时 发送请求的url 。以下图:
咱们搜索歌曲时获取歌曲列表就要用这个url(截图中,歌名 “九万字” 被URL编码了):https://complexsearch.kugou.com/v2/search/song?callback=callback123&keyword=九万字&page=1&pagesize=30&bitrate=0&isfuzzy=0&tag=em&inputtype=0&platform=WebFilter&userid=-1&clientver=2000&iscorrection=1&privilege_filter=0&srcappid=2919&clienttime=1594010330190&mid=1594010330190&uuid=1594010330190&dfid=-&signature=1B0D26199D1F3DA254B426375BE1A262
这个url 里面带了不少参数,通常来讲不少参数是没必要须的(能够清洗掉)。
不过酷狗这个新的搜索url 少一个参数都不给显示结果。可是呢,其实除了 keyword 这个参数,其余都是能够固定不理的。
实际上,我的研究这个项目的时候(2020年年初),酷狗搜索歌曲列表的url 是另外一个,就是项目代码里面的这个(通过清洗的): https://songsearch.kugou.com/song_search_v2?&keyword=<<SongName>>&platform=WebFilter
其中<<SongName>> 替换为歌名便可。
这两个url 目前均可以使用。
能够直接在浏览器测试咱们找得这两个url 是否有效。
搜索列表相对来讲仍是比较容易获取的,歌曲地址就有点麻烦了。
咱们先找一首歌,进入试听界面,依旧在左侧找到咱们要的音乐地址:
这个url 是https://webfs.yun.kugou.com/202007061248/306902e1e09339160b4cc565848fe108/G108/M00/1A/19/TJQEAFwkeLyANMZ9ADisal-ma54680.mp3
很明显,这就是咱们要的歌曲的地址。
可是,问题来了,这个地址哪里来的呢?
咱们不妨搜索一下:
这里,我输入的搜索内容为:TJQEAFwkeLyANMZ9ADisal-ma54680.mp3
搜出了三个url,第一个url 点进去,能够找到咱们要的 play_url 。很明显,这个url (这里咱们暂称这个url 为歌曲地址的上一级地址)就是咱们要的了。
歌曲地址的上一级地址 为:https://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery191008139216889751522_1594011139696&hash=D5E394C859D20B095070ADBBFC80C2E6&album_id=14636608&dfid=33ZR3t41Vu4d0jGuk71ttSX4&mid=c596eb268a2705383a10d0af021664c0&platid=4&_=1594011139697
这个url
能够看到里面仍是要参数,这些参数应该就是标识歌曲的相关参数了,咱们能够从上一步骤(获取歌曲列表)里面获取的数据找找看,是否都在里面:
很遗憾……咱们只找到了两个参数,FileHash 和 album_id。
那么 dfid 和 mid ,还有 platid 和 _ 这几个奇奇怪怪的参数怎么办呢?
咱们先清洗一下参数:
咱们先试着去掉 &_=1594011139697 这部分,在浏览器输入剩下的 url ……
好像能够获取正确的结果。
很好,这个参数很明显是无用参数,丢……
来,咱们继续去掉 &platid=4 这部分,依旧能获得正确结果。
……
重复尝试,发现必须参数只有一个,那就是 FileHash (这里说明一下,callback=jQuery191008139216889751522_1594011139696 这个参数最好仍是去掉吧,由于去掉后返回的结果是 json ,能够直接转化为 json)
这未免也太舒服了……只须要一个 FileHash 参数,并且这个参数能够轻松从 获取歌曲的列表 里找到。
这里补充一下,通过重复试验,其实最好保留 dfid 和 mid 两个参数,由于有时候没有这两个参数,其实也获取不到正确结果。
关于 dfid 和 mid 两个参数,其实主要是酷狗对客户身份的区分,有时候获取不到正确结果,能够试着替换这两个参数的值(在程序里,这两个值也能够经过配置文件来动态设置的)。
至此,咱们完成获取歌曲列表,获取歌曲地址的操做。
咱们流程,应该是这样的:首先获取歌曲列表 -> 记录每一首歌的FileHash -> 根据FileHash 经过歌曲地址的上一级地址获取歌曲地址 -> 成功获取歌曲地址
既然研究完了协议,咱们就来撸代码了。
代码……见最后……
此处省略一万字……(2021年1月14日。)
源码地址:
https://gitee.com/chen3322275/UnLockMusic
https://github.com/lisheng741/UnLockMusic
运行环境:VS2013可直接打开,无数据库链接 有自定义配置文件(txt文本,在 \bin\Debug\config.txt )
界面截图:(丑是丑了点,这只是个十几天作的小 project,别介意)