lx-music-api-server/modules/wy/refresh_login.py
2024-10-07 17:35:51 +08:00

100 lines
3.3 KiB
Python

# ----------------------------------------
# - mode: python -
# - author: lerdb -
# - 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, variable
from common import scheduler
from common import config
from common import log
from common.exceptions import FailedException
from time import time
from random import randint
from .encrypt import eapiEncrypt
import ujson as json
logger = log.log("wy_refresh_login")
def cookieStr2Dict(cookieStr):
cookieDict = {}
for line in cookieStr.split(";"):
if line.strip() == "":
continue
try:
name, value = line.strip().split("=", 1)
cookieDict[name] = value
except:
continue
return cookieDict
def cookieDict2Str(cookieDict):
cookieStr = ""
for name, value in cookieDict.items():
cookieStr += f"{name}={value}; "
return cookieStr
async def refresh(cookie:str):
"""
网易云刷新登录
@param cookie: 网易云音乐cookie
"""
cookie = cookieStr2Dict(cookie)
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"
}
baseUrl = "http://interface.music.163.com/eapi/"
path = "/api/login/token/refresh"
header = {
"osver": cookie.get("osver", "17.4.1"),
"deviceId": cookie.get("deviceId",""),
"os": cookie.get("os","ios"),
"appver": cookie.get("appver", ("9.0.65" if cookie.get("os") != "pc" else "")),
"versioncode": cookie.get("versioncode", "140"),
"mobilename": cookie.get("mobilename", ""),
"buildver": cookie.get("buildver", str(time())[:10]),
"resolution": cookie.get("resolution", "1920x1080"),
"__csrf": cookie.get("__csrf", ""),
"channel": cookie.get("channel", ""),
"requestId": str(time() * 1000)[:13] + "_" + f"{randint(0, 9999):0>4}",
}
if cookie.get("MUSIC_U"):
header["MUSIC_U"] = cookie.get("MUSIC_U")
if cookie.get("MUSIC_A"):
header["MUSIC_A"] = cookie.get("MUSIC_A")
headers["Cookie"] = cookieDict2Str(header)
req = await Httpx.AsyncRequest(
baseUrl + path[5:],
{
"method": "POST",
"headers": headers,
"form": eapiEncrypt(path, json.dumps({"header": header, "e_r": False})),
}
)
body = req.json()
if int(body["code"]) != 200:
raise FailedException("网易云刷新登录失败(code: " + body["code"] + ")")
return logger.info("网易云刷新登录成功")
if (variable.use_cookie_pool):
cookies = config.read_config("module.cookiepool.wy")
for c in cookies:
ref = c.get("refresh_login") if c.get("refresh_login") else {
"enable": False,
"interval": 86400
}
if (ref["enable"]):
scheduler.append("wy_refresh_login_pooled_" + c["cookie"][:32], refresh, ref["interval"], {"cookie": c["cookie"]})
else:
c = config.read_config("module.wy.user.cookie")
ref = config.read_config("module.wy.user.refresh_login")
if (ref["enable"]):
scheduler.append("wy_refresh_login", refresh, ref["interval"], {"cookie": c})