mirror of
https://github.com/Mzdyl/LiteLoaderQQNT_Install.git
synced 2026-10-27 04:49:44 +08:00
156 lines
5.5 KiB
Python
156 lines
5.5 KiB
Python
# coding=utf-8
|
|
import os
|
|
import sys
|
|
import winreg
|
|
import subprocess
|
|
import traceback
|
|
import tkinter as tk
|
|
from tkinter import filedialog
|
|
import shutil
|
|
import json
|
|
import re
|
|
|
|
# 设置标准输出编码为UTF-8
|
|
sys.stdout.reconfigure(encoding="utf-8")
|
|
subprocess.run("chcp 65001", shell=True)
|
|
|
|
def get_qq_exe_path():
|
|
"""通过文件对话框手动选择 QQ.exe 文件的路径"""
|
|
root = tk.Tk()
|
|
root.withdraw()
|
|
file_path = filedialog.askopenfilename(
|
|
title="选择 QQ.exe 文件", filetypes=[("Executable files", "*.exe")]
|
|
)
|
|
if not file_path:
|
|
raise FileNotFoundError("未选择 QQ.exe 文件。")
|
|
return file_path
|
|
|
|
def read_registry_key(hive, subkey, value_name):
|
|
try:
|
|
# 打开指定的注册表项
|
|
key = winreg.OpenKey(hive, subkey)
|
|
# 读取注册表项中指定名称的值
|
|
value, _ = winreg.QueryValueEx(key, value_name)
|
|
# 关闭注册表项
|
|
winreg.CloseKey(key)
|
|
return value
|
|
except Exception as e:
|
|
print(f"注册表读取失败: {e}")
|
|
return None
|
|
|
|
def launch_qq(exe_path):
|
|
"""
|
|
启动 QQ.exe,并附加参数 --enable-logging,同时将启动过程中的输出内容保存到桌面日志文件中。
|
|
|
|
:param exe_path: QQ.exe 的完整路径
|
|
"""
|
|
try:
|
|
# 获取桌面路径
|
|
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
|
|
log_file_path = os.path.join(desktop_path, "qq_launch_log.txt")
|
|
|
|
print(f"正在启动 QQ: {exe_path} --enable-logging")
|
|
print(f"日志将保存到: {log_file_path}")
|
|
|
|
with open(log_file_path, 'w', encoding='utf-8') as log_file:
|
|
# 启动 QQ.exe 并附加参数 --enable-logging
|
|
process = subprocess.Popen(
|
|
[exe_path, '--enable-logging'],
|
|
stdout=subprocess.PIPE, # 捕获标准输出
|
|
stderr=subprocess.PIPE, # 捕获标准错误
|
|
text=True, # 以文本模式处理输出
|
|
encoding='utf-8', # 显式指定编码为 UTF-8
|
|
errors='replace' # 替换无法解码的字节
|
|
)
|
|
|
|
# 实时打印并保存标准输出和标准错误
|
|
for stdout_line in iter(process.stdout.readline, ''):
|
|
print(stdout_line, end='')
|
|
log_file.write(stdout_line)
|
|
|
|
for stderr_line in iter(process.stderr.readline, ''):
|
|
print(stderr_line, end='', file=sys.stderr)
|
|
log_file.write(stderr_line)
|
|
|
|
process.stdout.close()
|
|
process.stderr.close()
|
|
process.wait()
|
|
|
|
print("QQ 已启动,日志已保存。")
|
|
except Exception as e:
|
|
print(f"启动 QQ 失败: {e}")
|
|
traceback.print_exc()
|
|
|
|
def get_qq_path():
|
|
try:
|
|
hive, subkey, value = winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\QQ", "UninstallString"
|
|
uninstall_string = read_registry_key(hive, subkey, value)
|
|
|
|
if not uninstall_string or not os.path.exists(uninstall_string):
|
|
raise FileNotFoundError("无法通过注册表读取 QQNT 的安装目录或路径不存在")
|
|
|
|
qq_exe_path = uninstall_string.replace("Uninstall.exe", "QQ.exe")
|
|
print(f"QQNT 的安装目录为: {qq_exe_path}")
|
|
except Exception as e:
|
|
print(e)
|
|
print("请手动选择 QQ.exe 文件 ")
|
|
qq_exe_path = get_qq_exe_path()
|
|
|
|
return qq_exe_path
|
|
|
|
def open_plugin_folder(file_path):
|
|
try:
|
|
# 获取LITELOADERQQNT_PROFILE和ML_LITELOADERQQNT_TEMP环境变量的值
|
|
lite_loader_profile = os.getenv("LITELOADERQQNT_PROFILE")
|
|
lite_loader_temp = os.getenv("ML_LITELOADERQQNT_TEMP")
|
|
|
|
# 如果环境变量不存在,则使用默认路径
|
|
default_path = os.path.join(file_path, "resources", "app", "LiteLoaderQQNT", "plugins")
|
|
if lite_loader_profile:
|
|
plugin_path = os.path.join(lite_loader_profile, "plugins")
|
|
elif lite_loader_temp:
|
|
print(
|
|
"未能检测到LITELOADERQQNT_PROFILE,但检测到安装器临时环境变量,使用安装器临时环境变量")
|
|
plugin_path = os.path.join(lite_loader_temp, "plugins")
|
|
else:
|
|
print("未能检测到LITELOADERQQNT_PROFILE,使用默认路径")
|
|
plugin_path = default_path
|
|
|
|
if os.path.exists(plugin_path):
|
|
os.startfile(plugin_path)
|
|
else:
|
|
print(f"插件文件夹不存在: {plugin_path}")
|
|
|
|
except Exception as e:
|
|
print(f"发生错误: {e}")
|
|
|
|
def main():
|
|
try:
|
|
while True:
|
|
print("请选择一个操作:")
|
|
print("1. 带log启动QQ")
|
|
print("2. 打开插件文件夹")
|
|
print("3. 退出")
|
|
|
|
choice = input("请输入选项: ")
|
|
|
|
qq_exe_path = get_qq_path()
|
|
file_path = os.path.dirname(qq_exe_path)
|
|
|
|
if choice == '1':
|
|
launch_qq(qq_exe_path)
|
|
elif choice == '2':
|
|
open_plugin_folder(file_path)
|
|
elif choice == '3':
|
|
print("退出程序")
|
|
break
|
|
else:
|
|
print("无效的选项,请重新选择。")
|
|
|
|
except Exception as e:
|
|
print(f"发生错误: {e}")
|
|
traceback.print_exc()
|
|
input("按 回车键 退出。")
|
|
|
|
if __name__ == "__main__":
|
|
main() |