Files
chat/tests/check_websockets.py
Andrey K. Choi 3050e084fa
All checks were successful
continuous-integration/drone/push Build is passing
main functions commit
2025-10-19 19:50:00 +09:00

181 lines
7.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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()