diff --git a/scripts/wechat_agent.py b/scripts/wechat_agent.py index ab844b3..51945d6 100644 --- a/scripts/wechat_agent.py +++ b/scripts/wechat_agent.py @@ -7,6 +7,7 @@ os.environ["NO_PROXY"] = "*" from http.server import HTTPServer, BaseHTTPRequestHandler BOT_WXID = "wxid_7onnerpx2s2l22" +BLOCK_WXIDS = {"fmessage", "weixin", "wechat"} # 系统账号/微信团队,不回复 WX_API = "http://127.0.0.1:19088" LOG_FILE = r"C:\Users\hmo\Desktop\wechat_agent.log" TCP_PORT = 19099 @@ -37,6 +38,9 @@ def wxpost(path, data=None, timeout=10): return {"code": -1} def send_wx(wxid, msg): + # Strip weixin:// URLs that WeChat interprets as commands + import re as _re2 + msg = _re2.sub(r'weixin://[^\s]+', '[链接已过滤]', msg) r = wxpost("/api/sendTextMsg", {"wxid": wxid, "msg": msg}) log(f"SEND {wxid}: {r.get('msg','')}") @@ -111,10 +115,13 @@ def process_msg(raw_data): last_msg_time = time.time() try: d = json.loads(raw_data) - fu = d.get("fromUser", "") or d.get("fromuser", "") or d.get("wxid", "") - ct = d.get("content", "") or d.get("msg", "") + log(f"RAW: fromUser={d.get('fromUser','')} type={d.get('type','')} self={d.get('isSelf',d.get('self',0))}") + fu = d.get("fromUser", "") or d.get("fromuser", "") or d.get("sender", "") + ct = d.get("content", "") or d.get("msg", "") or d.get("text", "") msg_type = d.get("type", 1) - if not fu or not ct or fu == BOT_WXID: + is_self = d.get("isSelf", 0) or d.get("self", 0) + if not fu or not ct or fu == BOT_WXID or fu in BLOCK_WXIDS or fu.startswith("gh_") or is_self: + log(f"SKIP: fu={fu} self={is_self}") return # Route by message type if msg_type == 34: # Voice @@ -124,9 +131,11 @@ def process_msg(raw_data): return if msg_type == 3: # Image - wxhelper sends image as separate event return - # Text - log(f"<- {fu}: {ct[:50]}") - reply = call_hermes(fu, ct) + # Text - prepend sender wxid+name so Hermes knows who's talking + sender_name = get_nickname(fu) + msg_with_sender = f"[{fu}|{sender_name}] {ct}" + log(f"<- {fu} ({sender_name}): {ct[:50]}") + reply = call_hermes(fu, msg_with_sender) if reply: log(f"-> {fu}: {reply[:50]}") process_tags(reply, fu)