114 lines
4.6 KiB
Python
114 lines
4.6 KiB
Python
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()
|