mirror of
https://github.com/MeoProject/lx-music-api-server.git
synced 2025-07-07 06:52:11 +08:00
feat: 支持QQ音乐刷新登录
This commit is contained in:
@ -160,6 +160,11 @@ default = {
|
|||||||
"_uin-desc": "key对应的QQ号"
|
"_uin-desc": "key对应的QQ号"
|
||||||
},
|
},
|
||||||
"cdnaddr": "http://ws.stream.qqmusic.qq.com/",
|
"cdnaddr": "http://ws.stream.qqmusic.qq.com/",
|
||||||
|
'refresh_login': {
|
||||||
|
'desc': '刷新登录相关配置,enable是否启动,interval刷新间隔',
|
||||||
|
'enable': False,
|
||||||
|
'interval': 86000
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"wy": {
|
"wy": {
|
||||||
"desc": "网易云音乐相关配置",
|
"desc": "网易云音乐相关配置",
|
||||||
|
@ -12,6 +12,7 @@ import binascii
|
|||||||
import builtins
|
import builtins
|
||||||
import base64
|
import base64
|
||||||
import zlib
|
import zlib
|
||||||
|
import time
|
||||||
import re
|
import re
|
||||||
import xmltodict
|
import xmltodict
|
||||||
from urllib.parse import quote
|
from urllib.parse import quote
|
||||||
@ -153,5 +154,10 @@ def timeLengthFormat(t):
|
|||||||
second = t % 60
|
second = t % 60
|
||||||
return f"{((('0' + str(hour)) if (len(str(hour)) == 1) else str(hour)) + ':') if (hour > 0) else ''}{minute:02}:{second:02}"
|
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)
|
addToGlobalNamespace('require', require)
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@ from .musicInfo import getMusicInfo as _getInfo
|
|||||||
from .utils import formatSinger
|
from .utils import formatSinger
|
||||||
from .lyric import getLyric as _getLyric
|
from .lyric import getLyric as _getLyric
|
||||||
from common import utils
|
from common import utils
|
||||||
|
from . import refresh_login
|
||||||
|
|
||||||
|
|
||||||
async def info(songid):
|
async def info(songid):
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
# This file is part of the "lx-music-api-server" project.
|
# This file is part of the "lx-music-api-server" project.
|
||||||
|
|
||||||
from common.exceptions import FailedException
|
from common.exceptions import FailedException
|
||||||
from common import utils
|
from common import config, utils
|
||||||
from .musicInfo import getMusicInfo
|
from .musicInfo import getMusicInfo
|
||||||
from .utils import tools
|
from .utils import tools
|
||||||
from .utils import signRequest
|
from .utils import signRequest
|
||||||
@ -33,8 +33,8 @@ async def url(songId, quality):
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
'comm': {
|
'comm': {
|
||||||
"qq": tools.loginuin,
|
"qq": config.read_config('module.tx.user.uin'),
|
||||||
"authst": tools.key,
|
"authst": config.read_config('module.tx.user.qqmusic_key'),
|
||||||
"ct": "26",
|
"ct": "26",
|
||||||
"cv": "2010101",
|
"cv": "2010101",
|
||||||
"v": "2010101"
|
"v": "2010101"
|
||||||
|
105
modules/tx/refresh_login.py
Normal file
105
modules/tx/refresh_login.py
Normal file
@ -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'))
|
@ -50,10 +50,8 @@ tools = createObject({
|
|||||||
'Q000': 'dolby',
|
'Q000': 'dolby',
|
||||||
'AI00': 'master'
|
'AI00': 'master'
|
||||||
},
|
},
|
||||||
"key": config.read_config("module.tx.user.qqmusic_key"),
|
|
||||||
"loginuin": config.read_config("module.tx.user.uin"),
|
"loginuin": config.read_config("module.tx.user.uin"),
|
||||||
"guid": config.read_config("module.tx.vkeyserver.guid"),
|
"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/',
|
"cdnaddr": config.read_config("module.tx.cdnaddr") if config.read_config("module.tx.cdnaddr") else 'http://ws.stream.qqmusic.qq.com/',
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user