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()