some fixes
This commit is contained in:
117
test_admin_watch.py
Normal file
117
test_admin_watch.py
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Скрипт для подключения админа и просмотра видео от клиента
|
||||||
|
Требует, чтобы есть активное подключение клиента, отправляющего кадры
|
||||||
|
"""
|
||||||
|
|
||||||
|
import asyncio
|
||||||
|
import websockets
|
||||||
|
import json
|
||||||
|
import requests
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
import os
|
||||||
|
|
||||||
|
# Загружаем переменные окружения из .env
|
||||||
|
load_dotenv()
|
||||||
|
|
||||||
|
# Параметры подключения
|
||||||
|
HOST = os.getenv("PUBLIC_HOST", "192.168.0.112")
|
||||||
|
PORT = int(os.getenv("PORT", 8000))
|
||||||
|
|
||||||
|
# Учетные данные админа (из server.py)
|
||||||
|
ADMIN_USERNAME = "admin"
|
||||||
|
ADMIN_PASSWORD = "admin123"
|
||||||
|
|
||||||
|
async def admin_watch():
|
||||||
|
"""Админ логинится и смотрит видео от клиента"""
|
||||||
|
|
||||||
|
# 1. Логинимся как админ
|
||||||
|
print(f"[Admin] Logging in as {ADMIN_USERNAME}...")
|
||||||
|
session = requests.Session()
|
||||||
|
try:
|
||||||
|
login_response = session.post(
|
||||||
|
f"http://{HOST}:{PORT}/login",
|
||||||
|
data={
|
||||||
|
"username": ADMIN_USERNAME,
|
||||||
|
"password": ADMIN_PASSWORD
|
||||||
|
}
|
||||||
|
)
|
||||||
|
if login_response.status_code != 303 and login_response.status_code != 200:
|
||||||
|
print(f"[Admin] ❌ Failed to login: {login_response.status_code}")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Получаем session_id из cookies
|
||||||
|
session_id = session.cookies.get("session_id")
|
||||||
|
if not session_id:
|
||||||
|
print(f"[Admin] ❌ No session_id in cookies")
|
||||||
|
print(f"[Admin] Cookies: {session.cookies}")
|
||||||
|
return
|
||||||
|
|
||||||
|
print(f"[Admin] ✓ Logged in, session_id: {session_id[:16]}...")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"[Admin] ❌ Login error: {e}")
|
||||||
|
return
|
||||||
|
|
||||||
|
# 2. Получаем список активных комнат и клиентов
|
||||||
|
print(f"[Admin] Getting active clients...")
|
||||||
|
try:
|
||||||
|
dashboard_response = session.get(f"http://{HOST}:{PORT}/dashboard")
|
||||||
|
if dashboard_response.status_code != 200:
|
||||||
|
print(f"[Admin] ❌ Failed to get dashboard: {dashboard_response.status_code}")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Парсим HTML чтобы найти client_id (это сложновато, используем API)
|
||||||
|
# Для простоты - просто выведем сообщение о том, как найти client_id
|
||||||
|
print(f"[Admin] 💡 Open http://{HOST}:{PORT}/dashboard in browser to see active clients")
|
||||||
|
print(f"[Admin] 💡 Look for client_id in the page source or network tab")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"[Admin] ❌ Error: {e}")
|
||||||
|
return
|
||||||
|
|
||||||
|
# 3. Для тестирования подключимся к вебсокету админа
|
||||||
|
uri = f"ws://{HOST}:{PORT}/ws/admin/{session_id}"
|
||||||
|
print(f"[Admin] Connecting to WebSocket: {uri}")
|
||||||
|
|
||||||
|
try:
|
||||||
|
async with websockets.connect(uri) as ws:
|
||||||
|
# Получаем ответ сервера
|
||||||
|
response = await asyncio.wait_for(ws.recv(), timeout=5)
|
||||||
|
print(f"[Admin] ✓ Server response: {response}")
|
||||||
|
|
||||||
|
# Пример: отправляем команду "watch_client"
|
||||||
|
# Вам нужно знать client_id активного клиента
|
||||||
|
print(f"[Admin] 💡 To watch a client, send: {{'type': 'watch_client', 'client_id': 'CLIENT_ID_HERE'}}")
|
||||||
|
print(f"[Admin] 💡 After that, admin will receive binary video frames")
|
||||||
|
|
||||||
|
# Ждём сообщений от сервера
|
||||||
|
print(f"[Admin] Waiting for messages from server (press Ctrl+C to stop)...")
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
message = await asyncio.wait_for(ws.recv(), timeout=5)
|
||||||
|
if isinstance(message, bytes):
|
||||||
|
print(f"[Admin] ✓ Received {len(message)} bytes of video frame data")
|
||||||
|
else:
|
||||||
|
print(f"[Admin] ✓ Message: {message[:100]}")
|
||||||
|
except asyncio.TimeoutError:
|
||||||
|
# Таймаут OK - просто ждём дальше
|
||||||
|
continue
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print(f"\n[Admin] Disconnected")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"[Admin] ❌ WebSocket error: {e}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
print("=" * 60)
|
||||||
|
print("Admin WebSocket Test")
|
||||||
|
print("=" * 60)
|
||||||
|
print(f"Server: http://{HOST}:{PORT}")
|
||||||
|
print()
|
||||||
|
|
||||||
|
try:
|
||||||
|
asyncio.run(admin_watch())
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print("\n[Admin] Interrupted by user")
|
||||||
Reference in New Issue
Block a user