#!/usr/bin/env python3 """ Простая утилита для проверки WebSocket подключений """ import requests import json import sys from datetime import datetime # Конфигурация BASE_URL = "http://192.168.219.108" EMERGENCY_PORT = "8002" # Тестовые данные для авторизации TEST_EMAIL = "shadow85@list.ru" TEST_PASSWORD = "R0sebud1985" def get_auth_token(): """Получить токен авторизации""" try: response = requests.post( f"{BASE_URL}:8000/api/v1/auth/login", json={"email": TEST_EMAIL, "password": TEST_PASSWORD} ) if response.status_code == 200: token = response.json()["access_token"] print(f"✅ Авторизация успешна") return token else: print(f"❌ Ошибка авторизации: {response.status_code}") print(f" Ответ: {response.text}") return None except Exception as e: print(f"❌ Ошибка подключения: {e}") return None def check_websocket_connections(token): """Проверить WebSocket подключения""" print("\n" + "="*60) print("📊 СТАТИСТИКА WEBSOCKET ПОДКЛЮЧЕНИЙ") print("="*60) try: # Общая статистика stats_response = requests.get( f"{BASE_URL}:{EMERGENCY_PORT}/api/v1/websocket/stats", headers={"Authorization": f"Bearer {token}"} ) if stats_response.status_code == 200: stats = stats_response.json() print(f"🔢 Всего активных подключений: {stats.get('total_connections', 0)}") print(f"📨 Сообщений отправлено: {stats.get('total_messages_sent', 0)}") print(f"👥 Подключенные пользователи: {stats.get('connected_users', [])}") print(f"⏰ Время проверки: {stats.get('timestamp', 'N/A')}") else: print(f"❌ Ошибка получения статистики: {stats_response.status_code}") return # Детальная информация о подключениях connections_response = requests.get( f"{BASE_URL}:{EMERGENCY_PORT}/api/v1/websocket/connections", headers={"Authorization": f"Bearer {token}"} ) if connections_response.status_code == 200: connections = connections_response.json() if connections.get('connection_details'): print("\n" + "="*60) print("🔍 ДЕТАЛИ ПОДКЛЮЧЕНИЙ") print("="*60) for user_id, details in connections['connection_details'].items(): print(f"\n👤 Пользователь {user_id}:") print(f" 🕐 Подключен: {details.get('connected_at', 'N/A')}") print(f" 🌐 IP адрес: {details.get('client_host', 'N/A')}") print(f" 🔌 Порт: {details.get('client_port', 'N/A')}") print(f" 📤 Сообщений: {details.get('message_count', 0)}") print(f" ⏱️ Время онлайн: {details.get('duration_seconds', 0)} сек") print(f" 💓 Последний пинг: {details.get('last_ping', 'N/A')}") print(f" ✅ Статус: {details.get('status', 'unknown')}") else: print("\n📭 Нет активных WebSocket подключений") else: print(f"❌ Ошибка получения деталей: {connections_response.status_code}") except Exception as e: print(f"❌ Ошибка проверки: {e}") def ping_all_connections(token): """Пинг всех подключений""" print("\n" + "="*60) print("📡 ПРОВЕРКА ВСЕХ ПОДКЛЮЧЕНИЙ (PING)") print("="*60) try: response = requests.post( f"{BASE_URL}:{EMERGENCY_PORT}/api/v1/websocket/ping", headers={"Authorization": f"Bearer {token}"} ) if response.status_code == 200: result = response.json() print(f"✅ Пинг выполнен успешно") print(f"📊 Активных подключений: {result.get('active_connections', 0)}") print(f"❌ Отключенных пользователей: {result.get('disconnected_users', [])}") print(f"⏰ Время пинга: {result.get('ping_time', 'N/A')}") if result.get('disconnected_users'): print("⚠️ Обнаружены неактивные подключения:") for user_id in result['disconnected_users']: print(f" - Пользователь {user_id}") else: print(f"❌ Ошибка пинга: {response.status_code}") print(f" Ответ: {response.text}") except Exception as e: print(f"❌ Ошибка пинга: {e}") def send_test_broadcast(token): """Отправить тестовое сообщение""" print("\n" + "="*60) print("📢 ОТПРАВКА ТЕСТОВОГО СООБЩЕНИЯ") print("="*60) test_message = f"Тестовое сообщение от {datetime.now().strftime('%H:%M:%S')}" try: response = requests.post( f"{BASE_URL}:{EMERGENCY_PORT}/api/v1/websocket/broadcast", params={"message": test_message}, headers={"Authorization": f"Bearer {token}"} ) if response.status_code == 200: result = response.json() print(f"✅ Сообщение отправлено: '{test_message}'") print(f"👥 Получатели: {result.get('recipients', [])}") print(f"📝 Данные сообщения: {json.dumps(result.get('data', {}), indent=2, ensure_ascii=False)}") else: print(f"❌ Ошибка отправки: {response.status_code}") print(f" Ответ: {response.text}") except Exception as e: print(f"❌ Ошибка отправки: {e}") def main(): """Главная функция""" print("🚀 WebSocket Connection Monitor v1.0") print(f"🌐 Сервер: {BASE_URL}:{EMERGENCY_PORT}") print(f"👤 Тестовый пользователь: {TEST_EMAIL}") # Получаем токен token = get_auth_token() if not token: print("❌ Не удалось получить токен авторизации") sys.exit(1) # Выполняем проверки check_websocket_connections(token) ping_all_connections(token) send_test_broadcast(token) print("\n" + "="*60) print("✅ ПРОВЕРКА ЗАВЕРШЕНА") print("="*60) print("💡 Для постоянного мониторинга запускайте этот скрипт периодически") print("💡 Или используйте test_websocket_monitoring.py для полного тестирования") if __name__ == "__main__": main()