新增功能:
- 设置页新增「使用代理更新」开关(用户级 settings.json 的 update_via_proxy,默认关):开启后检查更新与下载走节点隧道(CONNECT),关闭时直连仓库 releases API——直连不通的网络可开启隧道,默认直连避免节点隧道故障影响更新检查
This commit is contained in:
+50
-24
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user