diff --git a/NEMbox/api.py b/NEMbox/api.py index da4c0fbc..c8e5bd15 100644 --- a/NEMbox/api.py +++ b/NEMbox/api.py @@ -18,7 +18,7 @@ from .config import Config from .storage import Storage -from .encrypt import encrypted_request +from .encrypt import encrypted_request, get_base_cookie from . import logger requests_cache.install_cache('nemcache', expire_after=3600) @@ -247,6 +247,7 @@ def _raw_request(self, method, endpoint, data=None): def request(self, method, path, params={}, default={'code': -1}): endpoint = '{}{}'.format(BASE_URL, path) csrf_token = '' + requests.utils.add_dict_to_cookiejar(self.session.cookies, get_base_cookie()) for cookie in self.session.cookies: if cookie.name == '__csrf': csrf_token = cookie.value @@ -306,6 +307,12 @@ def user_playlist(self, uid, offset=0, limit=50): ) return self.request('POST', path, params).get('playlist', []) + # 每日推荐歌曲 + def recommend_resource(self): + path = '/weapi/v1/discovery/recommend/songs' + params = {'offset':0, 'total':True, 'limit':20} + return self.request('POST', path, params).get('recommend', []) + # 每日推荐歌单 def recommend_resource(self): path = '/weapi/v1/discovery/recommend/resource' diff --git a/NEMbox/encrypt.py b/NEMbox/encrypt.py index c08056c4..ea24ee06 100644 --- a/NEMbox/encrypt.py +++ b/NEMbox/encrypt.py @@ -8,6 +8,8 @@ import hashlib import json import os +import random +import time from Cryptodome.Cipher import AES from future.builtins import int, pow @@ -63,3 +65,29 @@ def rsa(text, pubkey, modulus): def create_key(size): return binascii.hexlify(os.urandom(size))[:16] + +def random_string(pattern, length): + rand = '' + while len(rand) <= length: + rand = rand + random.choice(pattern) + return rand + +def create_jsessionid(): + rand = random_string('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKMNOPQRSTUVWXYZ\\/+',176) + ts = int(time.time() * 1000) + return "%s:%d"% (rand, ts) + +def create_nuid(): + return random_string('0123456789abcdefghijklmnopqrstuvwxyz',32) + +# https://github.com/Binaryify/NeteaseCloudMusicApi/../util/init.js +def get_base_cookie(): + nuid = create_nuid() + ts = int(time.time() * 1000) + nnid = "%s,%d"% (nuid, ts) + c={} + c['JSESSIONID-WYYY'] = create_jsessionid() + c['_ntes_nuid'] = nuid + c['_ntes_nnid'] = nnid + c['_iuqxldmzr_'] = '32' + return c diff --git a/NEMbox/menu.py b/NEMbox/menu.py index bcb716fd..419a4ab4 100644 --- a/NEMbox/menu.py +++ b/NEMbox/menu.py @@ -591,9 +591,13 @@ def start(self): cache_thread.start() elif key == ord('i'): - if self.player.playing_id != -1: + song_id = self.datalist[idx].get('song_id', -1) + if not song_id: + song_id = self.player.playing_id + + if song_id != -1: webbrowser.open_new_tab( - 'http://music.163.com/song?id={}'.format(self.player.playing_id) + 'http://music.163.com/song?id={}'.format(song_id) ) self.ui.build_process_bar( @@ -678,7 +682,10 @@ def dispatch_enter(self, idx): # 全站置顶歌单包含的歌曲 elif datatype == 'top_playlists': playlist_id = datalist[idx]['playlist_id'] - songs = netease.playlist_detail(playlist_id) + if playlist_id == 0: + songs = netease.recommend_songs() + else: + songs = netease.playlist_detail(playlist_id) self.datatype = 'songs' self.datalist = netease.dig_info(songs, 'songs') self.title += ' > ' + datalist[idx]['playlist_name'] @@ -841,6 +848,10 @@ def choice_channel(self, idx): self.datatype = 'top_playlists' self.title += ' > 每日推荐' self.datalist = self.api.dig_info(myplaylist, self.datatype) + self.datalist = [{'playlist_id':0, + 'playlist_name':u'每日推荐歌曲', + 'creator_name':u'云音乐'}] + self.datalist + elif idx == 7: self.datatype = 'fmsongs' self.title += ' > 私人FM'