def get_reply(params, encSecKey):
url https://music.163.com/weapi/song/enhance/player/url/v1?csrf_token
payload params parse.quote(params) encSecKey parse.quote(encSecKey)
headers {
authority : music.163.com ,
user-agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36 ,
content-type : application/x-www-form-urlencoded ,
accept : */* ,
origin : https://music.163.com ,
sec-fetch-site : same-origin ,
sec-fetch-mode : cors ,
sec-fetch-dest : empty ,
referer : https://music.163.com/ ,
accept-language : zh-CN,zh;q 0.9
response requests.request( POST , url, headers headers, data payload)
return response.text
def res():
url_list []
name_list []
song_name input( 请输入歌曲名称 按回车键搜索 )
d { hlpretag : span class s-fc7 , hlposttag : /span , s : song_name, type : 1 , offset : 0 ,
total : true , limit : 30 , csrf_token : }
d json.dumps(d)
random_param get_random()
param get_final_param(d, random_param)
song_list get_music_list(param[ params ], param[ encSecKey ])
print( 搜索结果如下 )
if len(song_list) 0:
song_list json.loads(song_list)[ result ][ songs ]
for i, item in enumerate(song_list):
item json.dumps(item)
print(str(i 1) json.loads(str(item))[ name ])
d { ids : [ str(json.loads(str(item))[ id ]) ] , level : standard , encodeType : ,
csrf_token : }
d json.dumps(d)
param get_final_param(d, random_param)
song_info get_reply(param[ params ], param[ encSecKey ])
if len(song_info) 0:
song_info json.loads(song_info)
song_url json.dumps(song_info[ data ][0][ url ], ensure_ascii False) # 歌曲url
print(song_url)
url_list.append(song_url) # url放入列表
name_list.append(json.loads(str(item))[ name ])
else:
print( 该首歌曲解析失败 可能是因为歌曲格式问题 )
歌曲下载界面
while True:
print( 下载选择:1-20,ALL全部,Q返回查找,Z退出程序,显示为null的表示没有版权或vip才能下载 )
song_id input( 请输入下载编号: )
if song_id ALL :
for j in range(len(url_list)):
url url_list[j].replace( , )
name name_list[j] url.split( / )[-1].split( . )[0]
try:
mp3 requests.get(url url, headers { User-Agent : UserAgent().random}).content
with open(f ./{name}.mp3 , wb ) as f:
f.write(mp3)
print(name, 下载完成 )
except:
print(name, 这首歌无法下载 )
continue
else:
print( 这首歌已下载! )
break
if song_id Q :
res()
break
if song_id Z :
print( 退出下载 )
break
if int(song_id) 1 and int(song_id) 20:
# print(str(url_list[song_id-1]),name_list[song_id-1])
url url_list[int(song_id) - 1].replace( , )
name name_list[int(song_id)-1] url.split( / )[-1].split( . )[0]
try:
mp3 requests.get(url url,headers { User-Agent :UserAgent().random}).content
except:
print(name, 这首歌无法下载! )
continue
with open(f ./{name}.mp3 , wb ) as f:
f.write(mp3)
print(name, 下载完成 )
else:
print( 请根据提示输入!本次程序 )
res()
break
else:
print( 很抱歉 未能搜索到相关歌曲信息 )