<div data-testid="editor-root"><div class="article-editor-desktop--editor-header__editorHeader-2q article-editor-desktop--editor-header__hasWideScroll-1s"><div class="article-editor-desktop--editor-header__container-3n"><div class="article-editor-desktop--editor-header__colLeft-2Q"><button class="article-editor-desktop--editor-header__back-LO"><svg viewBox="0 0 24 24"><use xlink:href="#arrow_left_85da--react"></use></svg></button></div><div class="article-editor-desktop--editor-header__colMid-2r"><div class="article-editor-desktop--editor-header-channel__editorHeaderChannel-kH"><div class="article-editor-desktop--editor-header-channel__logo-17" style="background-image: url(&quot;https://avatars.idzn.ru/get-zen-logos/271828/pub_686e295c4763b6759f36a8a1_686e2b34d6a5c639e441fa50/min_xh&quot;); background-color: rgb(248, 248, 248);"></div><a class="article-editor-desktop--editor-header-channel__name-2i" href="/profile/editor/ledinform/publications?state=draft">💡✨ LED Inform: Свет в деталях 🌟🔆</a></div></div><div class="article-editor-desktop--editor-header__colRight-3Z"><div class="article-editor-desktop--editor-header__publishButton-gc"><div class="article-editor-desktop--editor-header__publishBtnContainer-3D"><span class="Dropdown"><button class=" article-editor-desktop--base-button__rootElement-75  article-editor-desktop--base-button__noInlinePaddings-Aw  article-editor-desktop--base-button__buttonAspectRatio1-3Y  article-editor-desktop--base-button__m-3E  article-editor-desktop--base-button__ghost-1z" data-testid="editor-publication-actions-dropdown" type="button" tabindex="0"><span class=" article-editor-desktop--base-button__leftIconContainer-3W  article-editor-desktop--base-button__onlyIconContainer-Ck"><svg viewBox="0 0 24 24" width="24" height="24"><use xlink:href="#dots_horizontal_9139--react"></use></svg></span></button></span><button class="article-editor-desktop--editor-header__editBtn-44 article-editor-desktop--base-button__rootElement-75  article-editor-desktop--base-button__s-36  article-editor-desktop--base-button__accentPrimary-B4" data-testid="article-publish-btn" type="button" tabindex="0"><span class=" article-editor-desktop--base-button__childrenContent-1L">Опубликовать</span></button></div><div class="article-editor-desktop--editor-header__rightColBottom-2I"><span class="article-editor-desktop--editor-header__status-2H" role="button"><div>Сохранено меньше минуты назад</div></span></div></div></div></div></div><div class="article-editor-desktop--editor__editor-36"><div class="article-editor-desktop--editor__side-1k"></div><div class="article-editor-desktop--editor__center-2w"><div class="article-editor-desktop--editor__content-c8"><div class="article-editor-desktop--editable-input__editableInput-oN article-editor-desktop--editor__titleInput-2D"><div class="DraftEditor-root"><div class="public-DraftEditorPlaceholder-root"><div class="public-DraftEditorPlaceholder-inner" id="placeholder-2jgi1" style="white-space: pre-wrap;">Заголовок</div></div><div class="DraftEditor-editorContainer"><div aria-describedby="placeholder-2jgi1" class="notranslate public-DraftEditor-content" contenteditable="true" role="textbox" spellcheck="false" style="outline: none; user-select: text; white-space: pre-wrap; overflow-wrap: break-word;"><div data-contents="true"><h1 class="" data-block="true" data-editor="2jgi1" data-offset-key="8h81i-0-0"><div data-offset-key="8h81i-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="8h81i-0-0"><br data-text="true"></span></div></h1></div></div></div></div></div><div class="article-editor-desktop--zen-draft-editor__zenEditor-13 article-editor-desktop--editor__zenDraftEditor-3x"><div class="article-editor-desktop--zen-draft-editor__placeholder-3z"><div class="DraftEditor-root"><div class="public-DraftEditorPlaceholder-root"><div class="public-DraftEditorPlaceholder-inner" id="placeholder-ZenDraftEditor" style="white-space: pre-wrap;">Текст</div></div><div class="DraftEditor-editorContainer"><div aria-describedby="placeholder-ZenDraftEditor" class="notranslate public-DraftEditor-content" contenteditable="true" role="textbox" spellcheck="true" style="outline: none; user-select: text; white-space: pre-wrap; overflow-wrap: break-word;"><div data-contents="true"><div class="zen-editor-block zen-editor-block-paragraph" data-block="true" data-editor="ZenDraftEditor" data-offset-key="2e74i-0-0"><div data-offset-key="2e74i-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="2e74i-0-0"><br data-text="true"></span></div></div></div></div></div></div></div><div class="article-editor-desktop--side-toolbar__sideToolbar-2f" style="display: block; transition: none; top: -3px;"><button class="article-editor-desktop--side-button__sideButton-1z" data-tip="Вставить изображение" currentitem="false"><svg viewBox="0 0 24 24" class="article-editor-desktop--side-button__sideIcon-Lg"><use xlink:href="#add_gallery_e477--react"></use></svg></button></div><div class="article-editor-desktop--editor-toolbar__editorToolbar-15"><div class="article-editor-desktop--editor-toolbar__blockTools-d0"><div class="article-editor-desktop--editor-toolbar-button__editorToolbarButton-XK" aria-label="Heading 2" title=""><svg viewBox="0 0 28 28"><use xlink:href="#h2_a296--react"></use></svg></div><div class="article-editor-desktop--editor-toolbar-button__editorToolbarButton-XK" aria-label="Heading 3" title=""><svg viewBox="0 0 28 28"><use xlink:href="#h3_ed37--react"></use></svg></div><div class="article-editor-desktop--editor-toolbar-button__editorToolbarButton-XK" aria-label="Blockquote" title=""><svg viewBox="0 0 28 28"><use xlink:href="#blockquote_56c0--react"></use></svg></div><div class="article-editor-desktop--editor-toolbar-button__editorToolbarButton-XK" aria-label="ul" title=""><svg viewBox="0 0 28 28"><use xlink:href="#ul_78dc--react"></use></svg></div><div class="article-editor-desktop--editor-toolbar-button__editorToolbarButton-XK" aria-label="ol" title=""><svg viewBox="0 0 28 28"><use xlink:href="#ol_7c49--react"></use></svg></div></div><div class="article-editor-desktop--editor-toolbar__inlineTools-27"><div class="article-editor-desktop--editor-toolbar-button__editorToolbarButton-XK" aria-label="Bold" title=""><svg viewBox="0 0 28 28"><use xlink:href="#bold_e10e--react"></use></svg></div><div class="article-editor-desktop--editor-toolbar-button__editorToolbarButton-XK" aria-label="Italic" title=""><svg viewBox="0 0 28 28"><use xlink:href="#italic_38c8--react"></use></svg></div><div class="article-editor-desktop--editor-toolbar-button__editorToolbarButton-XK" aria-label="Strike" title=""><svg viewBox="0 0 28 28"><use xlink:href="#strikethrough_8ddc--react"></use></svg></div></div><div class="article-editor-desktop--editor-toolbar__linkTools-9h"><svg viewBox="0 0 28 28"><use xlink:href="#link_d1d7--react"></use></svg></div></div></div></div></div><div class="article-editor-desktop--editor__side-1k"></div></div><div class="article-editor-desktop--editor-help-buttons__editorHelpButtons-4_"><div class="article-editor-desktop--help-button__helpButton-3E article-editor-desktop--editor-help-buttons__button-h1"><span class="article-editor-desktop--help-button__helpText-Mt">?</span></div><div class="article-editor-desktop--help-button__helpButton-3E article-editor-desktop--editor-help-buttons__button-h1"><a class="article-editor-desktop--help-button__link-7K" href="https://dzen.ru/help/ru/troubleshooting/feedback.html" rel="dofollow" target="_blank"><svg viewBox="0 0 32 32" class="article-editor-desktop--help-button__feedbackIcon-22"><use xlink:href="#feedback_b87f--react"></use></svg></a></div></div></div> написать универсальную функцию вставки в contenteditable редактор Дзена.  from selenium import webdriver
from bs4 import BeautifulSoup
import mysql.connector
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import json
import time

# === Подключение к базе данных ===
DB_CONFIG = {
    'host': '192.168.8.100',
    'user': 'root',
    'password': 'BXiQLt3G',
    'database': 'led_topics_db',
    'port': 3307,
}

def get_article_from_db():
    try:
        conn = mysql.connector.connect(**DB_CONFIG)
        cursor = conn.cursor(dictionary=True)
        query = """
        SELECT topic, content 
        FROM led_topics
        WHERE is_archived = 0 
          AND content IS NOT NULL 
          AND content != ''
        ORDER BY RAND()
        LIMIT 1;
        """
        cursor.execute(query)
        result = cursor.fetchone()
        cursor.close()
        conn.close()
        return result
    except Exception as e:
        print(f"Ошибка при подключении к БД: {e}")
        return None


CHROMEDRIVER_PATH = r"C:\Users\Evgen\Downloads\chromedriver-win64\chromedriver.exe"

chrome_options = Options()
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--disable-software-rasterizer")
chrome_options.add_argument("--disable-extensions")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-popup-blocking")
chrome_options.add_argument("--disable-notifications")
chrome_options.add_argument("--log-level=3")  # ❌ Отключает все логи

# ⚙️ Скрытие уведомлений о deprecated функциях
chrome_options.add_experimental_option('excludeSwitches', ['enable-logging'])
chrome_options.add_experimental_option("useAutomationExtension", False)
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])

# 📂 (Опционально) Логгирование только ошибок
chrome_options.set_capability('goog:loggingPrefs', {'browser': 'SEVERE'})

service = Service(CHROMEDRIVER_PATH)
driver = webdriver.Chrome(service=service, options=chrome_options)

try:

    # Получаем статью из БД
    article = get_article_from_db()
    if not article:
        print("Не удалось загрузить статью из базы данных.")
        sys.exit(1)

    article_text = article['content']

    # Парсим HTML
    soup = BeautifulSoup(article_text, "html.parser")

    # Извлекаем первый <p> как заголовок
    first_paragraph = soup.find("p")
    title = first_paragraph.get_text(strip=True) if first_paragraph else "Без заголовка"

    # Удаляем первый <p> из содержимого
    if first_paragraph:
        first_paragraph.decompose()

    # Очищаем и форматируем оставшийся контент под стандарты Дзен
    cleaned_article = ""

    for tag in soup.find_all():
        if tag.name == "p":
            # Оставляем весь HTML внутри <p> как есть
            cleaned_article += str(tag) + "\n"
        elif tag.name == "img":
            # Оставляем изображения как есть
            cleaned_article += str(tag) + "\n"

    # Сохраняем очищенный текст
    article_text = cleaned_article.strip()   
    
    # Открываем Дзен
    driver.get("https://dzen.ru")
    time.sleep(2)

    # Удаляем старые куки
    driver.delete_all_cookies()

    # Загружаем куки из файла
    with open("cookies_dzen.json", "r", encoding="utf-8") as f:
        cookies = json.load(f)

    for cookie in cookies:
        print(f"🔄 Добавляю куку: {cookie.get('name')}")

        cookie.pop("sameSite", None)
        cookie.pop("storeId", None)
        cookie.pop("session", None)

        if not cookie["domain"].startswith("."):
            cookie["domain"] = "." + cookie["domain"]
            print(f"🛠 Исправлен домен: {cookie['domain']}")

        try:
            driver.add_cookie(cookie)
            print(f"✅ Кука {cookie['name']} успешно добавлена")
        except Exception as e:
            print(f"❌ Ошибка при добавлении куки {cookie.get('name')}: {e}")

    # Переходим в редактор
    driver.get("https://dzen.ru/profile/editor/id/669dd289f109381c8b33de06/publications")
    time.sleep(5)
    
    # Ждем, пока кнопка станет доступна
    close_btn = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[data-testid="close-button"]')))

    # Кликаем по кнопке закрытия
    close_btn.click()

    # Проверяем, загрузилась ли страница редактора
    try:
        print("⏳ Ожидание загрузки страницы редактора...")
        add_button = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "button[data-testid='add-publication-button']"))
        )
        print("✅ Успешно авторизован в редакторе Дзен")
    except TimeoutException:
        print("❌ Не удалось авторизоваться. Проверь куки.")

    # === Нажатие на кнопку добавления публикации ===
    try:
        print("🖱 Попытка кликнуть по кнопке 'Написать статью!'...")
        add_button = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.CSS_SELECTOR, "button[data-testid='add-publication-button']"))
        )
        add_button.click()
        print("✅ Кнопка 'Написать статью!' успешно нажата")
    except Exception as e:
        print(f"❌ Ошибка при клике на кнопку: {e}")
        driver.quit()
        exit()

    # === Нажатие на пункт "Написать статью" из выпадающего меню ===
    try:
        print("🖱 Попытка кликнуть по пункту 'Написать статью'...")
        write_article = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, '//span[text()="Написать статью"]'))
        )
        write_article.click()
        print("✅ Пункт 'Написать статью' успешно нажат")
    except Exception as e:
        print(f"❌ Ошибка при клике на пункт 'Написать статью': {e}")
        driver.quit()
        exit()
    
    # === Клик по кнопке "Закрыть" ===
    try:
        print("🖱 Попытка кликнуть по кнопке 'Закрыть'...")
        close_button = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, '//div[@role="button" and @aria-label="Закрыть"]'))
        )
        close_button.click()
        print("✅ Кнопка 'Закрыть' успешно нажата")
    except Exception as e:
        print(f"❌ Ошибка при клике на кнопку 'Закрыть': {e}")
     
    # === Ввод заголовка через JavaScript ===
    try:
        print("✍️ Ожидание поля заголовка...")
        title_field = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "div.public-DraftEditor-content[contenteditable='true']"))
        )

        # Устанавливаем фокус
        title_field.click()
        time.sleep(1)
         
        time.sleep(1)
        # Ввод текста через JavaScript
        driver.execute_script("arguments[0].innerHTML = arguments[1]", title_field, title)

        print("✅ Заголовок успешно заполнен через JavaScript")
    except Exception as e:
        print(f"❌ Не удалось заполнить заголовок: {e}")    
        
    # === Ввод статьи через JavaScript ===
    try:
        print("✍️ Ожидание поля статьи...")
        title_field = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((
                By.CSS_SELECTOR,
                "div[aria-describedby='placeholder-ZenDraftEditor'][contenteditable='true']"
            ))
        )

        # Устанавливаем фокус
        title_field.click()
        time.sleep(1)
         
        time.sleep(1)

        # Ввод текста через JavaScript
        driver.execute_script("arguments[0].innerHTML = arguments[1]", title_field, str(soup))

        print("✅ Статьи успешно заполнен через JavaScript")
    except Exception as e:
        print(f"❌ Не удалось заполнить статью: {e}")
        
finally:
    # === Ожидание перед закрытием ===
    input("Нажмите Enter, чтобы закрыть браузер...")
    driver.quit()