def lyric(self, url): lyric = self.httpRequest(url, method='GET', headers=self.lyricHeader) with ignored(): lyric = lyric.split('[offset:0]')[1] lyric = re.sub(r'<\d*?>', '', lyric) return lyric with ignored(): loadingLyric = {} lyricTimes = [] for i in lyric.split('\n'): oneLyric = re.findall(r'[0-9:\.]+', i) if not oneLyric or oneLyric == [':']: continue else: for x in oneLyric: i = i.replace('[{}]'.format(x), '') for x in oneLyric: loadingLyric[x] = i lyricTimes.extend(oneLyric) return '\n'.join([ '[{time}]{content}'.format(time=x, content=loadingLyric.get(x)) for x in sorted(lyricTimes) ]) return False
def lyric(self, url): lyric = self.httpRequest(url, method='GET', headers=self.lyricHeader) with ignored(): lyric = lyric.split('[offset:0]')[1] lyric = re.sub(r'<\d*?>', '', lyric) return lyric with ignored(): loadingLyric = {} lyricTimes = [] for i in lyric.split('\n'): oneLyric = re.findall(r'[0-9:\.]+', i) if not oneLyric or oneLyric == [':']: continue else: for x in oneLyric: i = i.replace('[{}]'.format(x), '') for x in oneLyric: loadingLyric[x] = i lyricTimes.extend(oneLyric) return '\n'.join(['[{time}]{content}'.format(time=x, content=loadingLyric.get(x)) for x in sorted(lyricTimes)]) return False
def search(self, key): url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&'+\ 'new_json=1&remoteplace=txt.yqq.center&searchid=43541888870417375&t=0&aggr=1'+\ '&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=50&'+\ 'w={0}'.format(urllib.parse.quote(key))+\ '&g_tk=5381&jsonpCallback=searchCallbacksong6064&loginUin=0&hostUin=0&'+\ 'format=jsonp&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0' response = self.httpRequest(url, method='GET') with ignored(): data = json.loads(response[len('searchCallbacksong6064('):-len(')')]) data = data['data']['song'] newDatas = {} newDatas['songCount'] = data['curnum'] - 1 songs = [] for i in data['list']: songs.append({ 'name': i['name'], 'ar': [{'name': ';'.join([x['name'] for x in i['singer']])}], 'al': {'picUrl': self._getImgUrl(i['album']['mid'])}, 'dt': i['interval'] * 1000, 'id': i['id'], # 当然这里不是mp3,为了统一接口这样写。 'mp3Url': self._getSongUrl(i['mid']), 'lyric': 'qq' }) newDatas['songs'] = songs return newDatas return False
def _getSongUrlVkey(self, mid): # 获取得到QQ音乐歌曲地址所需的vkey。 # 返回的是vkey。 vkey_url = 'https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg' params = { 'g_tk': '5381', 'jsonpCallback': 'MusicJsonCallback8571665793949388', 'loginUin': '0', 'hostUin': '0', 'format': 'json', 'inCharset': 'utf8', 'outCharset': 'utf-8', 'notice': '0', 'platform': 'yqq', 'needNewCode': '0', 'cid': '205361747', 'callback': 'MusicJsonCallback8571665793949388', 'uin': '0', 'songmid': mid, 'filename': 'C400' + mid + '.m4a', 'guid': '{}'.format(self.guid) } response = self.httpRequest(vkey_url, method="GET", headers=self.headers, params=params) with ignored(): data = json.loads(response[response.find("{"):-1]) return data['data']['items'][0]['vkey'] return False
def getPlaylist(self, ids): url = 'https://shc.y.qq.com/qzone/fcg-bin/fcg_ucc_getcdinfo_byids_cp.fcg?type=1&json=1&utf8=1&onlysong=0'+\ '&disstid={0}&format=jsonp&g_tk=5381&jsonpCallback=playlistinfoCallback&loginUin=0&hostUin=0&'.format(ids)+\ 'format=jsonp&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0' response = self.httpRequest(url, method='GET', headers=self.playlistHeaders) with ignored(): data = json.loads(response[len('playlistinfoCallback('):-len(')')]) data = data['cdlist'][0] newDatas = {} newDatas['trackCount'] = data['total_song_num'] newDatas['name'] = data['dissname'] newDatas['creator'] = {'nickname': data['nick']} newDatas['description'] = data['desc'] songs = data['songlist'] # imgUrl = 'https://y.gtimg.cn/music/photo_new/' for i in songs: i['name'] = i['songname'] i['artists'] = [{'name': ';'.join([x['name'] for x in i['singer']])}] i['duration'] = int(i['interval']) * 1000 # i['album'] = {'blurPicUrl': imgUrl + 'T002R300x300M000' + i['albummid'] + '.jpg'} i['album'] = {'blurPicUrl': self._getImgUrl(i['albummid'])} # i['mp3Url'] = '{0}C400{1}.m4a?vkey={2}&guid={3}'.format(self.sip, i['songmid'], self.key, self.guid) i['mp3Url'] = self._getSongUrl(i['songmid']) i['lyric'] = 'qq' newDatas['tracks'] = songs return newDatas return False
def search(self, key): url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&' +\ 'new_json=1&remoteplace=txt.yqq.center&searchid=43541888870417375&t=0&aggr=1' +\ '&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=50&' +\ 'w={0}'.format(urllib.parse.quote(key)) +\ '&g_tk=5381&jsonpCallback=searchCallbacksong6064&loginUin=0&hostUin=0&' +\ 'format=jsonp&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0' response = self.httpRequest(url, method='GET') with ignored(): data = json.loads( response[len('searchCallbacksong6064('):-1]) data = data['data']['song'] newDatas = {} newDatas['songCount'] = data['curnum'] - 1 songs = [] for i in data['list']: songs.append({'name': i['name'], 'ar': [{'name': ';'.join([x['name'] for x in i['singer']])}], 'al': {'picUrl': self._getImgUrl(i['album']['mid'])}, 'dt': i['interval'] * 1000, 'id': i['id'], # 当然这里不是mp3,为了统一接口这样写。 'mp3Url': i['mid'], 'lyric': 'qq' }) newDatas['songs'] = songs return newDatas return False
def httpRequest(self, *args, **kwargs): html = super(QQApi, self).httpRequest(*args, **kwargs) with ignored(): return html.text return ''
def lyric(self, url): lyric = self.httpRequest(url, method='GET', headers=self.lyricHeader) with ignored(): lyric = lyric.split('[offset:0]')[1] lyric = re.sub(r'<\d*?>', '', lyric) return lyric return False
def details_playlist(self, ids): """ 歌单详情。 """ url = 'http://music.163.com/api/playlist/detail?id={0}'.format(ids) html = self.httpRequest(url, method="GET", cookies=self.cookies) with ignored(): return html['result'] return False
def details_playlist(self, ids): """ 歌单详情。 """ url = 'http://music.163.com/api/playlist/detail?id={0}' .format(ids) html = self.httpRequest(url, method="GET", cookies=self.cookies) with ignored(): return html['result'] return False
def httpRequest(self, *args, **kwargs): html = super(QQApi, self).httpRequest(*args, **kwargs) logger.info("进行QQ Url请求, args: {0}, kwargs: {1}".format(args, kwargs)) with ignored(): return html.text logger.info("url: {0} 请求失败. Header: {1}".format(args[0], kwargs.get('headers'))) return ''
def playList(self, page=1): url = 'http://api.xiami.com/web?v=2.0&app_key=1&_ksTS=1459927525542_91' + \ '&page={0}&limit=30&callback=jsonp92&r=collect/recommend'.format(page) response = self.httpRequest(url, method='GET') with ignored(): response = json.loads(response[len('jsonp92('):-len(')')]) return response['data'] return False
def playList(self, page=1): url = 'http://api.xiami.com/web?v=2.0&app_key=1&_ksTS=1459927525542_91' + \ '&page={0}&limit=30&callback=jsonp92&r=collect/recommend'.format(page) response = self.httpRequest(url, method='GET') with ignored(): response = json.loads(response[len('jsonp92('):-len(')')]) return response['data'] return False
def _get_qqtoken(self): token_url = 'http://base.music.qq.com/fcgi-bin/fcg_musicexpress.fcg?' + \ 'json=3&guid=3768717388&g_tk=938407465&loginUin=0&hostUin=0&' + \ 'format=jsonp&inCharset=GB2312&outCharset=GB2312¬ice=0&' + \ 'platform=yqq&jsonpCallback=jsonCallback&needNewCode=0' data = self.httpRequest(token_url, method='GET', headers=self.tokenHeaders) with ignored(): data = data[len("jsonCallback("):-len(");")] return json.loads(data) return {'key': '1', 'sip': ['']}
def httpRequest(self, *args, **kwargs): data = kwargs.get('data') if data: kwargs['data'] = encrypted_request(data) logger.info("进行网易云Url请求, args: {0}, kwargs: {1}".format(args, kwargs)) html = super(NetEaseWebApi, self).httpRequest(*args, **kwargs) with ignored(): return json.loads(html.text) logger.info("url: {0} 请求失败. Header: {1}".format( args[0], kwargs.get('headers'))) return False
def singsUrl(self, ids: list): """ 2017/7/14更新。 返回歌曲的URL。 """ data = {'csrf_token': '', 'ids': ids, 'br': 999000} url = "http://music.163.com/weapi/song/enhance/player/url" html = self.httpRequest(url, method='POST', data=data) with ignored(): return html['data'] logger.info('歌曲请求失败: ids {0}'.format(ids)) return False
def httpRequest(self, *args, **kwargs): data = kwargs.get('data') if data: kwargs['data'] = encrypted_request(data) logger.info("进行网易云Url请求, args: {0}, kwargs: {1}".format(args, kwargs)) html = super(NetEaseWebApi, self).httpRequest(*args, **kwargs) with ignored(): return json.loads(html.text) logger.info("url: {0} 请求失败. Header: {1}".format( args[0], kwargs.get('headers'))) return False
def singsUrl(self, ids: list): """ 2017/7/14更新。 返回歌曲的URL。 """ data = {'csrf_token': '', 'ids': ids, 'br': 999000} url = "http://music.163.com/weapi/song/enhance/player/url" html = self.httpRequest(url, method='POST', data=data) with ignored(): return html['data'] logger.info('歌曲请求失败: ids {0}'.format(ids)) return False
def playList(self, ein=29): """ ein控制返回的歌单。 29, 59, 89.... """ url = 'https://c.y.qq.com/splcloud/fcgi-bin/'+\ 'fcg_get_diss_by_tag.fcg?rnd=0.5136307078685405&g_tk=5381&'+\ 'jsonpCallback=getPlaylist&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8'+\ '&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0&categoryId=10000000&'+\ 'sortId=5&sin=30&ein={0}'.format(ein) response = self.httpRequest(url, method='GET', headers=self.headers) with ignored(): data = json.loads(response[len('getPlaylist('):-len(')')]) return data['data']['list'] return False
def playList(self, ein=29): """ ein控制返回的歌单。 29, 59, 89.... """ url = 'https://c.y.qq.com/splcloud/fcgi-bin/' +\ 'fcg_get_diss_by_tag.fcg?rnd=0.5136307078685405&g_tk=5381&' +\ 'jsonpCallback=getPlaylist&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8' +\ '&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0&categoryId=10000000&' +\ 'sortId=5&sin=30&ein={0}'.format(ein) response = self.httpRequest(url, method='GET', headers=self.headers) with ignored(): data = json.loads(response[len('getPlaylist('):-1]) return data['data']['list'] return False
def getPlaylist(self, ids): url = 'http://api.xiami.com/web?v=2.0&app_key=1&id={0}'.format(ids) + \ '&_ksTS=1459928471147_121&callback=jsonp122&r=collect/detail' response = self.httpRequest(url, 'GET') with ignored(): response = json.loads(response[len('jsonp122('):-len(')')]) # 修改下返回的信息,与之前的网易云对应,这样就不用修改太多即可做扩展。 data = response['data'] data['name'] = data['collect_name'] data['creator'] = {'nickname': data['user_name']} data['description'] = '' data['trackCount'] = data['songs_count'] songs = data['songs'] for i in songs: i['name'] = i['song_name'] i['artists'] = [{'name': i['singers']}] i['duration'] = int(i['length']) * 1000 i['album'] = {'blurPicUrl': i['album_logo']} data['tracks'] = songs return response['data'] return False
def getPlaylist(self, ids): url = 'http://api.xiami.com/web?v=2.0&app_key=1&id={0}'.format(ids) + \ '&_ksTS=1459928471147_121&callback=jsonp122&r=collect/detail' response = self.httpRequest(url, 'GET') with ignored(): response = json.loads(response[len('jsonp122('):-len(')')]) # 修改下返回的信息,与之前的网易云对应,这样就不用修改太多即可做扩展。 data = response['data'] data['name'] = data['collect_name'] data['creator'] = {'nickname': data['user_name']} data['description'] = '' data['trackCount'] = data['songs_count'] songs = data['songs'] for i in songs: i['name'] = i['song_name'] i['artists'] = [{'name':i['singers']}] i['duration'] = int(i['length'])*1000 i['album'] = {'blurPicUrl': i['album_logo']} data['tracks'] = songs return response['data'] return False