feat: 更新太大了不想总结自己去看提交记录吧(已知把配置文件换成了yaml

This commit is contained in:
helloplhm-qwq
2024-04-14 19:06:36 +08:00
parent 45e2e7147d
commit 667d420499
13 changed files with 432 additions and 412 deletions

View File

@ -14,8 +14,10 @@ import traceback
import sys
import sqlite3
import shutil
import ruamel.yaml as yaml
from . import variable
from .log import log
from . import default_config
import threading
logger = log('config_manager')
@ -45,302 +47,17 @@ class ConfigReadException(Exception):
pass
default = {
"common": {
"host": "0.0.0.0",
"_host-desc": "服务器启动时所使用的HOST地址",
"ports": [ 9763 ],
"_ports-desc": "服务器启动时所使用的端口",
"ssl_info": {
"desc": "服务器https配置is_https是这个服务器是否是https服务器如果你使用了反向代理来转发这个服务器如果它使用了https也请将它设置为true",
"is_https": False,
"enable": False,
"ssl_ports": [ 443 ],
"path": {
"desc": "ssl证书的文件地址",
"cert": "/path/to/your/cer",
"privkey": "/path/to/your/private/key",
},
},
"reverse_proxy": {
"desc": "针对类似于nginx一类的反代的配置",
"allow_proxy": True,
"_allow_proxy-desc": "是否允许反代",
"proxy_whitelist_remote": [
"反代时允许的ip来源列表通常为127.0.0.1",
"127.0.0.1"
],
"real_ip_header": 'X-Real-IP',
"_real_ip_header-desc": "反代来源ip的来源头不懂请保持默认",
},
"debug_mode": False,
"_debug_mode-desc": "是否开启调试模式",
"log_length_limit": 500,
"_log_length_limit-desc": "单条日志长度限制",
"fakeip": "1.0.1.114",
"_fakeip-desc": "服务器在海外时的IP伪装值",
"proxy": {
"enable": False,
"http_value": "http://127.0.0.1:7890",
"https_value": "http://127.0.0.1:7890",
},
"_proxy-desc": "代理配置HTTP与HTTPS协议需分开配置",
"log_file": True,
"_log_file-desc": "是否开启日志文件",
'cookiepool': False,
'_cookiepool-desc': '是否开启cookie池这将允许用户配置多个cookie并在请求时随机使用一个启用后请在module.cookiepool中配置cookie在user处配置的cookie会被忽略cookiepool中格式统一为列表嵌套user处的cookie的字典',
"allow_download_script": True,
'_allow_download_script-desc': '是否允许直接从服务端下载脚本,开启后可以直接访问 /script?key=你的请求key 下载脚本',
"download_config": {
"desc": "源脚本的相关配置dev为是否启用开发模式",
"name": "修改为你的源脚本名称",
"intro": "修改为你的源脚本描述",
"author": "修改为你的源脚本作者",
"version": "修改为你的源版本",
"filename": "lx-music-source.js",
"_filename-desc": "客户端保存脚本时的文件名(可能因浏览器不同出现不一样的情况)",
"dev": True,
"quality": {
"kw": ["128k"],
"kg": ["128k"],
"tx": ["128k"],
"wy": ["128k"],
"mg": ["128k"],
}
},
"local_music": {
"desc": "服务器侧本地音乐相关配置,请确保你的带宽足够",
"audio_path": "./audio",
"temp_path": "./temp",
}
},
"security": {
"rate_limit": {
"global": 0,
"ip": 0,
"desc": "请求速率限制global为全局ip为单个ip填入的值为至少间隔多久才能进行一次请求单位不限制请填为0"
},
"key": {
"enable": False,
"_enable-desc": "是否开启请求key开启后只有请求头中包含key且值一样时可以访问API",
"ban": True,
"values": ["114514"],
},
"whitelist_host": [
"localhost",
"0.0.0.0",
"127.0.0.1",
],
"_whitelist_host-desc": "强制白名单HOST不需要加端口号即不受其他安全设置影响的HOST",
"check_lxm": False,
"_check_lxm-desc": "是否检查lxm请求头正常的LX Music请求时都会携带这个请求头",
"lxm_ban": True,
"_lxm_ban-desc": "lxm请求头不存在或不匹配时是否将用户IP加入黑名单",
"allowed_host": {
"desc": "HOST允许列表启用后只允许列表内的HOST访问服务器不需要加端口号",
"enable": False,
"blacklist": {
"desc": "当用户访问的HOST并不在允许列表中时是否将请求IP加入黑名单长度单位",
"enable": False,
"length": 0,
},
"list": [
"localhost",
"0.0.0.0",
"127.0.0.1",
],
},
"banlist": {
"desc": "是否启用黑名单(全局设置,关闭后已存储的值并不受影响,但不会再检查)",
"enable": True,
"expire": {
"desc": "是否启用黑名单IP过期关闭后其他地方的配置会失效",
"enable": True,
"length": 86400 * 7, # 七天
},
}
},
"module": {
"kg": {
"desc": "酷狗音乐相关配置",
"client": {
"desc": "客户端请求配置,不懂请保持默认,修改请统一为字符串格式",
"appid": "1005",
"_appid-desc": "酷狗音乐的appid官方安卓为1005官方PC为1001",
"signatureKey": "OIlwieks28dk2k092lksi2UIkp",
"_signatureKey-desc": "客户端signature采用的key值需要与appid对应",
"clientver": "12029",
"_clientver-desc": "客户端versioncodepidversionsecret可能随此值而变化",
"pidversionsecret": "57ae12eb6890223e355ccfcb74edf70d",
"_pidversionsecret-desc": "获取URL时所用的key值计算验证值",
"pid": "2",
},
"tracker": {
"desc": "trackerapi请求配置不懂请保持默认修改请统一为字符串格式",
"host": "https://gateway.kugou.com",
"path": "/v5/url",
"version": "v5",
"x-router": {
"desc": "当host为gateway.kugou.com时需要追加此头为tracker类地址时则不需要",
"enable": True,
"value": "tracker.kugou.com",
},
"extra_params": {},
"_extra_params-desc": "自定义添加的param优先级大于默认填写类型为普通的JSON数据会自动转换为请求param",
},
"user": {
"desc": "此处内容请统一抓包获取需要vip账号来获取会员歌曲如果没有请留为空值mid必填可以瞎填一段数字",
"token": "",
"userid": "0",
"mid": "114514",
"lite_sign_in": {
"desc": "是否启用概念版自动签到仅在appid=3116时运行",
"enable": False,
"interval": 86400,
"mixsongmid": {
"desc": "mix_songmid的获取方式, 默认auto, 可以改成一个数字手动",
"value": "auto"
}
},
"refresh_token": {
"desc": "酷狗token保活相关配置30天不刷新token会失效enable是否启动interval刷新间隔。默认appid=1005时有效3116需要更换signatureKey",
"enable": False,
"interval": 86000,
"login_url": "http://login.user.kugou.com/v4/login_by_token"
}
}
},
"tx": {
"desc": "QQ音乐相关配置",
"vkeyserver": {
"desc": "请求官方api时使用的guiduin等信息不需要与cookie中信息一致",
"guid": "114514",
"uin": "10086",
},
"user": {
"desc": "用户数据可以通过浏览器获取需要vip账号来获取会员歌曲如果没有请留为空值qqmusic_key可以从Cookie中/客户端的请求体中comm.authst获取",
"qqmusic_key": "",
"uin": "",
"_uin-desc": "key对应的QQ号",
'refresh_login': {
'desc': '刷新登录相关配置enable是否启动interval刷新间隔',
'enable': False,
'interval': 86000
}
},
"cdnaddr": "http://ws.stream.qqmusic.qq.com/",
},
"wy": {
"desc": "网易云音乐相关配置",
"user": {
"desc": "账号cookie数据可以通过浏览器获取需要vip账号来获取会员歌曲如果没有请留为空值",
"cookie": ""
},
},
"mg": {
"desc": "咪咕音乐相关配置",
"user": {
"desc": "研究不深后两项自行抓包获取网页端cookie",
"by": "",
"session": "",
"useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36",
"refresh_login": {
"enable": False,
"interval": 86400,
"desc": "进行cookie保活"
}
},
},
"kw": {
"desc": "酷我音乐相关配置proto支持值['bd-api', 'kuwodes']",
"proto": "bd-api",
"user": {
"uid": "0",
"token": "",
"device_id": "0",
},
"des": {
"desc": "kuwodes接口mobi, nmobi一类的加密相关配置",
"f": "kuwo",
"need_encrypt": True,
"param填写注释": "{songId}为歌曲id, {map_quality}为map后的歌曲音质酷我规范, {raw_quality}为请求时的歌曲音质LX规范, {ext}为歌曲文件扩展名",
"params": "type=convert_url_with_sign&rid={songId}&quality={map_quality}&ext={ext}",
"host": "nmobi.kuwo.cn",
"path": "mobi.s",
"response_types": ['这里是reponse_type的所有支持值当设置为json时会使用到下面的两个值来获取url/bitrate如果为text则为传统的逐行解析方式', 'json', 'text'],
"response_type": "json",
"url_json_path": "data.url",
"bitrate_json_path": "data.bitrate",
"headers": {
"User-Agent": 'okhttp/3.10.0'
}
}
},
'cookiepool': {
'kg': [
{
'userid': '0',
'token': '',
'mid': '114514',
"lite_sign_in": {
"desc": "是否启用概念版自动签到仅在appid=3116时运行",
"enable": False,
"interval": 86400,
"mixsongmid": {
"desc": "mix_songmid的获取方式, 默认auto, 可以改成一个数字手动",
"value": "auto"
}
}
},
],
'tx': [
{
'qqmusic_key': '',
'uin': '',
'refresh_login': {
'desc': 'cookie池中对于此账号刷新登录的配置账号间互不干扰',
'enable': False,
'interval': 86000,
}
}
],
'wy': [
{
'cookie': '',
}
],
'mg': [
{
'by': '',
'session': '',
'useragent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36',
"refresh_login": {
"enable": False,
"interval": 86400
}
}
],
'kw': [
{
"uid": "0",
"token": "",
"device_id": "0",
},
]
},
},
}
default_str = default_config.default
default = yaml.safe_load(default_str)
def handle_default_config():
with open("./config/config.json", "w", encoding="utf-8") as f:
f.write(json.dumps(default, indent=2, ensure_ascii=False,
escape_forward_slashes=False))
f.close()
with open("./config/config.yml", "w", encoding="utf-8") as f:
f.write(default_str)
if (not os.getenv('build')):
logger.info('首次启动或配置文件被删除,已创建默认配置文件')
logger.info(
f'\n建议您到{variable.workdir + os.path.sep}config.json修改配置后重新启动服务器')
f'\n建议您到{variable.workdir + os.path.sep}config.yml修改配置后重新启动服务器')
return default
@ -525,8 +242,8 @@ def push_to_list(key, obj):
def write_config(key, value):
config = None
with open('./config/config.json', 'r', encoding='utf-8') as f:
config = json.load(f)
with open('./config/config.yml', 'r', encoding='utf-8') as f:
config = yaml.YAML().load(f)
keys = key.split('.')
current = config
@ -536,11 +253,15 @@ def write_config(key, value):
current = current[k]
current[keys[-1]] = value
variable.config = config
with open('./config/config.json', 'w', encoding='utf-8') as f:
json.dump(config, f, indent=2, ensure_ascii=False,
escape_forward_slashes=False)
f.close()
# 设置保留注释和空行的参数
y = yaml.YAML()
y.preserve_quotes = True
y.preserve_blank_lines = True
# 写入配置并保留注释和空行
with open('./config/config.yml', 'w', encoding='utf-8') as f:
y.dump(config, f)
def read_default_config(key):
@ -639,21 +360,26 @@ def initConfig():
shutil.move('config.json','./config')
if (os.path.exists('./data.db')):
shutil.move('./data.db','./config')
if (os.path.exists('./config/config.json')):
os.rename('./config/config.json', './config/config.json.bak')
handle_default_config()
logger.warning('json配置文件已不再使用已将其重命名为config.json.bak')
logger.warning('配置文件不会自动更新(因为变化太大),请手动修改配置文件重启服务器')
sys.exit(0)
try:
with open("./config/config.json", "r", encoding="utf-8") as f:
with open("./config/config.yml", "r", encoding="utf-8") as f:
try:
variable.config = json.loads(f.read())
variable.config = yaml.safe_load(f.read())
if (not isinstance(variable.config, dict)):
logger.warning('配置文件并不是一个有效的字典,使用默认值')
variable.config = default
with open("./config/config.json", "w", encoding="utf-8") as f:
f.write(json.dumps(variable.config, indent=2,
ensure_ascii=False, escape_forward_slashes=False))
with open("./config/config.yml", "w", encoding="utf-8") as f:
yaml.dump(variable.config, f)
f.close()
except:
if os.path.getsize("./config/config.json") != 0:
logger.error("配置文件加载失败,请检查是否遵循JSON语法规范")
if os.path.getsize("./config/config.yml") != 0:
logger.error("配置文件加载失败,请检查是否遵循YAML语法规范")
sys.exit(1)
else:
variable.config = handle_default_config()