- корректировка логики проверки дублей
This commit is contained in:
99
history_manager.py
Normal file
99
history_manager.py
Normal file
@@ -0,0 +1,99 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import json
|
||||
import os
|
||||
from datetime import datetime, timedelta
|
||||
import logging
|
||||
|
||||
|
||||
class HistoryManager:
|
||||
def __init__(self, history_file='published_history.json'):
|
||||
self.logger = logging.getLogger(__name__)
|
||||
self.history_file = history_file
|
||||
self.history = self._load_history()
|
||||
|
||||
def _load_history(self):
|
||||
"""Загрузка истории из файла"""
|
||||
if os.path.exists(self.history_file):
|
||||
try:
|
||||
with open(self.history_file, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
self.logger.info(f"Загружена история: {len(data.get('telegram', []))} записей для Telegram")
|
||||
return data
|
||||
except Exception as e:
|
||||
self.logger.error(f"Ошибка загрузки истории: {e}")
|
||||
return self._get_empty_history()
|
||||
else:
|
||||
self.logger.info("Файл истории не найден, создаём новый")
|
||||
return self._get_empty_history()
|
||||
|
||||
def _get_empty_history(self):
|
||||
"""Создание пустой структуры истории"""
|
||||
return {
|
||||
'telegram': [],
|
||||
'vk': [],
|
||||
'discord': []
|
||||
}
|
||||
|
||||
def _save_history(self):
|
||||
"""Сохранение истории в файл"""
|
||||
try:
|
||||
with open(self.history_file, 'w', encoding='utf-8') as f:
|
||||
json.dump(self.history, f, ensure_ascii=False, indent=2)
|
||||
self.logger.debug(f"История сохранена в {self.history_file}")
|
||||
except Exception as e:
|
||||
self.logger.error(f"Ошибка сохранения истории: {e}")
|
||||
|
||||
def is_published(self, platform, title):
|
||||
"""Проверка, была ли новость опубликована"""
|
||||
if platform not in self.history:
|
||||
return False
|
||||
|
||||
# Проверяем по заголовку
|
||||
for entry in self.history[platform]:
|
||||
if entry['title'].lower().strip() == title.lower().strip():
|
||||
self.logger.debug(f"Новость '{title}' уже была опубликована в {platform}")
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def add_published(self, platform, topic_id, title):
|
||||
"""Добавление записи об опубликованной новости"""
|
||||
if platform not in self.history:
|
||||
self.history[platform] = []
|
||||
|
||||
entry = {
|
||||
'topic_id': topic_id,
|
||||
'title': title,
|
||||
'published_at': datetime.now().isoformat()
|
||||
}
|
||||
|
||||
self.history[platform].append(entry)
|
||||
self.logger.info(f"Добавлена запись в историю {platform}: {title}")
|
||||
self._save_history()
|
||||
|
||||
def cleanup_old_entries(self, days=365):
|
||||
"""Удаление очень старых записей из истории (по умолчанию старше года)
|
||||
|
||||
ВНИМАНИЕ: Удаление записей может привести к повторной публикации старых новостей!
|
||||
Используйте этот метод только если файл истории стал слишком большим.
|
||||
"""
|
||||
cutoff_date = datetime.now() - timedelta(days=days)
|
||||
|
||||
for platform in self.history:
|
||||
original_count = len(self.history[platform])
|
||||
self.history[platform] = [
|
||||
entry for entry in self.history[platform]
|
||||
if datetime.fromisoformat(entry['published_at']) > cutoff_date
|
||||
]
|
||||
removed = original_count - len(self.history[platform])
|
||||
if removed > 0:
|
||||
self.logger.info(f"Удалено {removed} старых записей из истории {platform} (старше {days} дней)")
|
||||
|
||||
self._save_history()
|
||||
|
||||
def get_published_titles(self, platform):
|
||||
"""Получение списка опубликованных заголовков для платформы"""
|
||||
if platform not in self.history:
|
||||
return []
|
||||
return [entry['title'] for entry in self.history[platform]]
|
Reference in New Issue
Block a user