# /// # callback.py # 描述:回调接口,用于重置和检测节点微信状态 # 作者:AI Generated # 创建日期:2026-04-05 # /// from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel from typing import Optional, Dict, Any from services.node_manager import node_manager from services.log_service import log_service from database_service import get_db_service from utils import require_api_key router = APIRouter(prefix="/callback", tags=["回调接口"]) class NodeResetRequest(BaseModel): node_id: str class NodeCallbackRequest(BaseModel): node_id: str async def sync_node_from_db(node_id: str) -> bool: db_service = get_db_service() if not db_service: return False node = db_service.get_node(node_id) if not node: return False existing = node_manager.nodes.get(node_id) if existing: existing.api_url = node.api_url existing.api_key = node.api_key else: await node_manager.add_node( node_id=node.node_id, name=node.name, api_url=node.api_url, api_key=node.api_key, description=node.description or "", group=node.group or "default" ) return True @router.post("/node/reset", summary="重置节点微信状态") async def reset_node_wechat_status(request: NodeResetRequest, _=Depends(require_api_key)) -> Dict[str, Any]: """ 重置节点的微信状态为online 通过发送消息到文件传输助手来检测微信是否正常 如果发送成功,则重置状态为online """ node_id = request.node_id await sync_node_from_db(node_id) node = await node_manager.get_node(node_id) if not node: raise HTTPException(status_code=404, detail=f"Node '{node_id}' not found") await node_manager.call_node_api(node_id, "/api/wechat/initialize", method="POST") result = await node_manager.call_node_api( node_id, "/api/message/send", method="POST", data={"receiver": "文件传输助手", "message": "WXAuto Center 状态检测消息"} ) if result.get("success"): node.wechat_status = "online" db_service = get_db_service() if db_service: db_service.update_node(node_id, wechat_status="online") log_service.success(f"Node {node_id} WeChat status reset to online", "Callback") return { "success": True, "message": "WeChat status reset", "data": { "node_id": node_id, "wechat_status": "online", "check_result": "success" } } else: node.wechat_status = "offline" db_service = get_db_service() if db_service: db_service.update_node(node_id, wechat_status="offline") error_msg = result.get("error", "Unknown error") log_service.error(f"Node {node_id} WeChat status check failed: {error_msg}", "Callback") return { "success": False, "message": "WeChat status check failed", "data": { "node_id": node_id, "wechat_status": "offline", "check_result": "failed", "error": error_msg } } @router.post("/node/check", summary="检测节点微信状态") async def check_node_wechat_status(request: NodeCallbackRequest, _=Depends(require_api_key)) -> Dict[str, Any]: """ 检测节点的微信状态 通过发送消息到文件传输助手来检测微信是否正常 返回检测结果 """ node_id = request.node_id await sync_node_from_db(node_id) node = await node_manager.get_node(node_id) if not node: raise HTTPException(status_code=404, detail=f"Node '{node_id}' not found") await node_manager.call_node_api(node_id, "/api/wechat/initialize", method="POST") result = await node_manager.call_node_api( node_id, "/api/message/send", method="POST", data={"receiver": "文件传输助手", "message": "WXAuto Center 状态检测消息"} ) if result.get("success"): node.wechat_status = "online" db_service = get_db_service() if db_service: db_service.update_node(node_id, wechat_status="online") return { "success": True, "message": "WeChat is normal", "data": { "node_id": node_id, "wechat_status": "online", "api_status": node.status } } else: node.wechat_status = "offline" db_service = get_db_service() if db_service: db_service.update_node(node_id, wechat_status="offline") return { "success": False, "message": "WeChat is abnormal", "data": { "node_id": node_id, "wechat_status": "offline", "api_status": node.status, "error": result.get("error", "Unknown error") } } @router.get("/node/{node_id}/status", summary="获取节点回调状态") async def get_node_callback_status(node_id: str, _=Depends(require_api_key)) -> Dict[str, Any]: """ 获取节点的当前状态,用于回调确认 """ node = await node_manager.get_node(node_id) if not node: raise HTTPException(status_code=404, detail=f"Node '{node_id}' not found") return { "success": True, "data": { "node_id": node.node_id, "name": node.name, "api_url": node.api_url, "api_status": node.status, "wechat_status": node.wechat_status, "is_healthy": node.is_healthy, "enabled": node.enabled, "group": node.group } }