Files
any-auto-register/api/proxies.py
2026-03-22 21:01:31 +08:00

79 lines
2.2 KiB
Python

from fastapi import APIRouter, Depends, HTTPException, BackgroundTasks
from sqlmodel import Session, select
from pydantic import BaseModel
from typing import Optional
from core.db import ProxyModel, get_session
from core.proxy_pool import proxy_pool
router = APIRouter(prefix="/proxies", tags=["proxies"])
class ProxyCreate(BaseModel):
url: str
region: str = ""
class ProxyBulkCreate(BaseModel):
proxies: list[str]
region: str = ""
@router.get("")
def list_proxies(session: Session = Depends(get_session)):
items = session.exec(select(ProxyModel)).all()
return items
@router.post("")
def add_proxy(body: ProxyCreate, session: Session = Depends(get_session)):
existing = session.exec(select(ProxyModel).where(ProxyModel.url == body.url)).first()
if existing:
raise HTTPException(400, "代理已存在")
p = ProxyModel(url=body.url, region=body.region)
session.add(p)
session.commit()
session.refresh(p)
return p
@router.post("/bulk")
def bulk_add_proxies(body: ProxyBulkCreate, session: Session = Depends(get_session)):
added = 0
for url in body.proxies:
url = url.strip()
if not url:
continue
existing = session.exec(select(ProxyModel).where(ProxyModel.url == url)).first()
if not existing:
session.add(ProxyModel(url=url, region=body.region))
added += 1
session.commit()
return {"added": added}
@router.delete("/{proxy_id}")
def delete_proxy(proxy_id: int, session: Session = Depends(get_session)):
p = session.get(ProxyModel, proxy_id)
if not p:
raise HTTPException(404, "代理不存在")
session.delete(p)
session.commit()
return {"ok": True}
@router.patch("/{proxy_id}/toggle")
def toggle_proxy(proxy_id: int, session: Session = Depends(get_session)):
p = session.get(ProxyModel, proxy_id)
if not p:
raise HTTPException(404, "代理不存在")
p.is_active = not p.is_active
session.add(p)
session.commit()
return {"is_active": p.is_active}
@router.post("/check")
def check_proxies(background_tasks: BackgroundTasks):
background_tasks.add_task(proxy_pool.check_all)
return {"message": "检测任务已启动"}