【QQ音樂播放器】

項目需求

① 模擬QQ音樂網頁中的搜索和下載功能:

  • 輸入歌手或歌名搜索出相關的歌曲列表,然後可選下載。
  • 可以將歌曲下載到本地。下載到本地的命名方式爲:歌名+歌手+id,下載信息同步到 MySQL 數據
    庫,用於檢測是否重複下載。

一、首先去QQ音樂尋找音頻下載接口:

隨便搜索一首歌:

然後打開Chrome瀏覽器的開發者工具,同時點擊播放歌曲:

接下來找到media類型的文件,顯然我們要的音樂就是最大的那個文件,點開它:

打開這個URL:

至此,我們就成功找到了QQ音樂的音頻下載接口。


二、分析音樂下載接口:

https://isure.stream.qqmusic.qq.com/C400003y3tQK2JZaau.m4a?
guid=4441071008&
vkey=6A1D99170713A9FFA58B61103D38450398E41C3ACDABF3F3E6FF170FB936B9239C1412F189015FE08484D930C1F11B39CD37EA7443CFC395&
uin=0&
fromtag=66

先分析一下這首歌的songmid參數

可以看到這首歌的songmid參數003y3tQK2JZaau,是URL的C400後面的部分。

songmid從命名角度看,是歌曲的唯一標識符

而其餘的參數在音頻文件上就可以找到:


三、接下來分析搜索接口:

打開搜索框,輸入歌曲名字,攔截搜索請求:

接下來對該URL進行解碼:

分析一下URL裏面的參數,以剔除一些不必要的參數:

https://c.y.qq.com/soso/fcgi-bin/client_search_cp?
ct=24&
qqmusic_ver=1298&
new_json=1&
remoteplace=txt.yqq.top&
searchid=35829660933924128&
t=0&
aggr=1&
cr=1&
catZhida=1&
lossless=0&
flag_qc=0&
p=1&
n=10&
w=你要相信這不是最後一天&
g_tk_new_20200303=1944343149&
g_tk=1944343149&
loginUin=0&
hostUin=0&
format=json&
inCharset=utf8&
outCharset=utf-8&
notice=0&
platform=yqq.json&
needNewCode=0

這裏發現搜索的關鍵字就是w參數

剔除不必要的參數之後,如下:

https://c.y.qq.com/soso/fcgi-bin/client_search_cp?&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=10&w=歌曲或歌手名稱


四、通過搜索接口提取信息:

import requests
import json

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}

url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=20&w=你要相信這不是最後一天'

response = requests.get(url, headers=headers)

js1 = json.loads(response.text.strip('callback()'))
js1 = js1['data']['song']['list']

print(js1)

Output:

這樣,我們就成功提取歌曲信息了。

然後構建列表把相關信息存入即可:

medias = []
song_mid = []
src = []
song_names = []
singers = []

for rest in js1:
    medias.append(rest['media_mid'])
    song_mid.append(rest['songmid'])
    song_names.append(rest['songname'])
    singers.append(rest['singer'][0]['name'])

但我們從這裏只是提取到了songmid參數,要想下載歌曲,還得提取到vkey參數


https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?&jsonpCallback=MusicJsonCallback&cid=205361747&songmid=

通過這個接口,我們可以獲取vkey:

for n in range(0, len(medias)):
    url2 = 'https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?&jsonpCallback=MusicJsonCallback&cid=205361747&songmid=' + song_mid[n] + '&filename=C400' + medias[n] + '.m4a&guid=4441071008'
    rest2 = get_request(url2)
    # print(rest2.text)
    js2 = json.loads(rest2.text)
    print(js2)

在這裏插入圖片描述

接下來,就可以通過下載接口下載歌曲了:

for n in range(0, len(medias)):
    try:
        url2 = 'https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?&jsonpCallback=MusicJsonCallback&cid=205361747&songmid=' + song_mid[n] + '&filename=C400' + medias[n] + '.m4a&guid=4441071008' # 重要參數提取接口
        rest2 = self.get_request(url2)
        js2 = json.loads(rest2.text)
        vkey = js2['data']['items'][0]['vkey']
        src.append('https://isure.stream.qqmusic.qq.com/C400' + medias[n] + '.m4a?vkey=' + vkey + '&guid=4441071008&uin=0&fromtag=66') # 下載接口
    except:
        print("檢測到異常,請重新下載")
        break
print("*"*30)
for m in range(0, len(src)):
    print("%-4d" % (int(m+1)) + '《' + song_names[m] + '》' + ' - ' + singers[m])
song_index = int(input("請選擇序號:").strip())
if song_index < 0:
    print("退出QQ音樂爬蟲程序")
    break
try:
    song_data = self.get_request(src[song_index - 1])
    data = song_data.content
    self.download(data, song_names[song_index-1])
except Exception as er:
    print("檢測到異常,請重新下載 ", er)

運行程序:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章