diff --git a/common/config.py b/common/config.py index a4ba80c..ec3cb7f 100644 --- a/common/config.py +++ b/common/config.py @@ -160,6 +160,11 @@ default = { "_uin-desc": "key对应的QQ号" }, "cdnaddr": "http://ws.stream.qqmusic.qq.com/", + 'refresh_login': { + 'desc': '刷新登录相关配置,enable是否启动,interval刷新间隔', + 'enable': False, + 'interval': 86000 + } }, "wy": { "desc": "网易云音乐相关配置", diff --git a/common/utils.py b/common/utils.py index a931806..b4d1a14 100644 --- a/common/utils.py +++ b/common/utils.py @@ -12,6 +12,7 @@ import binascii import builtins import base64 import zlib +import time import re import xmltodict from urllib.parse import quote @@ -153,5 +154,10 @@ def timeLengthFormat(t): second = t % 60 return f"{((('0' + str(hour)) if (len(str(hour)) == 1) else str(hour)) + ':') if (hour > 0) else ''}{minute:02}:{second:02}" +def timestamp_format(t): + if (not isinstance(t, int)): + t = int(t) + return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(t)) + addToGlobalNamespace('require', require) diff --git a/modules/tx/__init__.py b/modules/tx/__init__.py index 88e4212..f673f7f 100644 --- a/modules/tx/__init__.py +++ b/modules/tx/__init__.py @@ -12,6 +12,7 @@ from .musicInfo import getMusicInfo as _getInfo from .utils import formatSinger from .lyric import getLyric as _getLyric from common import utils +from . import refresh_login async def info(songid): diff --git a/modules/tx/player.py b/modules/tx/player.py index 5c47ccb..f680ed3 100644 --- a/modules/tx/player.py +++ b/modules/tx/player.py @@ -8,7 +8,7 @@ # This file is part of the "lx-music-api-server" project. from common.exceptions import FailedException -from common import utils +from common import config, utils from .musicInfo import getMusicInfo from .utils import tools from .utils import signRequest @@ -33,8 +33,8 @@ async def url(songId, quality): }, }, 'comm': { - "qq": tools.loginuin, - "authst": tools.key, + "qq": config.read_config('module.tx.user.uin'), + "authst": config.read_config('module.tx.user.qqmusic_key'), "ct": "26", "cv": "2010101", "v": "2010101" diff --git a/modules/tx/refresh_login.py b/modules/tx/refresh_login.py new file mode 100644 index 0000000..4a7d19b --- /dev/null +++ b/modules/tx/refresh_login.py @@ -0,0 +1,105 @@ +# ---------------------------------------- +# - mode: python - +# - author: helloplhm-qwq - +# - name: refresh_login.py - +# - project: lx-music-api-server - +# - license: MIT - +# ---------------------------------------- +# This file is part of the "lx-music-api-server" project. + +from common import Httpx +from common import scheduler +from common import config +from common import log +from .utils import sign +import ujson as json + +logger = log.log('qqmusic_refresh_login') + +async def refresh(): + if (not config.read_config('module.tx.user.qqmusic_key')): + return + if (not config.read_config('module.tx.refresh_login.enable')): + return + if (config.read_config('module.tx.user.qqmusic_key').startswith('W_X')): + options = { + 'method': 'POST', + 'body': json.dumps({ + "comm": { + "fPersonality": "0", + "tmeLoginType": "1", + "tmeLoginMethod": "1", + "qq": "", + "authst": "", + "ct": "11", + "cv": "12080008", + "v": "12080008", + "tmeAppID": "qqmusic" + }, + "req1": { + "module": "music.login.LoginServer", + "method": "Login", + "param": { + "code": "", + "openid": "", + "refresh_token": "", + "str_musicid": str(config.read_config('module.tx.user.uin')), + "musickey": config.read_config('module.tx.user.qqmusic_key'), + "unionid": "", + "refresh_key": "", + "loginMode": 2 + } + } + }) + } + signature = sign(options['body']) + req = await Httpx.AsyncRequest(f'https://u.y.qq.com/cgi-bin/musics.fcg?sign={signature}', options) + body = req.json() + if (body['req1']['code'] != 0): + logger.warning('刷新登录失败, code: ' + + str(body['req1']['code']) + f'\n响应体: {body}') + return + else: + logger.info('刷新登录成功') + config.write_config('module.tx.user.uin', + body['req1']['data']['musicid']) + logger.info('已通过相应数据更新uin') + config.write_config('module.tx.user.qqmusic_key', + body['req1']['data']['musickey']) + logger.info('已通过相应数据更新qqmusic_key') + elif (config.read_config('module.tx.user.qqmusic_key').startswith('Q_H_L')): + options = { + 'method': 'POST', + 'body': json.dumps({ + 'req1': { + 'module': 'QQConnectLogin.LoginServer', + 'method': 'QQLogin', + 'param': { + 'expired_in': 7776000, + 'musicid': int(config.read_config('module.tx.user.uin')), + 'musickey': config.read_config('module.tx.user.qqmusic_key') + } + } + }) + } + signature = sign(options['body']) + req = await Httpx.AsyncRequest(f'https://u6.y.qq.com/cgi-bin/musics.fcg?sign={signature}', options) + body = req.json() + if (body['req1']['code'] != 0): + logger.warning('刷新登录失败, code: ' + + str(body['req1']['code']) + f'\n响应体: {body}') + return + else: + logger.info('刷新登录成功') + config.write_config('module.tx.user.uin', + body['req1']['data']['musicid']) + logger.info('已通过相应数据更新uin') + config.write_config('module.tx.user.qqmusic_key', + body['req1']['data']['musickey']) + logger.info('已通过相应数据更新qqmusic_key') + else: + logger.error('未知的qqmusic_key格式') + +if (config.read_config('module.tx.refresh_login.enable')): + scheduler.append('qqmusic_refresh_login', refresh, + config.read_config('module.tx.refresh_login.interval')) diff --git a/modules/tx/utils.py b/modules/tx/utils.py index dbdc7ad..000f192 100644 --- a/modules/tx/utils.py +++ b/modules/tx/utils.py @@ -50,10 +50,8 @@ tools = createObject({ 'Q000': 'dolby', 'AI00': 'master' }, - "key": config.read_config("module.tx.user.qqmusic_key"), "loginuin": config.read_config("module.tx.user.uin"), "guid": config.read_config("module.tx.vkeyserver.guid"), - "uin": config.read_config("module.tx.vkeyserver.uin"), "cdnaddr": config.read_config("module.tx.cdnaddr") if config.read_config("module.tx.cdnaddr") else 'http://ws.stream.qqmusic.qq.com/', })