Explorar el Código

新增默认启动服务商,新增 demo 获取各个服务商的延迟

mrh hace 1 año
padre
commit
66496c9fba

+ 0 - 19
backend/config/app.yaml

@@ -1,19 +0,0 @@
-subscriptions:
-- url: http://sub.sub.sub.subsub123456789.com/answer/land?token=a7cbdde987a58068b82e52d57ee5eecd
-  file_path: g:\code\upwork\zhang_crawl_bio\local_proxy_pool\backend\output\subscriptions\d92ef962.yaml
-  updated_at: 2025-01-27 17:18:58.485513
-  error: 0
-  detail:
-    msg: 更新订阅成功
-- url: https://www.yfjc.xyz/api/v1/client/subscribe?token=b74f2207492053926f7511a8e474048f
-  file_path: g:\code\upwork\zhang_crawl_bio\local_proxy_pool\backend\output\subscriptions\6137e542.yaml
-  updated_at: 2025-01-27 17:18:57.155802
-  error: 0
-  detail:
-    msg: 更新订阅成功
-- url: http://subscr.xpoti.com/v3/subscr?id=90bd6ff1da374a89b4ba763f354f20bf
-  file_path: g:\code\upwork\zhang_crawl_bio\local_proxy_pool\backend\output\subscriptions\dde42ec3.yaml
-  updated_at: 2025-01-27 17:18:58.296957
-  error: 0
-  detail:
-    msg: 更新订阅成功

+ 0 - 60
backend/config/app_yaml.py

@@ -1,60 +0,0 @@
-
-from datetime import datetime
-from pathlib import Path
-from typing import List
-from pydantic import BaseModel
-from sqlmodel import SQLModel
-import yaml
-from config.settings import settings
-
-def save_yaml_dump(config: dict, save_as: Path) -> Path:
-    """保存配置文件"""
-    save_as.parent.mkdir(parents=True, exist_ok=True)
-    
-    with open(save_as, 'w', encoding='utf-8') as f:
-        yaml.dump(
-            config,
-            f,
-            Dumper=yaml.SafeDumper,
-            allow_unicode=True,
-            indent=2,
-            sort_keys=False
-        )
-    return save_as
-
-class BaseYaml(BaseModel):
-    """Yaml基类"""
-    def save(self, save_as: Path=settings.APP_CONFIG) -> Path:
-        """保存配置文件"""
-        return save_yaml_dump(self.model_dump(), save_as)
-
-    @classmethod
-    def load(cls, file_path: Path=settings.APP_CONFIG) -> 'BaseYaml':
-        """加载配置文件"""
-
-class Subscription(SQLModel):
-    url: str
-    file_path: str
-    updated_at: datetime
-    error: int
-    detail: dict
-
-
-
-class AppYaml(BaseModel):
-    subscriptions: List[Subscription] = []
-
-    def save(self, save_as: Path=settings.APP_CONFIG) -> Path:
-        """保存配置文件"""
-        save_yaml_dump(self.model_dump(), save_as)
-        return self.load(save_as)
-
-    @classmethod
-    def load(cls, file_path: Path=settings.APP_CONFIG) -> 'AppYaml':
-        """加载配置文件"""
-        with open(file_path, 'r', encoding='utf-8') as f:
-            config = yaml.safe_load(f) or {}
-        # print(type(config), config)
-        return cls(**config)
-
-app_yaml = AppYaml.load()

+ 2 - 1
backend/config/settings.py

@@ -1,10 +1,10 @@
+import sys
 from pathlib import Path
 from typing import Any
 
 from pydantic import BaseModel
 from pydantic_settings import BaseSettings
 
-
 class LogConfig(BaseModel):
     datetime_format: str = "%Y-%m-%d %H:%M:%S"
     LOG_LEVEL: str = "DEBUG"  # 修改日志级别为 DEBUG
@@ -39,3 +39,4 @@ class Settings(BaseSettings):
 
 
 settings = Settings()
+sys.path.append(str(settings.BASE_DIR))

+ 47 - 1
backend/database/models/subscription.py

@@ -1,6 +1,6 @@
 from datetime import datetime
 from typing import Dict, List, Optional
-from sqlmodel import SQLModel, Field,Session,select,Relationship
+from sqlmodel import SQLModel, Field,Session,select,Relationship,func
 from sqlalchemy.engine import Engine
 from sqlalchemy.dialects.postgresql import JSON
 from pydantic import BaseModel
@@ -82,6 +82,52 @@ class SubscriptionManager:
     def get_proxies(self) -> List[MihomoMeta]:
         with Session(self.engine) as session:
             return session.exec(select(MihomoMeta)).all()
+    
+    def get_running_proxies(self) -> List[MihomoMeta]:
+        with Session(self.engine) as session:
+            all = session.exec(
+                select(MihomoMeta)
+                .where(MihomoMeta.pid.is_not(None))
+            ).all()
+            return all
+    def get_each_provider_proxies(self):
+        with Session(self.engine) as session:
+            # 子查询:获取每个 provider_name 的最小 id
+            subquery = (
+                select(
+                    MihomoMeta.provider_name,
+                    func.min(MihomoMeta.id).label("min_id")
+                )
+                .group_by(MihomoMeta.provider_name)
+                .subquery()
+            )
+            # 主查询:通过联接到子查询获取每个 provider_name 的第一条记录
+            stmt = (
+                select(MihomoMeta)
+                .join(subquery, MihomoMeta.id == subquery.c.min_id)
+            )
+            # 执行查询并获取结果
+            return session.exec(stmt).all()
+    def get_each_provider_running_proxies(self) -> List[MihomoMeta]:
+        with Session(self.engine) as session:
+            subquery = (
+                select(
+                    MihomoMeta.provider_name,
+                    func.min(MihomoMeta.id).label("min_id")
+                )
+                .where(MihomoMeta.pid.is_not(None))
+                .group_by(MihomoMeta.provider_name)
+                .subquery()
+            )
+            # 主查询:通过联接到子查询获取每个 provider_name 的第一条记录
+            stmt = (
+                select(MihomoMeta)
+                .join(subquery, MihomoMeta.id == subquery.c.min_id)
+            )
+            # 执行查询并获取结果
+            return session.exec(stmt).all()
+
+
     def get_proxies_by_provider(self) -> Dict[str, List[MihomoMeta]]:
         """
         返回一个字典,键是 provider_name,值是该 provider_name 对应的所有 MihomoMeta 记录列表。

+ 36 - 0
backend/demo/client.py

@@ -0,0 +1,36 @@
+import asyncio
+import httpx
+import sys
+from pathlib import Path
+sys.path.append(str(Path(__file__).parent.parent.absolute()))
+print(sys.path)
+from config.logu import get_logger
+from routers.mihomo import MihomoMetaWithURL
+logger = get_logger('client',file=False)
+BASE_URL = "http://localhost:5010"
+
+def get_proxies() -> dict:
+    url = f"{BASE_URL}/subscriptions/proxies"
+    response = httpx.get(url)
+    return response.json()
+
+def startup():
+    url = f"{BASE_URL}/mihomo/startup"
+    response = httpx.post(url,timeout=30)
+    response.raise_for_status()  # 确保请求成功
+    return response.json()
+
+def proxy_delay(provider_name, external_controller: str):
+    # http://127.0.0.1:9351/group/FSCloud/delay?url=https%3A%2F%2Fwww.gstatic.com%2Fgenerate_204&timeout=2000
+    url = f"http://{external_controller}/group/{provider_name}/delay?url=https%3A%2F%2Fwww.gstatic.com%2Fgenerate_204&timeout=2000"
+    response = httpx.get(url,timeout=30)
+    return response.json()
+
+def main():
+    res = startup()
+    for item in res:
+        logger.info(f"服务商: {item}")
+        res = proxy_delay(item.get('provider_name'),item.get('external_controller'))
+        logger.info(f"延迟: {res}")
+if __name__ == "__main__":
+    main()

+ 0 - 6
backend/hello.py

@@ -1,6 +0,0 @@
-def main():
-    print("Hello from backend!")
-
-
-if __name__ == "__main__":
-    main()

+ 12 - 27
backend/routers/mihomo.py

@@ -65,7 +65,7 @@ async def request_select_proxy_name(external_ctl: str, provider_name: str, proxy
                 else:
                     raise HTTPException(status_code=500, detail=f"Failed to select proxy after {max_retries} attempts: {str(e)}")
 @mihomo_router.post("/start")
-async def post_start_mihomo(request: MihomoBatchRequest):
+async def post_start_mihomo(request: MihomoBatchRequest) -> MihomoMetaWithURL:
     db = SubscriptionManager()
     logger.info(f"{request}")
     # 获取对应的订阅文件
@@ -135,27 +135,9 @@ async def post_start_mihomo(request: MihomoBatchRequest):
             raise HTTPException(status_code=500, detail=str(e))
 
 @mihomo_router.post("/startup")
-async def post_start_each_provider():
+async def post_start_each_provider() -> List[MihomoMetaWithURL]:
     db = SubscriptionManager()
-    with Session(db.engine) as session:
-        # 子查询:获取每个 provider_name 的最小 id
-        subquery = (
-            select(
-                MihomoMeta.provider_name,
-                func.min(MihomoMeta.id).label("min_id")
-            )
-            .group_by(MihomoMeta.provider_name)
-            .subquery()
-        )
-        
-        # 主查询:通过联接到子查询获取每个 provider_name 的第一条记录
-        stmt = (
-            select(MihomoMeta)
-            .join(subquery, MihomoMeta.id == subquery.c.min_id)
-        )
-        
-        # 执行查询并获取结果
-        results = session.exec(stmt).all()
+    results = db.get_each_provider_proxies()
     ret = [] 
     for provider_moho in results:
         try:
@@ -195,12 +177,7 @@ async def post_stop_mihomo(request: MihomoBatchRequest):
 @mihomo_router.get("/")
 async def get_mihomo_running_status():
     db = SubscriptionManager()
-    with Session(db.engine) as session:
-        all = session.exec(
-            select(MihomoMeta)
-            .where(MihomoMeta.pid.is_not(None))
-        ).all()
-    
+    all = db.get_running_proxies()
     result = []
     for mihomo_model in all:
         mihomo_with_url = MihomoMetaWithURL(**mihomo_model.model_dump())
@@ -211,6 +188,14 @@ async def get_mihomo_running_status():
     
     return result
 
+@mihomo_router.get("/proxies_reachability")
+async def get_proxies_reachability():
+    db = SubscriptionManager()
+    res = db.get_each_provider_running_proxies()
+    logger.info(f"get_each_provider_running_proxies {res}")
+
+
+
 @mihomo_router.get("/external-controller")
 async def get_controller_urls():
     running_list = await get_mihomo_running_status()