diff --git a/src/database/crud.py b/src/database/crud.py index 95de676..5cea615 100644 --- a/src/database/crud.py +++ b/src/database/crud.py @@ -532,6 +532,11 @@ def delete_proxy(db: Session, proxy_id: int) -> bool: db.commit() return True +def delete_disabled_proxies(db: Session) -> int: + """删除所有已禁用代理""" + deleted = db.query(Proxy).filter(Proxy.enabled == False).delete(synchronize_session=False) + db.commit() + return deleted def update_proxy_last_used(db: Session, proxy_id: int) -> bool: """更新代理最后使用时间""" diff --git a/src/web/routes/settings.py b/src/web/routes/settings.py index d096fa4..fa6ddb8 100644 --- a/src/web/routes/settings.py +++ b/src/web/routes/settings.py @@ -468,6 +468,58 @@ class ProxyUpdateRequest(BaseModel): enabled: Optional[bool] = None priority: Optional[int] = None +def _test_proxy_connectivity(proxy_url: str) -> dict: + """测试代理连通性并返回统一结果。""" + import time + from curl_cffi import requests as cffi_requests + + test_url = "https://api.ipify.org?format=json" + start_time = time.time() + + proxies_dict = { + "http": proxy_url, + "https": proxy_url + } + + response = cffi_requests.get( + test_url, + proxies=proxies_dict, + timeout=3, + impersonate="chrome110" + ) + + elapsed_time = time.time() - start_time + if response.status_code == 200: + ip_info = response.json() + return { + "success": True, + "ip": ip_info.get("ip", ""), + "response_time": round(elapsed_time * 1000), + "message": f"代理连接成功,出口 IP: {ip_info.get('ip', 'unknown')}" + } + + return { + "success": False, + "message": f"状态码: {response.status_code}" + } + + +def _auto_disable_proxy_on_failure(db, proxy, message: str) -> dict: + """代理测试失败时自动禁用,并返回统一提示。""" + auto_disabled = False + if proxy.enabled: + crud.update_proxy(db, proxy.id, enabled=False) + auto_disabled = True + + final_message = message + if auto_disabled: + final_message = f"{message},已自动禁用" + + return { + "success": False, + "auto_disabled": auto_disabled, + "message": final_message, + } @router.get("/proxies") async def get_proxies_list(enabled: Optional[bool] = None): diff --git a/static/js/settings.js b/static/js/settings.js index d3546eb..0a0314c 100644 --- a/static/js/settings.js +++ b/static/js/settings.js @@ -31,6 +31,7 @@ const elements = { proxiesTable: document.getElementById('proxies-table'), addProxyBtn: document.getElementById('add-proxy-btn'), testAllProxiesBtn: document.getElementById('test-all-proxies-btn'), + deleteDisabledProxiesBtn: document.getElementById('delete-disabled-proxies-btn'), addProxyModal: document.getElementById('add-proxy-modal'), proxyItemForm: document.getElementById('proxy-item-form'), closeProxyModal: document.getElementById('close-proxy-modal'), diff --git a/templates/settings.html b/templates/settings.html index 1d1dc65..c0867e3 100644 --- a/templates/settings.html +++ b/templates/settings.html @@ -95,6 +95,7 @@

代理列表

+
@@ -115,7 +116,7 @@ - +
🌐
暂无代理