基於.NET的音樂搜索與播放軟件(C#,爬取4個平臺:酷我/網易雲/酷狗/QQ)

前言的前言

我怕閱讀者看完之後想打洗我,因此作個說明。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獲取指定音樂的地址

1,酷狗音樂研究

a、獲取搜索列表

首先打開谷歌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 是否有效。

 

 b、獲取歌曲地址

搜索列表相對來講仍是比較容易獲取的,歌曲地址就有點麻煩了。

咱們先找一首歌,進入試聽界面,依舊在左側找到咱們要的音樂地址:

 

這個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 兩個參數,由於有時候沒有這兩個參數,其實也獲取不到正確結果。

關於 dfidmid 兩個參數,其實主要是酷狗對客戶身份的區分,有時候獲取不到正確結果,能夠試着替換這兩個參數的值(在程序裏,這兩個值也能夠經過配置文件來動態設置的)。

至此,咱們完成獲取歌曲列表獲取歌曲地址的操做。

 

c、梳理一下

咱們流程,應該是這樣的:首先獲取歌曲列表 -> 記錄每一首歌的FileHash -> 根據FileHash 經過歌曲地址的上一級地址獲取歌曲地址 -> 成功獲取歌曲地址

 

二、酷狗音樂爬取 c# 程序實現

既然研究完了協議,咱們就來擼代碼了。

 代碼……見最後……

此處省略一萬字……(2021年1月14日。)

 

三,源碼和運行環境

源碼地址:

  https://gitee.com/chen3322275/UnLockMusic

  https://github.com/lisheng741/UnLockMusic

運行環境:VS2013可直接打開,無數據庫鏈接 有自定義配置文件(txt文本,在 \bin\Debug\config.txt )

界面截圖:(醜是醜了點,這只是個十幾天作的小 project,別介意)

相關文章
相關標籤/搜索