main functions commit
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2025-10-19 19:50:00 +09:00
parent ce72785184
commit 3050e084fa
39 changed files with 7149 additions and 186 deletions

181
tests/check_websockets.py Normal file
View 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()