新增功能:

- 设置页新增「使用代理更新」开关(用户级 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
+50 -24
View File
@@ -590,6 +590,17 @@ def _set_local_port(port):
_settings_save(data)
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):
"""版本号转数字元组:'v0.1.0' -> (0, 1, 0),无法解析的段按 0 处理。"""
parts = []
@@ -1390,7 +1401,7 @@ class SettingsDialog(QDialog):
super().__init__(parent)
self.setWindowTitle("设置")
self.setWindowIcon(load_icon())
self.setFixedSize(300, 230)
self.setFixedSize(300, 260)
self.setStyleSheet(f"""
QDialog {{ background-color: {C_BG}; }}
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)
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()
# 提示语:按钮上方居中
@@ -1475,6 +1493,7 @@ class SettingsDialog(QDialog):
self.lb_hint.setStyleSheet(f"color: {C_RED}; font-size: 11px;")
return
_set_local_port(port)
_set_update_via_proxy(bool(self.cb_update_proxy.isChecked()))
self.ed_port.setText(str(port))
self.lb_hint.setText(f"已保存: {port},下次开启代理生效")
self.lb_hint.setStyleSheet(f"color: {C_GREEN}; font-size: 11px;")
@@ -2032,29 +2051,29 @@ class MainWindow(QWidget):
self._latest_version = ""
self._download_url = ""
try:
import json, urllib.request, base64
domain = _endpoint_domain()
if domain == "???":
log("更新检查: 未配置节点(nodes.json 域名为空),跳过")
return
import json, urllib.request
# 基于 Gitea 仓库 releases API 检查更新;config.json 无 update_url 时用默认地址
url = str(_config_val("update_url", "") or "").strip()
if not url:
url = ("https://git.bu4.ren/api/v1/repos/RoyirinRosmontis/"
"Private-Proxy/releases/latest")
log("正在检查更新...")
# 显式走本地转发器隧道,不依赖系统代理状态:默认 opener 读注册表代理设置
# (异常退出残留 127.0.0.1 代理 -> 连接被拒),不识别 PAC 的 AutoConfigURL,
# 直连服务器还可能被墙干扰 TLS 握手(SSL UNEXPECTED_EOF)
started_here = _ensure_forwarder()
try:
opener = urllib.request.build_opener(urllib.request.ProxyHandler(
{"http": f"{PROXY_HOST}:{PROXY_PORT}",
"https": f"{PROXY_HOST}:{PROXY_PORT}"}))
if _update_via_proxy():
# 走节点隧道(CONNECT,设置「使用代理更新」开启时);显式代理避免残留干扰
started_here = _ensure_forwarder()
try:
opener = urllib.request.build_opener(urllib.request.ProxyHandler(
{"http": f"{PROXY_HOST}:{PROXY_PORT}",
"https": f"{PROXY_HOST}:{PROXY_PORT}"}))
req = urllib.request.Request(url)
data = opener.open(req, timeout=20).read().decode("utf-8-sig")
finally:
_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")
finally:
_release_forwarder(started_here)
info = json.loads(data)
# 基于 Gitea 仓库 releases API:版本取 tag_name,下载取 exe 附件链接
self._latest_version = str(info.get("tag_name") or "")
@@ -2097,18 +2116,25 @@ class MainWindow(QWidget):
log(f"正在下载新版本: {url}")
log(f"保存到: {save_path}")
# 同更新检查:显式走本地转发器隧道,不依赖系统代理状态
started_here = _ensure_forwarder()
try:
opener = urllib.request.build_opener(urllib.request.ProxyHandler(
{"http": f"{PROXY_HOST}:{PROXY_PORT}",
"https": f"{PROXY_HOST}:{PROXY_PORT}"}))
# 同更新检查:按「使用代理更新」设置选择隧道或直连
if _update_via_proxy():
started_here = _ensure_forwarder()
try:
opener = urllib.request.build_opener(urllib.request.ProxyHandler(
{"http": f"{PROXY_HOST}:{PROXY_PORT}",
"https": f"{PROXY_HOST}:{PROXY_PORT}"}))
req = urllib.request.Request(url)
with opener.open(req, timeout=120) as resp:
data = resp.read()
finally:
_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()
finally:
_release_forwarder(started_here)
if len(data) < 1024:
self._update_download_done.emit(False, "下载文件过小,可能不是有效的 EXE")