#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
端口流量上报 Webhook 监听服务 - 终极版
不依赖外部脚本，直接在 Python 中执行所有逻辑
"""

import http.server
import socketserver
import subprocess
import json
import sys
import re
from datetime import datetime

PORT = 52100
SECRET_KEY = "4fecf9fc9b785c6316895274805d8b75"
WORKER_URL = "https://port-traffic-bot.pocketmiddle.workers.dev"
ADMIN_CHAT_ID = "909957421"

def execute_traffic_report():
    """执行流量上报逻辑"""
    try:
        timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        sys.stderr.write(f"[{timestamp}] 开始执行流量采集...\n")
        sys.stderr.flush()
        
        # 执行 dog 命令
        result = subprocess.run(
            ['sh', '-c', 'echo "0" | /usr/local/bin/dog'],
            capture_output=True,
            text=True,
            timeout=10
        )
        
        raw_output = result.stdout
        sys.stderr.write(f"[{timestamp}] dog 命令执行完成，输出长度: {len(raw_output)}\n")
        sys.stderr.flush()
        
        # 提取包含 "端口:" 的行
        traffic_lines = []
        for line in raw_output.split('\n'):
            if '端口:' in line:
                # 去除 ANSI 颜色代码
                clean_line = re.sub(r'\x1b\[[0-9;]*m', '', line)
                traffic_lines.append(clean_line)
        
        if not traffic_lines:
            sys.stderr.write(f"[{timestamp}] 未检测到端口流量数据\n")
            sys.stderr.flush()
            return
        
        # 构造消息
        header = f"🔔 端口流量自动上报 | ⏰ {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n---"
        footer = "---\n🔗 上报来源: VPS Webhook"
        full_message = f"{header}\n" + "\n".join(traffic_lines) + f"\n{footer}"
        
        # 发送到 Worker
        payload = {
            "message": {
                "chat": {"id": int(ADMIN_CHAT_ID)},
                "text": full_message
            }
        }
        
        sys.stderr.write(f"[{timestamp}] 正在发送数据到 Worker...\n")
        sys.stderr.flush()
        
        response = subprocess.run(
            ['curl', '-s', '-X', 'POST', WORKER_URL,
             '-H', 'Content-Type: application/json',
             '-d', json.dumps(payload)],
            capture_output=True,
            text=True,
            timeout=10
        )
        
        sys.stderr.write(f"[{timestamp}] Worker 响应: {response.stdout}\n")
        sys.stderr.flush()
        
    except subprocess.TimeoutExpired:
        sys.stderr.write(f"[{timestamp}] 命令执行超时\n")
        sys.stderr.flush()
    except Exception as e:
        sys.stderr.write(f"[{timestamp}] 执行失败: {str(e)}\n")
        sys.stderr.flush()

class RequestHandler(http.server.SimpleHTTPRequestHandler):
    def do_POST(self):
        if self.path != "/trigger":
            self.send_error(404, "Not Found")
            return

        auth_header = self.headers.get('X-Secret-Key')
        if auth_header != SECRET_KEY:
            sys.stderr.write(f"[ERROR] Invalid secret key\n")
            sys.stderr.flush()
            self.send_error(403, "Forbidden")
            return

        try:
            timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            sys.stderr.write(f"[{timestamp}] 收到合法请求，正在触发流量上报...\n")
            sys.stderr.flush()
            
            # 直接执行流量上报
            execute_traffic_report()
            
            self.send_response(200)
            self.send_header('Content-type', 'application/json')
            self.end_headers()
            self.wfile.write(json.dumps({"status": "ok"}).encode('utf-8'))
            
        except Exception as e:
            sys.stderr.write(f"[ERROR] {str(e)}\n")
            sys.stderr.flush()
            self.send_error(500, str(e))
    
    def log_message(self, format, *args):
        timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        sys.stderr.write(f"[{timestamp}] {self.client_address[0]} - {format%args}\n")
        sys.stderr.flush()

if __name__ == "__main__":
    socketserver.TCPServer.allow_reuse_address = True
    
    try:
        with socketserver.TCPServer(("0.0.0.0", PORT), RequestHandler) as httpd:
            sys.stderr.write("=" * 60 + "\n")
            sys.stderr.write(f"🚀 流量上报监听服务已启动（终极版）\n")
            sys.stderr.write(f"📡 监听端口: {PORT}\n")
            sys.stderr.write(f"🔗 Worker URL: {WORKER_URL}\n")
            sys.stderr.write(f"⏰ 启动时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
            sys.stderr.write("=" * 60 + "\n")
            sys.stderr.flush()
            httpd.serve_forever()
    except KeyboardInterrupt:
        sys.stderr.write("\n🛑 服务已停止\n")
        sys.stderr.flush()
    except Exception as e:
        sys.stderr.write(f"❌ 启动失败: {str(e)}\n")
        sys.stderr.flush()
        sys.exit(1)
