This commit is contained in:
181
tests/check_websockets.py
Normal file
181
tests/check_websockets.py
Normal file
@@ -0,0 +1,181 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user