From e3d3087a5d1bd0f05528f20b23712a65abe396b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=AF=E5=A4=A7=E4=BE=A0?= Date: Fri, 13 Jun 2025 18:06:17 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix=20GitHub=E8=AF=B7=E6=B1=82=E5=A4=B4?= =?UTF-8?q?=E8=A1=A5=E4=B8=8AUA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/core/config.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/core/config.py b/app/core/config.py index 142a52d2..118bbee8 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -139,6 +139,7 @@ class ConfigModel(BaseModel): "api.github.com," "github.com," "raw.githubusercontent.com," + "codeload.github.com," "api.telegram.org") # DOH 解析服务器列表 DOH_RESOLVERS: str = "1.0.0.1,1.1.1.1,9.9.9.9,149.112.112.112" @@ -584,7 +585,8 @@ class Settings(BaseSettings, ConfigModel, LogConfigModel): """ if self.GITHUB_TOKEN: return { - "Authorization": f"Bearer {self.GITHUB_TOKEN}" + "Authorization": f"Bearer {self.GITHUB_TOKEN}", + "User-Agent": self.USER_AGENT, } return {} @@ -612,7 +614,8 @@ class Settings(BaseSettings, ConfigModel, LogConfigModel): print(f"无效的令牌或仓库信息: {token_pair}") continue headers[repo_info] = { - "Authorization": f"Bearer {token}" + "Authorization": f"Bearer {token}", + "User-Agent": self.USER_AGENT, } except Exception as e: print(f"处理令牌对 '{token_pair}' 时出错: {e}") From c45953f63accf3467f7b5f17a249317177982932 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=AF=E5=A4=A7=E4=BE=A0?= Date: Fri, 13 Jun 2025 18:12:48 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat=20=E7=BD=91=E7=BB=9C=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=8A=A0=E9=80=9F=E4=BB=A3=E7=90=86=E4=BB=A5?= =?UTF-8?q?=E5=8F=8AGitHub=20Token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix 测试耗时大于1秒时,时间差计算错误 --- app/api/endpoints/system.py | 54 +++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 14 deletions(-) diff --git a/app/api/endpoints/system.py b/app/api/endpoints/system.py index 8186bd34..d1101cb2 100644 --- a/app/api/endpoints/system.py +++ b/app/api/endpoints/system.py @@ -1,6 +1,7 @@ import asyncio import io import json +import re import tempfile from collections import deque from datetime import datetime @@ -446,30 +447,55 @@ def ruletest(title: str, @router.get("/nettest", summary="测试网络连通性") -def nettest(url: str, - proxy: bool, - _: schemas.TokenPayload = Depends(verify_token)): +def nettest( + url: str, + proxy: bool, + include: Optional[str] = None, + _: schemas.TokenPayload = Depends(verify_token), +): """ 测试网络连通性 """ # 记录开始的毫秒数 start_time = datetime.now() + headers = None + if "github" in url or "{GITHUB_PROXY}" in url: + # 这是github的连通性测试 + url = url.replace( + "{GITHUB_PROXY}", UrlUtils.standardize_base_url(settings.GITHUB_PROXY or "") + ) + headers = settings.GITHUB_HEADERS url = url.replace("{TMDBAPIKEY}", settings.TMDB_API_KEY) - result = RequestUtils(proxies=settings.PROXY if proxy else None, - ua=settings.USER_AGENT).get_res(url) + url = url.replace( + "{PIP_PROXY}", + UrlUtils.standardize_base_url(settings.PIP_PROXY or "https://pypi.org/simple/"), + ) + result = RequestUtils( + proxies=settings.PROXY if proxy else None, + headers=headers, + timeout=10, + ua=settings.USER_AGENT, + ).get_res(url) # 计时结束的毫秒数 end_time = datetime.now() + time = round((end_time - start_time).total_seconds() * 1000) # 计算相关秒数 - if result and result.status_code == 200: - return schemas.Response(success=True, data={ - "time": round((end_time - start_time).microseconds / 1000) - }) - elif result: - return schemas.Response(success=False, message=f"错误码:{result.status_code}", data={ - "time": round((end_time - start_time).microseconds / 1000) - }) + if result is None: + return schemas.Response(success=False, message="无法连接", data={"time": time}) + elif result.status_code == 200: + if include and not re.search(r"%s" % include, result.text, re.IGNORECASE): + # 通常是被加速代理跳转到其它页面了 + logger.error(f"{url} 的响应内容不匹配包含规则 {include}") + return schemas.Response( + success=False, + message=f"无效响应,不匹配 {include}", + data={"time": time}, + ) + return schemas.Response(success=True, data={"time": time}) else: - return schemas.Response(success=False, message="网络连接失败!") + return schemas.Response( + success=False, message=f"错误码:{result.status_code}", data={"time": time} + ) @router.get("/modulelist", summary="查询已加载的模块ID列表", response_model=schemas.Response)