diff --git a/common/check.py b/common/check.py index 4a8659d..f6053c3 100644 --- a/common/check.py +++ b/common/check.py @@ -7,22 +7,20 @@ async def check_github_api_rate_limit(headers, session): url = 'https://api.github.com/rate_limit' async with session.get(url, headers=headers, ssl=False) as r: - if r is None: + if not r == None: + r_json = await r.json() + else: log.error('孩子,你怎么做到的?') os.system('pause') - return - - r_json = await r.json() if r.status == 200: rate_limit = r_json['rate'] remaining_requests = rate_limit['remaining'] reset_time = rate_limit['reset'] reset_time_formatted = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(reset_time)) - log.info(f'🔄 剩余请求次数: {remaining_requests}') + log.info(f' 🔄 剩余请求次数: {remaining_requests}') else: log.error('Github请求数检查失败') - return if remaining_requests == 0: - log.warning(f'⚠ GitHub API 请求数已用尽,将在 {reset_time_formatted} 重置, 不想等生成一个填配置文件里') \ No newline at end of file + log.warning(f' ⚠ GitHub API 请求数已用尽,将在 {reset_time_formatted} 重置, 不想等生成一个填配置文件里') \ No newline at end of file diff --git a/common/config.py b/common/config.py index a82f433..3fe2092 100644 --- a/common/config.py +++ b/common/config.py @@ -25,7 +25,7 @@ async def gen_config_file(): ensure_ascii=False, escape_forward_slashes=False)) await f.close() - log.info('🖱️ 程序可能为第一次启动,请填写配置文件后重新启动程序') + log.info(' 🖱️ 程序可能为第一次启动,请填写配置文件后重新启动程序') async def load_config(): diff --git a/common/dkey_merge.py b/common/dkey_merge.py index 49cc0d8..00f2039 100644 --- a/common/dkey_merge.py +++ b/common/dkey_merge.py @@ -10,21 +10,18 @@ lock = asyncio.Lock() async def depotkey_merge(config_path, depots_config): if not config_path.exists(): async with lock: - log.error('👋 Steam默认配置不存在,可能是没有登录账号') + log.error(' 👋 Steam默认配置不存在,可能是没有登录账号') return - async with aiofiles.open(config_path, encoding='utf-8') as f: content = await f.read() - config = vdf.loads(content) software = config['InstallConfigStore']['Software'] valve = software.get('Valve') or software.get('valve') steam = valve.get('Steam') or valve.get('steam') - - steam.setdefault('depots', {}).update(depots_config['depots']) - + if 'depots' not in steam: + steam['depots'] = {} + steam['depots'].update(depots_config['depots']) async with aiofiles.open(config_path, mode='w', encoding='utf-8') as f: new_content = vdf.dumps(config, pretty=True) await f.write(new_content) - return True diff --git a/common/get_manifest_info.py b/common/get_manifest_info.py index c0bb13c..ed5b716 100644 --- a/common/get_manifest_info.py +++ b/common/get_manifest_info.py @@ -6,35 +6,29 @@ from .log import log from .manifest_down import get from .stack_error import stack_error - +# 获取清单信息 async def get_manifest(sha, path, steam_path: Path, repo, session): collected_depots = [] try: if path.endswith('.manifest'): depot_cache_path = steam_path / 'depotcache' - depot_cache_path.mkdir(exist_ok=True) if not depot_cache_path.exists() else None + if not depot_cache_path.exists(): + depot_cache_path.mkdir(exist_ok=True) save_path = depot_cache_path / path - if save_path.exists(): log.warning(f'👋已存在清单: {path}') return collected_depots - content = await get(sha, path, repo, session) - log.info(f'🔄 清单下载成功: {path}') - + log.info(f' 🔄 清单下载成功: {path}') async with aiofiles.open(save_path, 'wb') as f: await f.write(content) - elif path == 'Key.vdf': content = await get(sha, path, repo, session) - log.info(f'🔄 密钥下载成功: {path}') - depots_config = vdf.loads(content.decode('utf-8')) - + log.info(f' 🔄 密钥下载成功: {path}') + depots_config = vdf.loads(content.decode(encoding='utf-8')) for depot_id, depot_info in depots_config['depots'].items(): collected_depots.append((depot_id, depot_info['DecryptionKey'])) - except Exception as e: log.error(f'处理失败: {path} - {stack_error(e)}') raise - return collected_depots \ No newline at end of file diff --git a/common/get_steam_path.py b/common/get_steam_path.py index 85ab4a9..18e19c2 100644 --- a/common/get_steam_path.py +++ b/common/get_steam_path.py @@ -1,5 +1,7 @@ import os + import winreg + from pathlib import Path from .log import log from .config import config @@ -10,14 +12,12 @@ def get_steam_path(): key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r'Software\Valve\Steam') steam_path = Path(winreg.QueryValueEx(key, 'SteamPath')[0]) custom_steam_path = config["Custom_Steam_Path"] - - if custom_steam_path: + if not custom_steam_path == '': return Path(custom_steam_path) - - return steam_path + else: + return steam_path except Exception as e: - log.error(f'❗ Steam路径获取失败, {stack_error(e)}') + log.error(f'Steam路径获取失败, {stack_error(e)}') os.system('pause') - return None - + steam_path = get_steam_path() \ No newline at end of file diff --git a/common/gl_unlock.py b/common/gl_unlock.py index 50b2107..f5b1e58 100644 --- a/common/gl_unlock.py +++ b/common/gl_unlock.py @@ -4,29 +4,25 @@ async def greenluma_add(depot_id_list): app_list_path = steam_path / 'AppList' if app_list_path.exists() and app_list_path.is_file(): app_list_path.unlink(missing_ok=True) - if not app_list_path.is_dir(): app_list_path.mkdir(parents=True, exist_ok=True) - - depot_dict = {int(i.stem): None for i in app_list_path.iterdir() if i.stem.isdecimal() and i.suffix == '.txt'} - + depot_dict = {} for i in app_list_path.iterdir(): if i.stem.isdecimal() and i.suffix == '.txt': with i.open('r', encoding='utf-8') as f: app_id_ = f.read().strip() + depot_dict[int(i.stem)] = None if app_id_.isdecimal(): depot_dict[int(i.stem)] = int(app_id_) - for depot_id in depot_id_list: if int(depot_id) not in depot_dict.values(): - index = max(depot_dict.keys(), default=-1) + 1 - for i in range(max(depot_dict.keys(), default=-1) + 1): - if i not in depot_dict: - index = i - break - + index = max(depot_dict.keys()) + 1 if depot_dict.keys() else 0 + if index != 0: + for i in range(max(depot_dict.keys())): + if i not in depot_dict.keys(): + index = i + break with (app_list_path / f'{index}.txt').open('w', encoding='utf-8') as f: f.write(str(depot_id)) depot_dict[index] = int(depot_id) - return True \ No newline at end of file diff --git a/common/init_text.py b/common/init_text.py index b2fd17e..e9584f6 100644 --- a/common/init_text.py +++ b/common/init_text.py @@ -13,7 +13,7 @@ def init(): print(f"{Fore.GREEN}{Back.BLACK}{Style.BRIGHT} \\_____/ |_| \\_| |_____| |_| \\_\\ |_____| /_/{Style.RESET_ALL}") log.info('作者ikun0014') log.info('本项目采用GNU General Public License v3开源许可证') - log.info('版本:1.2.2') + log.info('版本:1.2.1') log.info('项目仓库:https://github.com/ikunshare/Onekey') log.info('官网:ikunshare.com') log.warning('本项目完全开源免费,如果你在淘宝,QQ群内通过购买方式获得,赶紧回去骂商家死全家\n交流群组:\nhttps://qm.qq.com/q/d7sWovfAGI\nhttps://t.me/ikunshare_group') diff --git a/common/log.py b/common/log.py index 24edc2b..700caad 100644 --- a/common/log.py +++ b/common/log.py @@ -1,26 +1,23 @@ import logging import colorlog + def init_log(): logger = logging.getLogger('Onekey') logger.setLevel(logging.DEBUG) - stream_handler = logging.StreamHandler() stream_handler.setLevel(logging.DEBUG) - fmt_string = '%(log_color)s[%(name)s][%(levelname)s]%(message)s' log_colors = { - 'DEBUG': 'blue', 'INFO': 'cyan', 'WARNING': 'yellow', 'ERROR': 'red', 'CRITICAL': 'purple' } fmt = colorlog.ColoredFormatter(fmt_string, log_colors=log_colors) - stream_handler.setFormatter(fmt) logger.addHandler(stream_handler) - return logger + log = init_log() diff --git a/common/main_func.py b/common/main_func.py index 82742e0..06edc87 100644 --- a/common/main_func.py +++ b/common/main_func.py @@ -1,5 +1,7 @@ import os + from aiohttp import ClientSession + from common.config import config from common.dkey_merge import depotkey_merge from common.migration import migrate @@ -16,13 +18,10 @@ isSteamTools = (steam_path / 'config' / 'stUI').is_dir() async def main(app_id, repos): app_id_list = list(filter(str.isdecimal, app_id.strip().split('-'))) - if not app_id_list: - log.error("无有效的应用ID") - return False app_id = app_id_list[0] async with ClientSession() as session: - github_token = config.get("Github_Personal_Token") + github_token = config["Github_Personal_Token"] headers = {'Authorization': f'Bearer {github_token}'} if github_token else None latest_date = None selected_repo = None @@ -41,9 +40,8 @@ async def main(app_id, repos): selected_repo = repo except Exception as e: log.error(f' ⚠ 获取分支信息失败: {stack_error(e)}') - if selected_repo: - log.info(f'🔄 选择清单仓库:{selected_repo}') + log.info(f' 🔄 选择清单仓库:{selected_repo}') url = f'https://api.github.com/repos/{selected_repo}/branches/{app_id}' async with session.get(url, headers=headers, ssl=False) as r: r_json = await r.json() @@ -61,18 +59,18 @@ async def main(app_id, repos): if isSteamTools: migrate(st_use=True) await stool_add(collected_depots, app_id) - log.info('✅ 找到SteamTools,已添加解锁文件') + log.info(' ✅ 找到SteamTools,已添加解锁文件') if isGreenLuma: migrate(st_use=False) await greenluma_add([app_id]) depot_config = {'depots': {depot_id: {'DecryptionKey': depot_key} for depot_id, depot_key in collected_depots}} await depotkey_merge(steam_path / 'config' / 'config.vdf', depot_config) if await greenluma_add([int(i) for i in depot_config['depots'] if i.isdecimal()]): - log.info('✅ 找到GreenLuma,已添加解锁文件') - log.info(f'✅ 清单最后更新时间:{latest_date}') - log.info(f'✅ 入库成功: {app_id}') + log.info(' ✅ 找到GreenLuma,已添加解锁文件') + log.info(f' ✅ 清单最后更新时间:{date}') + log.info(f' ✅ 入库成功: {app_id}') os.system('pause') return True - log.error(f'⚠ 清单下载或生成失败: {app_id}') + log.error(f' ⚠ 清单下载或生成失败: {app_id}') os.system('pause') - return False + return False \ No newline at end of file diff --git a/common/manifest_down.py b/common/manifest_down.py index 1d5f7fb..32acbfa 100644 --- a/common/manifest_down.py +++ b/common/manifest_down.py @@ -1,7 +1,9 @@ from aiohttp import ClientError from tqdm.asyncio import tqdm_asyncio + from .log import log + async def get(sha, path, repo, session): url_list = [ f'https://cdn.jsdmirror.com/gh/{repo}@{sha}/{path}', @@ -16,23 +18,20 @@ async def get(sha, path, repo, session): async with session.get(url, ssl=False) as r: if r.status == 200: total_size = int(r.headers.get('Content-Length', 0)) - if total_size == 0: - log.error(f'🔄 获取失败: {path} - 内容为空') - break chunk_size = 1024 content = bytearray() - with tqdm_asyncio(total=total_size, unit='B', unit_scale=True, desc=f'🔃 下载 {path}', bar_format="{l_bar}{bar} [{n_fmt}/{total_fmt}] {postfix}") as pbar: + with tqdm_asyncio(total=total_size, unit='B', unit_scale=True, desc=f'下载 {path}', colour='#ffadad') as pbar: async for chunk in r.content.iter_chunked(chunk_size): content.extend(chunk) pbar.update(len(chunk)) return content else: - log.error(f'🔄 获取失败: {path} - 状态码: {r.status}') + log.error(f' 🔄 获取失败: {path} - 状态码: {r.status}') except ClientError: - log.error(f'🔄 获取失败: {path} - 连接错误') + log.error(f' 🔄 获取失败: {path} - 连接错误') retry -= 1 - log.warning(f'🔄 重试剩余次数: {retry} - {path}') - log.error(f'🔄 超过最大重试次数: {path}') - raise Exception(f'🔄 无法下载: {path}') + log.warning(f' 🔄 重试剩余次数: {retry} - {path}') + log.error(f' 🔄 超过最大重试次数: {path}') + raise Exception(f' 🔄 无法下载: {path}') diff --git a/common/migration.py b/common/migration.py index 7cb2f9f..9475863 100644 --- a/common/migration.py +++ b/common/migration.py @@ -9,13 +9,13 @@ from .get_steam_path import steam_path directory = Path(steam_path / "config" / "stplug-in") def migrate(st_use): - if st_use: - log.info('🔃 检测到你正在使用SteamTools,尝试迁移旧文件') - if directory.exists(): + if st_use == True: + log.info('检测到你正在使用SteamTools,尝试迁移旧文件') + if os.path.exists(directory): for filename in os.listdir(directory): if filename.startswith("Onekey_unlock_"): new_filename = filename[len("Onekey_unlock_"):] - + old_file = os.path.join(directory, filename) new_file = os.path.join(directory, new_filename) @@ -25,22 +25,20 @@ def migrate(st_use): except Exception as e: log.error(f'Failed to rename {filename} -> {new_filename}: {e}') else: - log.error('❗ 故障,正在重新安装SteamTools') - temp_path = Path('./temp') - temp_path.mkdir(exist_ok=True) + log.error('故障,正在重新安装SteamTools') + temp_path = './temp' + if not os.path.exists(temp_path): + os.mkdir(temp_path) down_url = 'https://steamtools.net/res/SteamtoolsSetup.exe' - out_path = temp_path / 'SteamtoolsSetup.exe' - try: - with requests.get(down_url, stream=True) as r: - r.raise_for_status() + out_path = './temp/SteamtoolsSetup.exe' + with requests.get(down_url, stream=True) as r: + if r.status_code == 200: with open(out_path, 'wb') as f: for chunk in r.iter_content(chunk_size=8192): f.write(chunk) - except requests.HTTPError: - log.error('下载失败,网络错误') - return - - subprocess.run([str(out_path)], check=True) - subprocess.run(['rm', '-rf', str(temp_path)]) + else: + log.error('网络错误') + subprocess.run(str(out_path)) + os.rmdir(temp_path) else: - log.info('未使用SteamTools,停止迁移') + log.info('未使用SteamTools,停止迁移') \ No newline at end of file diff --git a/common/st_unlock.py b/common/st_unlock.py index f49c582..a92f9a2 100644 --- a/common/st_unlock.py +++ b/common/st_unlock.py @@ -13,13 +13,13 @@ async def stool_add(depot_data, app_id): lua_filepath = steam_path / "config" / "stplug-in" / lua_filename async with lock: - log.info(f'✅ SteamTools解锁文件生成: {lua_filepath}') + log.info(f' ✅ SteamTools解锁文件生成: {lua_filepath}') async with aiofiles.open(lua_filepath, mode="w", encoding="utf-8") as lua_file: await lua_file.write(f'addappid({app_id}, 1, "None")\n') for depot_id, depot_key in depot_data: await lua_file.write(f'addappid({depot_id}, 1, "{depot_key}")\n') luapacka_path = steam_path / "config" / "stplug-in" / "luapacka.exe" - subprocess.run([str(luapacka_path), str(lua_filepath)], check=True) + subprocess.run([str(luapacka_path), str(lua_filepath)]) os.remove(lua_filepath) - return True + return True \ No newline at end of file diff --git a/main.py b/main.py index f74ed4f..54d031b 100644 --- a/main.py +++ b/main.py @@ -8,25 +8,23 @@ from common.init_text import init from common.main_func import main lock = asyncio.Lock() + init() repos = [ - 'ikun0014/ManifestHub', - 'Auiowu/ManifestAutoUpdate', - 'tymolu233/ManifestAutoUpdate' -] - -def get_app_id(): - log.info('App ID可以在SteamDB或Steam商店链接页面查看') - return input("请输入游戏AppID:").strip() - + 'ikun0014/ManifestHub', + 'Auiowu/ManifestAutoUpdate', + 'tymolu233/ManifestAutoUpdate' + ] if __name__ == '__main__': try: while True: - app_id = get_app_id() + log.info('App ID可以在SteamDB或Steam商店链接页面查看') + app_id = input("请输入游戏AppID:").strip() asyncio.run(main(app_id, repos)) except KeyboardInterrupt: exit() except Exception as e: log.error(f' ⚠ 发生错误: {stack_error(e)},将在5秒后退出') - time.sleep(5) \ No newline at end of file + time.sleep(5) + os.system('pause') \ No newline at end of file