From 24c94ccfbebdfab82dc2eeae66396e36e6a9c86a Mon Sep 17 00:00:00 2001 From: 16337 <1633794139@qq.com> Date: Mon, 9 Mar 2026 15:35:32 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E7=A7=BB=E9=99=A4=E4=BC=81?= =?UTF-8?q?=E5=BE=AEWebhook=E6=9C=BA=E5=99=A8=E4=BA=BA=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E5=A4=8DVLM=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除 wechat_service.send_webhook_alarm 方法 - 删除 config.py 中 webhook_url 配置 - 简化 notify_dispatch 通知逻辑(仅保留应用消息) - 修复 vlm_service 使用项目统一 logger - 添加 VLM 调用 URL 调试日志 Co-Authored-By: Claude Opus 4.6 --- app/config.py | 2 -- app/services/notify_dispatch.py | 29 +++++---------------- app/services/vlm_service.py | 4 +-- app/services/wechat_service.py | 45 --------------------------------- 4 files changed, 8 insertions(+), 72 deletions(-) diff --git a/app/config.py b/app/config.py index b59d3df..9ace39c 100644 --- a/app/config.py +++ b/app/config.py @@ -62,7 +62,6 @@ class WeChatConfig: enabled: bool = False test_uids: str = "" # 演示模式:逗号分隔的企微userid,如 "zhangsan,lisi" service_base_url: str = "" # H5页面公网地址,如 https://vsp.viewshanghai.com - webhook_url: str = "" # 群机器人Webhook地址 @dataclass @@ -171,7 +170,6 @@ def load_settings() -> Settings: enabled=os.getenv("WECHAT_ENABLED", "false").lower() == "true", test_uids=os.getenv("WECHAT_TEST_UIDS", ""), service_base_url=os.getenv("SERVICE_BASE_URL", ""), - webhook_url=os.getenv("WECHAT_WEBHOOK_URL", ""), ), agent=AgentConfig( llm_api_key=os.getenv("DASHSCOPE_API_KEY", ""), diff --git a/app/services/notify_dispatch.py b/app/services/notify_dispatch.py index 99ccd25..53d0c8a 100644 --- a/app/services/notify_dispatch.py +++ b/app/services/notify_dispatch.py @@ -97,26 +97,8 @@ async def process_alarm_notification(alarm_data: Dict): event_time.strftime("%Y-%m-%d %H:%M:%S") if isinstance(event_time, datetime) else str(event_time or "") ) - detail_url = f"{service_base_url}/static/alarm_detail.html?alarm_id={alarm_id}" - sent = False - - # 优先 Webhook(无需IP白名单) - if settings.wechat.webhook_url: - sent = await wechat_service.send_webhook_alarm( - webhook_url=settings.wechat.webhook_url, - alarm_id=alarm_id, - alarm_type=alarm_type, - area_name=area_name, - camera_name=camera_name, - description=description, - event_time=event_time_str, - alarm_level=alarm_level, - detail_url=detail_url, - ) - - # Webhook 未配置或失败时,降级到应用消息 - if not sent and wechat_service.enabled: + if wechat_service.enabled: user_ids = [p["wechat_uid"] for p in persons] sent = await wechat_service.send_alarm_card( user_ids=user_ids, @@ -130,11 +112,12 @@ async def process_alarm_notification(alarm_data: Dict): alarm_level=alarm_level, service_base_url=service_base_url, ) - - if not sent: - logger.warning(f"告警通知未发送: {alarm_id}, webhook和应用消息均未成功") + if sent: + logger.info(f"告警通知完成: {alarm_id}") + else: + logger.warning(f"告警通知发送失败: {alarm_id}") else: - logger.info(f"告警通知完成: {alarm_id}") + logger.info(f"企微未启用,跳过通知: {alarm_id}") except Exception as e: logger.error(f"告警通知处理失败: {alarm_id}, error={e}", exc_info=True) diff --git a/app/services/vlm_service.py b/app/services/vlm_service.py index 37dd286..5e4c1a4 100644 --- a/app/services/vlm_service.py +++ b/app/services/vlm_service.py @@ -7,12 +7,11 @@ VLM 视觉语言模型复核服务 import asyncio import json -import logging from typing import Optional, Dict from openai import AsyncOpenAI -logger = logging.getLogger(__name__) +from app.utils.logger import logger # 算法类型 → VLM Prompt 模板 VLM_PROMPTS = { @@ -110,6 +109,7 @@ class VLMService: ) try: + logger.info(f"VLM 复核开始: type={alarm_type}, url={snapshot_url[:80]}...") resp = await asyncio.wait_for( self._client.chat.completions.create( model=self._model, diff --git a/app/services/wechat_service.py b/app/services/wechat_service.py index fb58e7a..89cbb11 100644 --- a/app/services/wechat_service.py +++ b/app/services/wechat_service.py @@ -176,51 +176,6 @@ class WeChatService: logger.error(f"发送文本消息异常: {e}") return False - async def send_webhook_alarm( - self, - webhook_url: str, - alarm_id: str, - alarm_type: str, - area_name: str, - camera_name: str, - description: str, - event_time: str, - alarm_level: int = 2, - detail_url: str = "", - ) -> bool: - """通过群机器人 Webhook 发送告警通知(无需IP白名单)""" - type_names = {"leave_post": "人员离岗", "intrusion": "周界入侵"} - level_names = {1: "提醒", 2: "一般", 3: "严重", 4: "紧急"} - - type_name = type_names.get(alarm_type, alarm_type) - level_name = level_names.get(alarm_level, "一般") - - content = ( - f"## 【{level_name}】{type_name}告警\n" - f"> 区域:{area_name}\n" - f"> 摄像头:{camera_name}\n" - f"> 时间:{event_time}\n" - f"> AI描述:**{description}**\n" - ) - if detail_url: - content += f"> [查看详情]({detail_url})\n" - - msg = {"msgtype": "markdown", "markdown": {"content": content}} - - try: - async with httpx.AsyncClient(timeout=10) as client: - resp = await client.post(webhook_url, json=msg) - data = resp.json() - if data.get("errcode") != 0: - logger.error(f"Webhook发送失败: {data}") - return False - logger.info(f"Webhook告警已发送: alarm={alarm_id}") - return True - except Exception as e: - logger.error(f"Webhook发送异常: {e}") - return False - - # 全局单例 _wechat_service: Optional[WeChatService] = None