#!/usr/bin/env python3 """ Скрипт для обновления памяти OpenClaw на основе собранных данных из Telegram """ import os import sys import glob import re from datetime import datetime import logging # Настройка логирования logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler("update_memory.log"), logging.StreamHandler() ] ) logger = logging.getLogger(__name__) # Пути к файлам KNOWLEDGE_BASE = "knowledge_base.md" MEMORY_FILE = "/home/node/.openclaw/workspace/MEMORY.md" DAILY_MEMORY_DIR = "/home/node/.openclaw/workspace/memory" TOPICS_DIR = "data/topics" def create_daily_memory_file(): """Создает файл ежедневной памяти с информацией о собранных данных из Telegram""" try: today = datetime.now().strftime("%Y-%m-%d") memory_file = f"{DAILY_MEMORY_DIR}/{today}.md" # Проверяем, существует ли директория, если нет - создаем os.makedirs(DAILY_MEMORY_DIR, exist_ok=True) # Если файл уже существует, добавляем к нему, иначе создаем новый mode = 'a' if os.path.exists(memory_file) else 'w' with open(memory_file, mode, encoding='utf-8') as f: if mode == 'w': f.write(f"# Дневная память {today}\n\n") f.write(f"## Обновление данных из Telegram ({datetime.now().strftime('%H:%M:%S')})\n\n") # Проверяем, существует ли база знаний if os.path.exists(KNOWLEDGE_BASE): f.write("Собраны новые данные из Telegram-каналов и обновлена база знаний.\n\n") # Считаем количество обновленных тем topics_count = 0 for topic_dir in glob.glob(f"{TOPICS_DIR}/*"): if os.path.isdir(topic_dir) and os.path.basename(topic_dir) != "unclassified": topics_count += 1 f.write(f"Обновлено тем: {topics_count}\n") # Подсчитываем файлы за сегодня today_files = glob.glob(f"{TOPICS_DIR}/*/{today}.md") if today_files: f.write(f"Сегодня обновлено {len(today_files)} тем.\n\n") # Добавляем список обновленных тем f.write("Обновленные темы:\n") for file in today_files: topic_name = os.path.basename(os.path.dirname(file)).replace('_', ' ').capitalize() f.write(f"- {topic_name}\n") else: f.write("Попытка обновления данных из Telegram, но база знаний не найдена.\n") f.write("\n") logger.info(f"Создан файл ежедневной памяти: {memory_file}") return True except Exception as e: logger.error(f"Ошибка при создании файла ежедневной памяти: {e}") return False def update_memory(): """Обновляет основной файл памяти OpenClaw с информацией из базы знаний""" try: # Проверяем существование файлов if not os.path.exists(KNOWLEDGE_BASE): logger.error(f"Файл базы знаний {KNOWLEDGE_BASE} не найден") return False if not os.path.exists(MEMORY_FILE): logger.error(f"Файл памяти {MEMORY_FILE} не найден") return False # Читаем текущую память with open(MEMORY_FILE, 'r', encoding='utf-8') as f: memory_content = f.read() # Читаем базу знаний with open(KNOWLEDGE_BASE, 'r', encoding='utf-8') as f: kb_content = f.read() # Проверяем, есть ли раздел "Данные из Telegram" в памяти telegram_section_pattern = r'## Данные из Telegram\s+(.+?)(?=\n##|\Z)' telegram_section_match = re.search(telegram_section_pattern, memory_content, re.DOTALL) # Извлекаем основные данные из базы знаний kb_sections = {} current_section = None current_content = [] for line in kb_content.splitlines(): if line.startswith('## '): if current_section: kb_sections[current_section] = '\n'.join(current_content) current_section = line[3:].strip() current_content = [] elif current_section: current_content.append(line) # Добавляем последний раздел if current_section and current_content: kb_sections[current_section] = '\n'.join(current_content) # Формируем новое содержимое раздела "Данные из Telegram" telegram_data = [f"## Данные из Telegram\n\n### Обновлено: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n"] # Добавляем краткую информацию о каждой теме for topic, content in kb_sections.items(): # Ограничиваем содержимое до 300 символов short_content = content[:300] + "..." if len(content) > 300 else content telegram_data.append(f"### {topic}\n{short_content}\n") new_telegram_section = '\n'.join(telegram_data) # Обновляем файл памяти if telegram_section_match: # Если раздел существует, обновляем его updated_memory = re.sub( telegram_section_pattern, f"## Данные из Telegram\n{new_telegram_section}", memory_content, flags=re.DOTALL ) else: # Если раздела нет, добавляем его в конец файла updated_memory = memory_content.rstrip() + "\n\n" + new_telegram_section # Записываем обновленную память with open(MEMORY_FILE, 'w', encoding='utf-8') as f: f.write(updated_memory) logger.info(f"Файл памяти {MEMORY_FILE} успешно обновлен") return True except Exception as e: logger.error(f"Ошибка при обновлении файла памяти: {e}") return False def main(): """Основная функция для запуска обновления памяти""" try: # Создаем файл ежедневной памяти daily_result = create_daily_memory_file() # Обновляем основной файл памяти memory_result = update_memory() if daily_result and memory_result: print("Память OpenClaw успешно обновлена.") elif not daily_result and memory_result: print("Основная память обновлена, но возникла ошибка при создании ежедневной памяти.") elif daily_result and not memory_result: print("Ежедневная память создана, но возникла ошибка при обновлении основной памяти.") else: print("Возникли ошибки при обновлении памяти OpenClaw.") return 1 return 0 except Exception as e: logger.error(f"Критическая ошибка: {e}") return 1 if __name__ == "__main__": sys.exit(main())