llm-agent-backend/run-transcribe-parsing.py
2026-04-30 12:07:29 +03:00

114 lines
4.6 KiB
Python
Raw Permalink 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.

import os
import time
from datetime import datetime
from selenium import webdriver
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.by import By
# --- НАСТРОЙКИ ---
OBSIDIAN_PATH = r"D:\Work\Software_Development\Projects\ttrpg-obsidian-vault\scripts\transcrib\VK_Call_Notes.md"
CHECK_INTERVAL = 0.5 # Частота проверки текста
RECONNECT_INTERVAL = 6.0 # Частота поиска вкладки
def append_to_obsidian(text, new_line=True):
"""
Записывает текст.
new_line=True: создает новую строку с таймстампом.
new_line=False: дописывает в конец существующей строки.
"""
try:
with open(OBSIDIAN_PATH, "a", encoding="utf-8") as f:
if new_line:
timestamp = datetime.now().strftime("\n[%H:%M:%S] ")
f.write(f"{timestamp}{text}")
else:
f.write(f"{text}") # f.write(f" {text}")
print(f"Дописано: {text}")
except Exception as e:
print(f"Ошибка записи: {e}")
def find_vk_tab(driver):
"""Пытается найти и переключиться на вкладку ВК."""
try:
for handle in driver.window_handles:
driver.switch_to.window(handle)
if "vk.com" in driver.current_url or "Call" in driver.title:
return True
except:
pass
return False
def run_capture():
current_dir = os.path.dirname(os.path.abspath(__file__))
driver_path = os.path.join(current_dir, "geckodriver.exe")
options = Options()
options.add_argument("--debugger-address 127.0.0.1:9222")
service = Service(executable_path=driver_path)
try:
driver = webdriver.Firefox(service=service, options=options)
print("--- Соединение с браузером установлено ---")
except Exception as e:
print(f"Критическая ошибка: {e}")
return
last_text = ""
active_tab_found = False
try:
while True:
# 1. Если вкладка не найдена — ищем её
if not active_tab_found:
if find_vk_tab(driver):
print(f"Нашел звонок: {driver.title}. Начинаю слежку...")
active_tab_found = True
else:
print("Жду открытия вкладки со звонком ВК...")
time.sleep(RECONNECT_INTERVAL)
continue
# 2. Попытка прочитать текст
try:
element = driver.find_element(By.CLASS_NAME, "CallsSubtitles__content")
current_full_text = element.text.strip()
if current_full_text:
# Случай 1: Это продолжение текущей фразы
if last_full_text and current_full_text.startswith(last_full_text):
# Берем только то, чего еще не было
added_part = current_full_text[len(last_full_text):] #.strip()
if added_part:
append_to_obsidian(added_part, new_line=False)
last_full_text = current_full_text
# Случай 2: Это абсолютно новая фраза (предыдущая исчезла)
elif current_full_text != last_full_text:
append_to_obsidian(current_full_text, new_line=True)
last_full_text = current_full_text
else:
# В элементе пусто — сбрасываем кэш, чтобы следующая фраза шла с новой строки
last_full_text = ""
time.sleep(CHECK_INTERVAL)
except Exception:
# Если элемент потерян, сбрасываем состояние
last_full_text = ""
try:
_ = driver.current_url
except:
print("Вкладка потеряна. Ищу...")
active_tab_found = False
time.sleep(CHECK_INTERVAL)
except KeyboardInterrupt:
print("\nСкрипт остановлен.")
finally:
print("Сессия завершена.")
if __name__ == "__main__":
run_capture()