diff --git a/gateway/linux/wechat_webhook.py b/gateway/linux/wechat_webhook.py index a977719..3e33e13 100644 --- a/gateway/linux/wechat_webhook.py +++ b/gateway/linux/wechat_webhook.py @@ -1,16 +1,9 @@ #!/usr/bin/env python3 -"""WeChat webhook receiver v2 - receives messages from docker-wechatbot-webhook.""" +"""WeChat webhook receiver v3 — per-user session context via Hermes session ID.""" import os, sys, json, logging, threading, queue, time from http.server import HTTPServer, BaseHTTPRequestHandler -# ── MoFin session routing (shared with XMPP) ── -_SCRIPTS_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "scripts") -if _SCRIPTS_DIR not in sys.path: - sys.path.insert(0, _SCRIPTS_DIR) -from chat_bridge import SessionBridge -from session_router import SessionRouter - HERMES_API = "http://192.168.1.246:8646/v1/chat/completions" HERMES_KEY = "hermes123" PORT = 5804 @@ -30,12 +23,6 @@ logging.basicConfig( ) log = logging.getLogger("wc-webhook") -# ── Session router (per-user session context via opencode.db) ── -_router = SessionRouter( - bridge=SessionBridge(session_id="wechat-mohe"), - default_session="wechat-mohe", -) - # ── 消息队列(串行处理,防止并发打爆 Hermes)────────────── _msg_queue = queue.Queue() @@ -55,15 +42,34 @@ def _hermes_worker(): def _do_forward(sender, sender_id, text): - """通过 SessionRouter 发送消息(自动带上下文 + 会话管理)。""" + """调用 Hermes API 并回复微信(带 X-Hermes-Session-Id 实现 per-user 上下文)。""" + session_id = f"wechat-{sender_id}" + payload = json.dumps({ + "model": "nova-4", + "messages": [ + {"role": "user", "content": f"[微信消息] 来自 {sender}({sender_id}): {text}"} + ] + }).encode() + try: - reply = _router.route("wechat", sender_id, text) - log.info(f"Router OK, reply: {reply[:60] if reply else '(empty)'}") + import urllib.request as ureq + handler = ureq.ProxyHandler({}) + opener = ureq.build_opener(handler) + req = ureq.Request(HERMES_API, data=payload, + headers={ + "Content-Type": "application/json", + "Authorization": f"Bearer {HERMES_KEY}", + "X-Hermes-Session-Id": session_id, + }) + resp = opener.open(req, timeout=600) + resp_data = json.loads(resp.read()) + reply = resp_data.get('choices', [{}])[0].get('message', {}).get('content', '') + log.info(f"Hermes OK [{sender[:8]}], reply: {reply[:60]}") if reply and sender: WebhookHandler._send_wechat_static(sender, reply) except Exception as e: - log.error(f"Router error: {e}") + log.error(f"Hermes error [{sender[:8]}]: {e}") # 启动 worker 线程