LichessStatTgWeb/check_recent_games.py

144 lines
5.1 KiB
Python
Raw Permalink 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
"""Скрипт для проверки недавних игр пользователя через Lichess API"""
import requests
import json
from datetime import datetime, timedelta
import sys
def get_recent_games(username: str, minutes: int = 30):
"""Получить игры за последние N минут"""
# Вычисляем временные метки
now = datetime.now()
since_time = now - timedelta(minutes=minutes)
since_ms = int(since_time.timestamp() * 1000)
until_ms = int(now.timestamp() * 1000)
print(f"🔍 Проверяем игры для {username}")
print(f"⏰ Период: с {since_time.strftime('%Y-%m-%d %H:%M:%S')} до {now.strftime('%Y-%m-%d %H:%M:%S')}")
print(f"📅 Timestamps: since={since_ms}, until={until_ms}")
print()
# Делаем запрос к Lichess API
url = f"https://lichess.org/api/games/user/{username}"
params = {
'since': since_ms,
'until': until_ms,
'max': 1000,
'rated': 'true' # Только рейтинговые
}
headers = {
'Accept': 'application/x-ndjson'
}
try:
response = requests.get(url, params=params, headers=headers, timeout=30)
if response.status_code == 404:
print(f"❌ Пользователь {username} не найден (404)")
return []
elif response.status_code != 200:
print(f"❌ Ошибка API: {response.status_code} - {response.text[:200]}")
return []
# Парсим NDJSON
games = []
content = response.text.strip()
if content:
for line in content.split('\n'):
if line.strip():
try:
game = json.loads(line)
games.append(game)
except json.JSONDecodeError as e:
print(f"⚠️ Ошибка парсинга JSON: {e}")
continue
return games
except Exception as e:
print(f"❌ Ошибка при запросе: {e}")
return []
def format_game_time(created_at_ms: int) -> str:
"""Форматирует время создания игры"""
dt = datetime.fromtimestamp(created_at_ms / 1000)
return dt.strftime('%Y-%m-%d %H:%M:%S')
def main():
username = sys.argv[1] if len(sys.argv) > 1 else "vrubelroman"
minutes = int(sys.argv[2]) if len(sys.argv) > 2 else 40
games = get_recent_games(username, minutes)
if not games:
print("❌ Игры не найдены")
return
print(f"✅ Найдено игр: {len(games)}")
print()
print("=" * 80)
now = datetime.now()
for i, game in enumerate(games, 1):
game_id = game.get('id', 'N/A')
created_at_ms = game.get('createdAt', 0)
speed = game.get('speed', 'unknown')
rated = game.get('rated', False)
# Результат
white = game.get('players', {}).get('white', {})
black = game.get('players', {}).get('black', {})
white_user = white.get('user', {}).get('name', 'N/A')
black_user = black.get('user', {}).get('name', 'N/A')
winner = game.get('winner')
# Определяем результат для пользователя
if white_user == username:
result = "Победа" if winner == "white" else ("Поражение" if winner == "black" else "Ничья")
opponent = black_user
elif black_user == username:
result = "Победа" if winner == "black" else ("Поражение" if winner == "white" else "Ничья")
opponent = white_user
else:
result = "N/A"
opponent = "N/A"
game_time = format_game_time(created_at_ms)
time_ago = now - datetime.fromtimestamp(created_at_ms / 1000)
minutes_ago = int(time_ago.total_seconds() / 60)
print(f"\n🎮 Игра #{i}")
print(f" ID: {game_id}")
print(f" Время: {game_time} ({minutes_ago} минут назад)")
print(f" Скорость: {speed}")
print(f" Рейтинговая: {'Да' if rated else 'Нет'}")
print(f" Соперник: {opponent}")
print(f" Результат: {result}")
# Рейтинг
if white_user == username:
rating_change = white.get('ratingDiff', 0)
final_rating = white.get('rating', 0)
elif black_user == username:
rating_change = black.get('ratingDiff', 0)
final_rating = black.get('rating', 0)
else:
rating_change = 0
final_rating = 0
if rating_change != 0 or final_rating != 0:
print(f" Рейтинг: {final_rating} ({rating_change:+d})")
print()
print("=" * 80)
print(f"\n📊 Всего игр за последние {minutes} минут: {len(games)}")
if __name__ == "__main__":
main()