效果
实现代码:
1.搜索api有时效性
2.解析MP3地址同样道理
如失效,自行修改相应的api,如有更好的api或者方法,希望分享和谈论方法!
# -*- coding: utf-8 -*-
import requests
# from fake_useragent import UserAgent
import json
import os
from prettytable import PrettyTable
class Music:
limit = 10
# headers = {
# 'User-Agent': UserAgent().random
# }
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
}
def search_mscic(self, keyword):
api = 'http://music.163.com/api/search/pc'
params = {
's': keyword,
'offset': 0,
'limit': self.limit,
'type': 1
}
data = requests.get(api, headers=self.headers, params=params)
return data.text
def getInfo(self, keyword):
data = self.search_mscic(keyword)
songinfo = []
for i in range(self.limit):
songname = json.loads(data)['result']['songs'][i]['name']
songid = json.loads(data)['result']['songs'][i]['id']
album = json.loads(data)['result']['songs'][i]['album']['name']
artists = json.loads(data)['result']['songs'][i]['artists'][0]['name']
info = {
'songname': songname,
'songid': songid,
'album': album,
'artists': artists,
}
songinfo.append(info)
return songinfo
def url(self, id):
print('id:',id)
api = 'https://api.toubiec.cn/rand.music?type=netease'
params = {
'id': id
}
data = requests.get(api, headers=self.headers, params=params)
print(data.text)
url = json.loads(data.text)['data']['url']
return url
def url2(self,id):
url='http://music.163.com/song/media/outer/url?id={}.mp3'.format(id)
return url
def console(self, info):
tb = PrettyTable()
tb.field_names = ['序号', '歌曲', '歌手', '专辑']
for i in range(len(info)):
tb.add_row([i + 1, info[i]['songname'], info[i]['artists'], info[i]['album']])
print(tb)
def play(self, id, info):
i = int(id) - 1
songid = info[i]['songid']
url = self.url2(songid)
os.system('play {}'.format(url))
if __name__ == '__main__':
s = Music()
key = input('song:')
info = s.getInfo(key)
s.console(info)
q = input('play:')
s.play(q, info)