From 863d6ccc5728fe6320649fb7ba1dd91325892b74 Mon Sep 17 00:00:00 2001 From: RoyirinRosmontis Date: Sun, 23 Aug 2026 14:44:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8A=9F=E8=83=BD=EF=BC=9A?= =?UTF-8?q?=20-=20=E6=A3=80=E6=9F=A5=E6=9B=B4=E6=96=B0=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E5=9F=BA=E4=BA=8E=20Gitea=20=E4=BB=93=E5=BA=93=20releases=20AP?= =?UTF-8?q?I=EF=BC=9A=E7=89=88=E6=9C=AC=E5=8F=96=20release=20=E7=9A=84=20t?= =?UTF-8?q?ag=5Fname=EF=BC=88v0.1.0=20=E5=BC=8F=EF=BC=89=EF=BC=8C=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E5=8F=96=20exe=20=E9=99=84=E4=BB=B6=E9=93=BE=E6=8E=A5?= =?UTF-8?q?=EF=BC=9B=E8=AF=AD=E4=B9=89=E5=8C=96=E7=89=88=E6=9C=AC=E6=AF=94?= =?UTF-8?q?=E8=BE=83=EF=BC=88v0.2.0=20>=20v0.1.0=EF=BC=89=20-=20config.jso?= =?UTF-8?q?n=20=E7=A7=BB=E9=99=A4=20update=5Furl=EF=BC=88latest=5Fversion.?= =?UTF-8?q?json=20=E4=B8=8D=E5=86=8D=E4=BD=BF=E7=94=A8=EF=BC=89=EF=BC=8C?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E6=A3=80=E6=9F=A5=E5=9C=B0=E5=9D=80=E4=B8=BA?= =?UTF-8?q?=E4=BB=93=E5=BA=93=20API=EF=BC=9BCDN=20=E4=B8=8A=E7=9A=84=20lat?= =?UTF-8?q?est=5Fversion.json=20=E5=8F=AF=E4=B8=8B=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lite/proxy_lite.py | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/lite/proxy_lite.py b/lite/proxy_lite.py index eb11dd1..abff749 100644 --- a/lite/proxy_lite.py +++ b/lite/proxy_lite.py @@ -590,6 +590,24 @@ def _set_local_port(port): _settings_save(data) log(f"代理转发端口已保存: {port}(下次开启代理生效)") +def _ver_tuple(v): + """版本号转数字元组:'v0.1.0' -> (0, 1, 0),无法解析的段按 0 处理。""" + parts = [] + for p in str(v).strip().lstrip("vV").split("."): + try: + parts.append(int(p)) + except ValueError: + parts.append(0) + return tuple(parts) + +def _version_newer(latest, current): + """latest 是否比 current 新(逐段数字比较,位数不同补 0)。""" + lt, ct = _ver_tuple(latest), _ver_tuple(current) + n = max(len(lt), len(ct)) + lt += (0,) * (n - len(lt)) + ct += (0,) * (n - len(ct)) + return lt > ct + # 以下模块级取值需在 _data_path 定义之后执行 VERSION = _config_val("version", "999908162319") _TLS_LOCAL_PORT = _port_val() # 本地转发器监听端口(设置 > 内置 config > 1080) @@ -2019,10 +2037,11 @@ class MainWindow(QWidget): if domain == "???": log("更新检查: 未配置节点(nodes.json 域名为空),跳过") return - # 更新链接优先取 config.json 的 update_url,缺失时回退到域名拼接 - url = _config_val("update_url", "") + # 基于 Gitea 仓库 releases API 检查更新;config.json 无 update_url 时用默认地址 + url = str(_config_val("update_url", "") or "").strip() if not url: - url = f"https://{domain}/latest_version.json" + url = ("https://git.bu4.ren/api/v1/repos/RoyirinRosmontis/" + "Private-Proxy/releases/latest") log("正在检查更新...") # 显式走本地转发器隧道,不依赖系统代理状态:默认 opener 读注册表代理设置 # (异常退出残留 127.0.0.1 代理 -> 连接被拒),不识别 PAC 的 AutoConfigURL, @@ -2037,12 +2056,12 @@ class MainWindow(QWidget): finally: _release_forwarder(started_here) info = json.loads(data) - log("客户端认证成功") - self._latest_version = info.get("latest_version", "") - self._download_url = info.get("download_url", "") - log(f"当前版本: {VERSION},最新版本: {self._latest_version}") - if VERSION.startswith("9999"): - log("您当前正在使用 Lite 版") + # 基于 Gitea 仓库 releases API:版本取 tag_name,下载取 exe 附件链接 + self._latest_version = str(info.get("tag_name") or "") + assets = info.get("assets") or [] + self._download_url = (assets[0].get("browser_download_url") or "" + if assets else "") + log(f"当前版本: {VERSION},最新版本: {self._latest_version or '未知'}") except Exception as e: log(f"更新检查失败: {e}") self._latest_version = "" @@ -2053,7 +2072,7 @@ class MainWindow(QWidget): def _on_update_done(self): """更新检查完成后恢复按钮;发现新版本时弹窗询问是否下载。""" self.btn_toggle.setEnabled(True) - if self._latest_version and self._latest_version > VERSION: + if self._latest_version and _version_newer(self._latest_version, VERSION): reply = QMessageBox.question( self, "发现新版本", f"当前版本: {VERSION}\n最新版本: {self._latest_version}\n\n是否下载更新?",