99 lines
2.7 KiB
Python
99 lines
2.7 KiB
Python
"""定时调度:周期性刷新 cf_clearance(集成到 grok2api 进程内)"""
|
|
|
|
import asyncio
|
|
|
|
from loguru import logger
|
|
|
|
from .config import get_refresh_interval, get_flaresolverr_url, is_enabled
|
|
from .solver import solve_cf_challenge
|
|
|
|
_task: asyncio.Task | None = None
|
|
|
|
|
|
async def _update_app_config(
|
|
cf_cookies: str,
|
|
user_agent: str = "",
|
|
browser: str = "",
|
|
cf_clearance: str = "",
|
|
) -> bool:
|
|
"""直接更新 grok2api 的运行时配置"""
|
|
try:
|
|
from app.core.config import config
|
|
|
|
proxy_update = {"cf_cookies": cf_cookies}
|
|
if cf_clearance:
|
|
proxy_update["cf_clearance"] = cf_clearance
|
|
if user_agent:
|
|
proxy_update["user_agent"] = user_agent
|
|
if browser:
|
|
proxy_update["browser"] = browser
|
|
|
|
await config.update({"proxy": proxy_update})
|
|
|
|
logger.info(f"配置已更新: cf_cookies (长度 {len(cf_cookies)}), 指纹: {browser}")
|
|
if user_agent:
|
|
logger.info(f"配置已更新: user_agent = {user_agent}")
|
|
return True
|
|
except Exception as e:
|
|
logger.error(f"更新配置失败: {e}")
|
|
return False
|
|
|
|
|
|
async def refresh_once() -> bool:
|
|
"""执行一次刷新流程"""
|
|
logger.info("=" * 50)
|
|
logger.info("开始刷新 cf_clearance...")
|
|
|
|
result = await solve_cf_challenge()
|
|
if not result:
|
|
logger.error("刷新失败:无法获取 cf_clearance")
|
|
return False
|
|
|
|
success = await _update_app_config(
|
|
cf_cookies=result["cookies"],
|
|
cf_clearance=result.get("cf_clearance", ""),
|
|
user_agent=result.get("user_agent", ""),
|
|
browser=result.get("browser", ""),
|
|
)
|
|
|
|
if success:
|
|
logger.info("刷新完成")
|
|
else:
|
|
logger.error("刷新失败: 更新配置失败")
|
|
|
|
return success
|
|
|
|
|
|
async def _scheduler_loop():
|
|
"""后台调度循环"""
|
|
logger.info(
|
|
f"cf_refresh scheduler started (FlareSolverr: {get_flaresolverr_url()}, interval: {get_refresh_interval()}s)"
|
|
)
|
|
|
|
# 周期性刷新(每次循环重新读取配置,支持面板修改实时生效)
|
|
while True:
|
|
if is_enabled():
|
|
await refresh_once()
|
|
else:
|
|
logger.debug("cf_refresh disabled, skip refresh")
|
|
interval = get_refresh_interval()
|
|
await asyncio.sleep(interval)
|
|
|
|
|
|
def start():
|
|
"""启动后台刷新任务"""
|
|
global _task
|
|
if _task is not None:
|
|
return
|
|
_task = asyncio.get_event_loop().create_task(_scheduler_loop())
|
|
logger.info("cf_refresh background task started")
|
|
|
|
|
|
def stop():
|
|
"""停止后台刷新任务"""
|
|
global _task
|
|
if _task is not None:
|
|
_task.cancel()
|
|
_task = None
|
|
logger.info("cf_refresh background task stopped")
|