Skip to content

Commit 375bf64

Browse files
committed
2 parents 4a9ab38 + 1f05039 commit 375bf64

File tree

3 files changed

+222
-0
lines changed

3 files changed

+222
-0
lines changed

moumoubaimifan/music/miguMusic.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# coding=utf-8
2+
import json
3+
4+
import requests
5+
from urllib.parse import quote
6+
import urllib
7+
8+
9+
class MiGuMusic(object):
10+
11+
def __init__(self):
12+
pass
13+
14+
def get_request(self, url, params = None):
15+
try:
16+
headers = {
17+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'
18+
}
19+
response = requests.get(url, headers=headers, params=params)
20+
if response.status_code == 200:
21+
return response
22+
else:
23+
return None
24+
except TimeoutError:
25+
print("网络不佳,请重新下载")
26+
return None
27+
except Exception as err:
28+
print("请求出错:", err)
29+
return None
30+
31+
32+
33+
def search_music(self, key):
34+
pagesize = "10"
35+
36+
url = 'http://m.music.migu.cn/migu/remoting/scr_search_tag'
37+
key = urllib.parse.quote(key)
38+
params = {'rows': pagesize, 'type': 2, 'keyword': key, 'pgc': 1, }
39+
resp = self.get_request(url, params=params)
40+
41+
resp.encoding = 'utf-8'
42+
resp_json = json.loads(resp.text)
43+
44+
musics = resp_json["musics"]
45+
song_list = []
46+
47+
for song in musics:
48+
resp = self.get_request(song['mp3'])
49+
if resp:
50+
msg = 'Y'
51+
else:
52+
msg = 'N'
53+
54+
song_list.append({'name': song['songName'], 'songmid': None, 'singer': song['singerName'],
55+
'downloadUrl': song['mp3'], 'msg': msg, 'type': 'mp3'})
56+
return song_list
57+
58+
def main(self, key):
59+
song_list = self.search_music(key)
60+
return song_list
61+
62+
if __name__ == '__main__':
63+
miguMusic = MiGuMusic()
64+
miguMusic.search_music('陈奕迅')

moumoubaimifan/music/qqMusic.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
# coding=utf-8
2+
import random
3+
4+
import requests
5+
import json
6+
7+
8+
class QQMusic(object):
9+
10+
11+
def __init__(self):
12+
pass
13+
14+
def get_request(self, url):
15+
try:
16+
headers = {
17+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'
18+
}
19+
response = requests.get(url, headers = headers)
20+
if response.status_code == 200:
21+
return response
22+
except Exception as e:
23+
print("请求出错:", e)
24+
25+
return None
26+
27+
28+
def search_music(self, key):
29+
url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p=1&n=%d&w=%s' % (20, key)
30+
resp = self.get_request(url)
31+
resp_json = json.loads(resp.text[9:][:-1])
32+
data_song_list = resp_json['data']['song']['list']
33+
song_list = []
34+
for song in data_song_list:
35+
singers = [s.get("name", "") for s in song.get("singer", "")]
36+
song_list.append({'name': song['songname'], 'songmid': song['songmid'], 'singer': '|'.join(singers)})
37+
print(song_list)
38+
return song_list
39+
40+
def download_url(self, song):
41+
guid = str(random.randrange(1000000000, 10000000000))
42+
43+
purl_url = 'https://u.y.qq.com/cgi-bin/musicu.fcg?' \
44+
'&data={"req":{"param":{"guid":" %s"}},' \
45+
'"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"%s","songmid":["%s"],"uin":"%s"}},"comm":{"uin":%s}}' \
46+
% (guid, guid, song['songmid'], 0, 0)
47+
48+
resp = self.get_request(purl_url)
49+
50+
if resp is None:
51+
return 'N', 'None', '.m4a'
52+
53+
resp_json = json.loads(resp.text)
54+
55+
purl = resp_json['req_0']['data']['midurlinfo'][0]['purl']
56+
57+
if len(purl) < 1:
58+
msg = 'N'
59+
60+
download_url = 'http://ws.stream.qqmusic.qq.com/' + purl
61+
song_data = self.get_request(download_url)
62+
if song_data:
63+
msg = 'Y'
64+
65+
return msg, download_url, '.m4a'
66+
67+
68+
def main(self, key):
69+
song_list = self.search_music(key)
70+
for song in song_list:
71+
msg, download_url, type = self.download_url(song)
72+
song['msg'] = msg
73+
song['downloadUrl'] = download_url
74+
song['type'] = type
75+
return song_list
76+
77+
78+
79+
80+

moumoubaimifan/music/run.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# coding=utf-8
2+
import os
3+
4+
from qqMusic import QQMusic
5+
from miguMusic import MiGuMusic
6+
from prettytable import PrettyTable
7+
8+
9+
class MusicBox(object):
10+
11+
def __init__(self):
12+
pass
13+
14+
def download(self, data, songName, type):
15+
16+
save_path = 'music/' + songName + '.' + type
17+
file = 'music'
18+
if os.path.exists(file):
19+
pass
20+
else:
21+
os.mkdir('music')
22+
23+
try:
24+
print("{}下载中.....".format(songName), end='')
25+
with open(save_path, 'wb') as f:
26+
f.write(data)
27+
print("已下载完成")
28+
except Exception as err:
29+
print("文件写入出错:", err)
30+
return None
31+
32+
def main(self):
33+
print('请输入需要下载的歌曲或者歌手:')
34+
key = input()
35+
print('正在查询..\033[32mQQ音乐\033[0m', end='')
36+
qqMusic = QQMusic()
37+
qq_song_list = qqMusic.main(key)
38+
print('...\033[31m咪咕音乐\033[0m')
39+
miguMusic = MiGuMusic()
40+
migu_song_list = miguMusic.main(key)
41+
42+
qq_song_list.extend(migu_song_list)
43+
song_dict = {}
44+
for song in qq_song_list:
45+
key = song['name'] + '\\' + song['singer']
46+
s = song_dict.get(key)
47+
if s:
48+
if s['msg'] != 'Y':
49+
song_dict[key] = song
50+
else:
51+
song_dict[key] = song
52+
53+
i = 0
54+
55+
table = PrettyTable(['序号', '歌手', '下载', '歌名'])
56+
table.border = 0
57+
table.align = 'l'
58+
for song in list(song_dict.values()):
59+
i = i + 1
60+
table.add_row([str(i), song['singer'], song['msg'], song['name']])
61+
print(table)
62+
63+
while 1:
64+
print('\n请输入需要下载,按 q 退出:')
65+
index = input()
66+
if index == 'q':
67+
return
68+
69+
song = list(song_dict.values())[int(index) - 1]
70+
data = qqMusic.get_request(song['downloadUrl'])
71+
if song['msg'] == 'Y':
72+
self.download(data.content, song['name'], song['type'])
73+
else:
74+
print('该歌曲不允许下载')
75+
76+
if __name__ == '__main__':
77+
musicBox = MusicBox()
78+
musicBox.main()

0 commit comments

Comments
 (0)