新增功能:

- 设置页新增「使用代理更新」开关(用户级 settings.json 的 update_via_proxy,默认关):开启后检查更新与下载走节点隧道(CONNECT),关闭时直连仓库 releases API——直连不通的网络可开启隧道,默认直连避免节点隧道故障影响更新检查
This commit is contained in:
RoyirinRosmontis
2026-08-24 12:07:42 +08:00
parent f92c3f52e0
commit a08ca154c9
+36 -10
View File
@@ -590,6 +590,17 @@ def _set_local_port(port):
_settings_save(data) _settings_save(data)
log(f"代理转发端口已保存: {port}(下次开启代理生效)") log(f"代理转发端口已保存: {port}(下次开启代理生效)")
def _update_via_proxy():
"""更新检查/下载是否走节点隧道(CONNECT);设置项,默认关=直连仓库。"""
return bool(_settings_load().get("update_via_proxy", False))
def _set_update_via_proxy(enabled):
"""写回「使用代理更新」设置(立即生效)。"""
data = _settings_load()
data["update_via_proxy"] = bool(enabled)
_settings_save(data)
log(f"更新方式已设为: {'走代理隧道' if enabled else '直连仓库'}")
def _ver_tuple(v): def _ver_tuple(v):
"""版本号转数字元组:'v0.1.0' -> (0, 1, 0),无法解析的段按 0 处理。""" """版本号转数字元组:'v0.1.0' -> (0, 1, 0),无法解析的段按 0 处理。"""
parts = [] parts = []
@@ -1390,7 +1401,7 @@ class SettingsDialog(QDialog):
super().__init__(parent) super().__init__(parent)
self.setWindowTitle("设置") self.setWindowTitle("设置")
self.setWindowIcon(load_icon()) self.setWindowIcon(load_icon())
self.setFixedSize(300, 230) self.setFixedSize(300, 260)
self.setStyleSheet(f""" self.setStyleSheet(f"""
QDialog {{ background-color: {C_BG}; }} QDialog {{ background-color: {C_BG}; }}
QLabel {{ color: {C_TEXT}; font-family: "Microsoft YaHei", "Segoe UI", sans-serif; font-size: 12px; }} QLabel {{ color: {C_TEXT}; font-family: "Microsoft YaHei", "Segoe UI", sans-serif; font-size: 12px; }}
@@ -1427,6 +1438,13 @@ class SettingsDialog(QDialog):
port_row.addWidget(self.ed_port) port_row.addWidget(self.ed_port)
layout.addLayout(port_row) layout.addLayout(port_row)
# 更新方式:是否走节点隧道(默认关 = 直连仓库)
self.cb_update_proxy = QCheckBox("使用代理更新")
self.cb_update_proxy.setChecked(_update_via_proxy())
self.cb_update_proxy.setToolTip("开启后检查更新与下载走节点隧道(CONNECT);默认直连仓库")
self.cb_update_proxy.setStyleSheet(f"color: {C_SUBTEXT}; font-size: 12px;")
layout.addWidget(self.cb_update_proxy)
layout.addStretch() layout.addStretch()
# 提示语:按钮上方居中 # 提示语:按钮上方居中
@@ -1475,6 +1493,7 @@ class SettingsDialog(QDialog):
self.lb_hint.setStyleSheet(f"color: {C_RED}; font-size: 11px;") self.lb_hint.setStyleSheet(f"color: {C_RED}; font-size: 11px;")
return return
_set_local_port(port) _set_local_port(port)
_set_update_via_proxy(bool(self.cb_update_proxy.isChecked()))
self.ed_port.setText(str(port)) self.ed_port.setText(str(port))
self.lb_hint.setText(f"已保存: {port},下次开启代理生效") self.lb_hint.setText(f"已保存: {port},下次开启代理生效")
self.lb_hint.setStyleSheet(f"color: {C_GREEN}; font-size: 11px;") self.lb_hint.setStyleSheet(f"color: {C_GREEN}; font-size: 11px;")
@@ -2032,20 +2051,15 @@ class MainWindow(QWidget):
self._latest_version = "" self._latest_version = ""
self._download_url = "" self._download_url = ""
try: try:
import json, urllib.request, base64 import json, urllib.request
domain = _endpoint_domain()
if domain == "???":
log("更新检查: 未配置节点(nodes.json 域名为空),跳过")
return
# 基于 Gitea 仓库 releases API 检查更新;config.json 无 update_url 时用默认地址 # 基于 Gitea 仓库 releases API 检查更新;config.json 无 update_url 时用默认地址
url = str(_config_val("update_url", "") or "").strip() url = str(_config_val("update_url", "") or "").strip()
if not url: if not url:
url = ("https://git.bu4.ren/api/v1/repos/RoyirinRosmontis/" url = ("https://git.bu4.ren/api/v1/repos/RoyirinRosmontis/"
"Private-Proxy/releases/latest") "Private-Proxy/releases/latest")
log("正在检查更新...") log("正在检查更新...")
# 显式走本地转发器隧道,不依赖系统代理状态:默认 opener 读注册表代理设置 if _update_via_proxy():
# (异常退出残留 127.0.0.1 代理 -> 连接被拒),不识别 PAC 的 AutoConfigURL, # 走节点隧道(CONNECT,设置「使用代理更新」开启时);显式代理避免残留干扰
# 直连服务器还可能被墙干扰 TLS 握手(SSL UNEXPECTED_EOF)
started_here = _ensure_forwarder() started_here = _ensure_forwarder()
try: try:
opener = urllib.request.build_opener(urllib.request.ProxyHandler( opener = urllib.request.build_opener(urllib.request.ProxyHandler(
@@ -2055,6 +2069,11 @@ class MainWindow(QWidget):
data = opener.open(req, timeout=20).read().decode("utf-8-sig") data = opener.open(req, timeout=20).read().decode("utf-8-sig")
finally: finally:
_release_forwarder(started_here) _release_forwarder(started_here)
else:
# 默认直连仓库;显式空代理避免系统/环境残留代理干扰
opener = _pac_no_proxy_opener()
req = urllib.request.Request(url)
data = opener.open(req, timeout=20).read().decode("utf-8-sig")
info = json.loads(data) info = json.loads(data)
# 基于 Gitea 仓库 releases API:版本取 tag_name,下载取 exe 附件链接 # 基于 Gitea 仓库 releases API:版本取 tag_name,下载取 exe 附件链接
self._latest_version = str(info.get("tag_name") or "") self._latest_version = str(info.get("tag_name") or "")
@@ -2097,7 +2116,8 @@ class MainWindow(QWidget):
log(f"正在下载新版本: {url}") log(f"正在下载新版本: {url}")
log(f"保存到: {save_path}") log(f"保存到: {save_path}")
# 同更新检查:显式走本地转发器隧道,不依赖系统代理状态 # 同更新检查:按「使用代理更新」设置选择隧道或直连
if _update_via_proxy():
started_here = _ensure_forwarder() started_here = _ensure_forwarder()
try: try:
opener = urllib.request.build_opener(urllib.request.ProxyHandler( opener = urllib.request.build_opener(urllib.request.ProxyHandler(
@@ -2109,6 +2129,12 @@ class MainWindow(QWidget):
data = resp.read() data = resp.read()
finally: finally:
_release_forwarder(started_here) _release_forwarder(started_here)
else:
opener = _pac_no_proxy_opener()
req = urllib.request.Request(url)
with opener.open(req, timeout=120) as resp:
data = resp.read()
if len(data) < 1024: if len(data) < 1024:
self._update_download_done.emit(False, "下载文件过小,可能不是有效的 EXE") self._update_download_done.emit(False, "下载文件过小,可能不是有效的 EXE")