Merge main master
This commit is contained in:
BIN
GeoLite2-City.mmdb
Normal file
BIN
GeoLite2-City.mmdb
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 59 MiB |
63
bot/log_processor.py
Normal file
63
bot/log_processor.py
Normal file
@@ -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
|
||||||
Reference in New Issue
Block a user