初始化提交
This commit is contained in:
+182
@@ -0,0 +1,182 @@
|
||||
# ///
|
||||
# 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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user