diff --git a/GeoLite2-City.mmdb b/GeoLite2-City.mmdb new file mode 100644 index 00000000..bcc05f59 Binary files /dev/null and b/GeoLite2-City.mmdb differ diff --git a/bot/log_processor.py b/bot/log_processor.py new file mode 100644 index 00000000..5e09d8cf --- /dev/null +++ b/bot/log_processor.py @@ -0,0 +1,63 @@ +import geoip2.database +from user_agents import parse +from django.db.models import Count +from users.models import UserActivityLog + +# Геолокация по IP +def get_geolocation(ip): + try: + with geoip2.database.Reader('GeoLite2-City.mmdb') as reader: + response = reader.city(ip) + return { + 'city': response.city.name, + 'country': response.country.name, + 'latitude': response.location.latitude, + 'longitude': response.location.longitude, + } + except Exception: + return None + +# Анализ user-agent +def get_user_agent_details(user_agent_string): + user_agent = parse(user_agent_string) + return { + 'device': user_agent.device.family, + 'os': user_agent.os.family, + 'browser': user_agent.browser.family, + } + +# Обработка логов +def analyze_logs(): + logs = UserActivityLog.objects.all() + for log in logs: + # Геолокация + geo = get_geolocation(log.ip) + if geo: + log.location = f"{geo['city']}, {geo['country']}" + + # User Agent + ua_details = get_user_agent_details(log.UAString) + log.device = ua_details['device'] + log.platform = ua_details['os'] + log.agent = ua_details['browser'] + + # Сохранение обновлённой записи + log.save() + +# Генерация статистики +def generate_statistics(): + statistics = {} + + # Уникальные IP + unique_ips = UserActivityLog.objects.values('ip').distinct().count() + statistics['unique_ips'] = unique_ips + + # Популярные страницы + popular_pages = UserActivityLog.objects.values('page_url').annotate(count=Count('page_url')).order_by('-count')[:10] + statistics['popular_pages'] = [{"url": page['page_url'], "count": page['count']} for page in popular_pages] + + # Типы устройств + devices = UserActivityLog.objects.values('device').annotate(count=Count('device')).order_by('-count') + statistics['devices'] = [{"device": device['device'], "count": device['count']} for device in devices] + + return statistics