#!/usr/bin/env python3 """ リアルタイム チェックイン監視ツール スマホアプリからのチェックイン試行をリアルタイムで監視 """ import os import sys import django import subprocess import time import json import requests from datetime import datetime, timedelta import threading from collections import defaultdict # Django設定 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') django.setup() from rog.models import GpsLog, Entry, Team, NewEvent2 class CheckinMonitor: def __init__(self): self.last_check = datetime.now() self.request_counts = defaultdict(int) def check_recent_gpslog(self): """最近のGpsLog エントリーをチェック""" try: recent_logs = GpsLog.objects.filter( create_at__gte=self.last_check ).order_by('-create_at') if recent_logs.exists(): print(f"\n🆕 新しいGpsLogエントリー ({recent_logs.count()}件):") for log in recent_logs: print(f" ✅ ID:{log.id} イベント:{log.event_code} ゼッケン:{log.zekken_number} CP:{log.cp_number} 時刻:{log.create_at}") return True return False except Exception as e: print(f"❌ GpsLog確認エラー: {e}") return False def check_recent_entries(self): """最近のEntry更新をチェック""" try: recent_entries = Entry.objects.filter( start_time__gte=self.last_check ).order_by('-start_time') if recent_entries.exists(): print(f"\n🏁 新しいスタート ({recent_entries.count()}件):") for entry in recent_entries: team_name = entry.team.team_name if entry.team else "N/A" event_name = entry.event.event_name if entry.event else "N/A" print(f" 🚀 エントリーID:{entry.id} チーム:{team_name} イベント:{event_name} スタート時刻:{entry.start_time}") return True return False except Exception as e: print(f"❌ Entry確認エラー: {e}") return False def check_nginx_logs(self): """nginxログから最近のAPIアクセスを確認""" try: # Dockerログからnginxのアクセスログを取得 cmd = ["docker", "compose", "logs", "--tail=20", "nginx"] result = subprocess.run(cmd, capture_output=True, text=True, cwd="/Volumes/PortableSSD1TB/main/GifuTabi/rogaining_srv_exdb-2/rogaining_srv") if result.returncode == 0: lines = result.stdout.split('\n') api_requests = [] for line in lines: if 'checkin_from_rogapp' in line or 'start_from_rogapp' in line: api_requests.append(line) elif any(endpoint in line for endpoint in ['/api/user/', '/api/teams/', '/api/entry/']): api_requests.append(line) if api_requests: print(f"\n📡 最近のAPI アクセス ({len(api_requests)}件):") for req in api_requests[-5:]: # 最新5件のみ表示 print(f" 📥 {req.strip()}") return True return False except Exception as e: print(f"❌ nginxログ確認エラー: {e}") return False def check_app_logs(self): """アプリケーションログから最近のエラーを確認""" try: cmd = ["docker", "compose", "logs", "--tail=10", "app"] result = subprocess.run(cmd, capture_output=True, text=True, cwd="/Volumes/PortableSSD1TB/main/GifuTabi/rogaining_srv_exdb-2/rogaining_srv") if result.returncode == 0: lines = result.stdout.split('\n') error_logs = [] for line in lines: if any(keyword in line.lower() for keyword in ['error', 'warning', 'exception', 'failed', 'api_play']): error_logs.append(line) if error_logs: print(f"\n⚠️ 最近のアプリケーションログ ({len(error_logs)}件):") for log in error_logs[-3:]: # 最新3件のみ表示 print(f" 🔍 {log.strip()}") return True return False except Exception as e: print(f"❌ アプリケーションログ確認エラー: {e}") return False def test_checkin_endpoints(self): """チェックインエンドポイントの動作テスト""" endpoints = [ "http://localhost:8100/api/checkin_from_rogapp", "http://localhost:8100/gifuroge/checkin_from_rogapp" ] print(f"\n🔧 チェックインエンドポイント動作確認:") for endpoint in endpoints: try: response = requests.get(endpoint, timeout=5) status_color = "✅" if response.status_code == 405 else "❌" print(f" {status_color} {endpoint} → HTTP {response.status_code}") except Exception as e: print(f" ❌ {endpoint} → エラー: {e}") def run_monitor(self): """メイン監視ループ""" print("🚀 リアルタイム チェックイン監視開始") print("=" * 60) while True: try: current_time = datetime.now() print(f"\n⏰ 監視時刻: {current_time.strftime('%Y-%m-%d %H:%M:%S')}") # 各種チェック実行 has_new_data = False has_new_data |= self.check_recent_gpslog() has_new_data |= self.check_recent_entries() has_new_data |= self.check_nginx_logs() has_new_data |= self.check_app_logs() # 10分毎にエンドポイントテスト if current_time.minute % 10 == 0: self.test_checkin_endpoints() if not has_new_data: print(" 💤 新しいアクティビティなし") # 次回チェック時刻を更新 self.last_check = current_time print("-" * 40) time.sleep(30) # 30秒間隔で監視 except KeyboardInterrupt: print("\n🛑 監視を停止します") break except Exception as e: print(f"❌ 監視エラー: {e}") time.sleep(5) def main(): monitor = CheckinMonitor() monitor.run_monitor() if __name__ == "__main__": main()