#!/usr/bin/env python3 """ feishu_msg_hook.py — 监控飞书消息中的文件附件并自动下载 检测消息中的 file 类型,自动下载到 /root/projects/uploads/。 """ import json, os, sys, subprocess, re, time UPLOAD_DIR = "/root/projects/uploads" LOG_FILE = "/root/personal/tools/feishu_downloads.log" SCRIPT_PATH = "/root/personal/tools/feishu_download.py" os.makedirs(UPLOAD_DIR, exist_ok=True) def log(msg): ts = time.strftime("%Y-%m-%d %H:%M:%S") with open(LOG_FILE, "a") as f: f.write(f"[{ts}] {msg}\n") print(msg) def process_message(message_id): """调用下载脚本""" result = subprocess.run( ["python3", SCRIPT_PATH, message_id, UPLOAD_DIR], capture_output=True, text=True, timeout=120 ) if result.returncode != 0: log(f"ERROR 下载失败 [{message_id}]: {result.stderr[:300]}") return None # 解析 JSON 输出 for line in result.stdout.split("\n"): if line.startswith("JSON_OUTPUT:"): data = json.loads(line[12:]) log(f"✅ 下载成功: {data['file_name']} ({data['file_size']/1024/1024:.1f} MB)") return data if __name__ == "__main__": if len(sys.argv) < 2: # 从 stdin 读取消息(OpenClaw 模式) for line in sys.stdin: try: msg = json.loads(line.strip()) mid = msg.get("message_id", "") msg_type = msg.get("msg_type", "") if msg_type == "file" and mid: process_message(mid) except: pass else: # 直接从参数读取 message_id process_message(sys.argv[1])