Files
wiki/skills/telegram-collector/scripts/update_memory.py
2026-04-12 21:55:33 +03:00

186 lines
8.3 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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())