Advertisement
egor230

Голосовой_ввод_текста_яндекс_в_linux.py

Oct 26th, 2024 (edited)
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 12.59 KB | Source Code | 0 0
  1. from libs_voice import *
  2. import tkinter as tk
  3. from tkinter import Frame, Label
  4. from pynput import keyboard
  5. from pynput.keyboard import Controller as Contr1, Key
  6. driver=0
  7. previous_message = None
  8. def on_press(key):  # обработчик клави.  # print(key )
  9.   key = str(key).replace(" ", "")
  10.   if key == "Key.shift_r":    #
  11.     k.set_flag(True)
  12.     return True
  13.   if key == "Key.space" or key =="Key.right" or key =="Key.left"\
  14.   or key =="Key.down" or key =="Key.up":
  15.     k.set_flag(False)
  16.     return True
  17.   if key == "Key.alt":
  18.     driver=k.get_driver()
  19.     k.update_dict()
  20.     return True
  21.   else:
  22.     return True
  23.  
  24. def on_release(key):
  25.   pass
  26.   return True
  27.  
  28. def a():
  29.   listener = keyboard.Listener(on_press=on_press, on_release=on_release)
  30.   listener.start()
  31.  
  32. # driver.set_window_position(1, 505)
  33. # Размер окна: Ширина = 693, Высота = 407  # Координаты окна: X = 662, Y = 292
  34. excluded_phrases = [
  35.   "С чего начнём?Нарисовать картинку",
  36.   "Для звонков телефон как-то удобнее, давайте попробую там.",
  37.   "Яндекс — с АлисойБыстрый поиск и Алиса всегда рядомПоиск текстом, картинкой или голосомУмная",
  38.   "Три заветных слова: мобильное приложение Яндекса. Там такое наверняка можно сделать."
  39. ]  # input()      # Получение текущего адреса страницы
  40.  
  41. option = get_option()  # Включить настройки.# option.add_argument("--headless")  # Включение headless-режима
  42. driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=option)
  43.  
  44. driver.set_window_size(553, 357)  # optiol
  45. driver.get("https://alice.yandex.ru/chat/01938823-14ea-4000-bd7a-3cca57830d6a/")  # открыть сайт
  46.  
  47. driver.implicitly_wait(5)  # Даём странице время загрузиться
  48.  
  49. # Находим <span> по тексту "Продвинутый режим"
  50. span = WebDriverWait(driver, 10).until(
  51.   EC.presence_of_element_located((By.XPATH, '//span[text()="Продвинутый режим"]')))
  52. button = span.find_element(By.XPATH, "..")
  53. button.click()# Выполняем клик
  54. base_mode_button = WebDriverWait(driver, 10).until(
  55.     EC.element_to_be_clickable((By.XPATH, '//button[.//h5[text()="Базовый режим"]]'))
  56. )
  57. # Кликаем на кнопку
  58. base_mode_button.click()# Находим первый элемент <li> в списке чатов
  59.  
  60. # Находим кнопку с title="Развернуть"
  61. expand_button = WebDriverWait(driver, 10).until(
  62.   EC.element_to_be_clickable((By.XPATH, '//button[@title="Развернуть"]')))# Кликаем на кнопку
  63. expand_button.click()
  64. # Ждём, пока список чатов загрузится
  65. chats = WebDriverWait(driver, 10).until(   EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".chat-list-group__list li.chat-list-item"))
  66. )
  67. chats[0].find_element(By.CSS_SELECTOR, "button.chat-list-item__chat").click()
  68. collapse_button = WebDriverWait(driver, 10).until(  EC.element_to_be_clickable((By.XPATH, '//button[.//span[text()="Свернуть"]]')) ) # Кликаем на кнопку
  69. collapse_button.click()
  70. # input()
  71. # html_content = driver.page_source
  72. # with open('page_source.html', 'w', encoding='utf-8') as file:
  73. #   file.write(html_content)
  74. # button.click()
  75. button = WebDriverWait(driver, 5).until(
  76.   EC.element_to_be_clickable((By.CSS_SELECTOR, 'div[aria-label="Алиса, начни слушать"]'))
  77. )
  78. button.click()
  79. # driver.execute_script("document.querySelector('.standalone__header').style.display='none';")
  80. # driver.execute_script(
  81. #   "var element = document.querySelector('.standalone__sidebar'); element.parentNode.removeChild(element);")
  82.  
  83. # JavaScript для поиска активного <svg> и группы <g>
  84. find_number = """
  85. const lottie = document.querySelector('[data-testid="oknyx-lottie-listening"]');
  86. const activeSvg = Array.from(lottie.querySelectorAll('svg')).find(svg =>
  87.    !svg.classList.contains('animation-hidden') && svg.style.display !== 'none'
  88. );
  89. if (activeSvg) {
  90.    const activeGroup = Array.from(activeSvg.querySelectorAll('g[filter]')).find(g =>
  91.        g.style.display !== 'none'
  92.    );
  93.    if (activeGroup) {
  94.        const filterAttr = activeGroup.getAttribute('filter');
  95.        const match = filterAttr.match(/#__lottie_element_(\\d+)/);
  96.        return match ? parseInt(match[1]) : null;
  97.    }
  98. }
  99. return null;
  100. """
  101.  
  102. lottie = driver.find_element(By.CSS_SELECTOR, '[data-testid="oknyx-lottie-listening"]')  # Находим контейнер
  103.  
  104. def get_last_from_alica(driver):
  105.   return [m.find_element_by_css_selector(".markdown-text span").text for m in
  106.           driver.find_elements_by_class_name("chat__message")
  107.           if "from-user" not in m.find_element_by_class_name("message-bubble_container").get_attribute("class")][-3:]
  108.  
  109. def get_last_three_messages(driver, class_name):
  110.   messages = driver.find_elements(By.CLASS_NAME, class_name)  # Найти все элементы с заданным классом
  111.   last_three_messages = [message.text.strip() for message in messages[-3:]]  # Получить текст последних трех элементов
  112.   return last_three_messages
  113. command = [sys.executable,  # Путь к текущему интерпретатору Python
  114.            "text_display.py", str(driver.find_elements(By.CLASS_NAME, 'message-bubble_container_from-user')[-1])]
  115.  
  116. def get_element_attributes(element):# Получает все атрибуты элемента и возвращает их в виде словаря."""
  117.     attributes = driver.execute_script("""
  118.        var items = {};
  119.        for (var i = 0; i < arguments[0].attributes.length; i++) {
  120.            var item = arguments[0].attributes[i];
  121.            items[item.name] = item.value;
  122.        }
  123.        return items;
  124.    """, element)
  125.     return attributes
  126.  
  127. def is_text_stable(driver, timeout=3):
  128.  # while True:    # Находим все сообщения пользователя
  129.  #  initial_text = driver.find_elements(By.CLASS_NAME, 'message-bubble_container_from-user')[-1].text        # Ждём 3 секунды перед повторной проверкой
  130.  #  time.sleep(timeout)    # Снова получаем текст и сравниваем
  131.  #  final_text = driver.find_elements(By.CLASS_NAME, 'message-bubble_container_from-user')[-1].text
  132.  #  if initial_text == final_text:
  133.  #    break
  134.  while True:
  135.   try:
  136.     placeholder_element = driver.find_element(By.CSS_SELECTOR, '.chat__streaming-placeholder.svelte-10qurrr')
  137.     if  placeholder_element:
  138.      pass
  139.   except:
  140.    break
  141.  return True
  142.  
  143. def run_app(driver):
  144.  try:
  145.   def update_label():
  146.     try:  # Получаем текст последнего элемента
  147.       name = driver.find_elements(By.CLASS_NAME, 'message-bubble_container_from-user')[-1].text
  148.       len_len = len(name) * 12 + 10# len_len=600
  149.       root.geometry(f"{len_len}x20+700+1025")  # Первые 2 определяют ширину высоту. Последние 2 x и y координаты на экране.
  150.       label.config(text=name)  # Обновляем текст метки
  151.     except Exception as e:
  152.       pass
  153.  
  154.     # Запланируем следующий вызов через 1 секунду
  155.     root.after(50, update_label)
  156.   # Создаем главное окно
  157.   root = tk.Tk()  # Создаем фрейм
  158.   frame = Frame(root)  # Создаем метку с начальным текстом
  159.   label = Label(frame, text="...", font='Times 14')
  160.   label.pack(side=tk.LEFT, padx=3, fill=tk.X, expand=False)
  161.   frame.pack(fill=tk.X)  # Упаковываем фрейм
  162.   root.overrideredirect(True)  # Настраиваем окно
  163.   root.resizable(True, True)
  164.   root.attributes("-topmost", True)
  165.   update_label()  # Запускаем обновление метки
  166.   root.mainloop()   # Запускаем приложение в новом потоке с передачей параметра driver
  167.  except:
  168.    pass
  169. app_thread = threading.Thread(target=run_app, args=(driver,))
  170. app_thread.start()
  171. def get_user_messages(driver):  # Извлекаем текст всех сообщений пользователя
  172.   user_m = [message.text.strip() for message in driver.find_elements(By.CLASS_NAME, 'message-bubble_container_from-user')]
  173.   message = user_m[-1] if user_m else ""  # Определяем последнее сообщение, если список не пустой
  174.   counts = len(user_m)
  175.   return message, counts  # Возвращаем результаты
  176. def get_latest_message(driver, message="", len_c=0):
  177.   try:
  178.     driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
  179.     filter_elem = WebDriverWait(driver, 4).until( EC.presence_of_element_located((By.CSS_SELECTOR, ".yamb-oknyx-lottie.svelte-rdfi3w"))
  180.     ).get_attribute("data-testid")
  181.     alisa_m = driver.find_elements(By.CSS_SELECTOR, '[data-testid="message-bubble-container"]')
  182.     last_alisa_m = alisa_m[-1].text  # последнее сообщение от алисы
  183.     aria_label= mic_button.get_attribute('aria-label')
  184.     counts_alisa_m = len(alisa_m)
  185.     if filter_elem == "oknyx-lottie-thinking" and 'Алиса, стоп'  in aria_label:
  186.      button.click()
  187.      while "слушать" not in mic_button.get_attribute('aria-label') and "suspended" not in WebDriverWait(driver, 4).until( EC.presence_of_element_located((By.CSS_SELECTOR, ".yamb-oknyx-lottie.svelte-rdfi3w"))
  188.      ).get_attribute("data-testid"):
  189.       time.sleep(0.3)
  190.      button.click()
  191.      #     break
  192.      message, counts = get_user_messages(driver)
  193.      return message, counts
  194.     else:
  195.      if counts > len_c  and  message != last_alisa_m:# and filter_elem == "oknyx-lottie-listening":  # counts % 2 == 0 andcounts_user > counts_alisa_m
  196.       # and filter_elem =="oknyx-lottie-listening"
  197.       is_text_stable(driver, 2)
  198.       message, counts = get_user_messages_info(driver)
  199.       print(counts)
  200.       print("user_m")
  201.       return message, counts
  202.      message, counts = get_user_messages_info(driver)
  203.      return "", counts
  204.   except Exception as ex:
  205.     user_m=[message.text.strip() for message in driver.find_elements(By.CLASS_NAME, 'message-bubble_container_from-user')]
  206.     counts = len(user_m)
  207.     return "", len_c  # Возврат по умолчанию, если ни одно условие не выполнилось
  208.     # pass       #
  209. try:
  210.    a()
  211.    url = str(driver.current_url)
  212.    previous_message=""
  213.    counts = len([message.text.strip() for message in driver.find_elements(By.CLASS_NAME, 'message-bubble_container_from-user')])
  214.    while True:
  215.     try:      # time.sleep(0.33)      # Найдите кнопку микрофона
  216.      mic_button =  WebDriverWait(driver, 4).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.yamb-oknyx')))      # Получите значение aria-label
  217.      aria_label = mic_button.get_attribute('aria-label')      # Проверяем, активен ли микрофон   # print( counts1)
  218.      if  'Алиса, стоп'  in aria_label:#        print("on")
  219.       previous_message1, counts1 = get_latest_message(driver, previous_message, counts)
  220.       if (counts1 > counts and len(previous_message1) !=0 and not any(phrase in previous_message1 for phrase in excluded_phrases)):
  221.         print("+++++++")
  222.         counts=counts1          #  break
  223.         thread = threading.Thread(target=process_text, args=(previous_message1, k,)) #  break  #     #thread.daemon
  224.         thread.start()#          # thread.join()
  225.      else:        # print("ло")
  226.       filter_elem = WebDriverWait(driver, 4).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".yamb-oknyx-lottie.svelte-rdfi3w"))
  227.                                                    ).get_attribute("data-testid")
  228.       button.click()
  229.     except Exception as ex1:
  230.      # print(ex1)
  231.      current_url = str(driver.current_url)  # Получение текущего адреса страницы
  232.      if "/search/" in current_url:  # Проверка, содержится ли в адресе строка "/alice.yandex.ru/chat/"     # Переход на нужный URL
  233.        print("22222")
  234.        driver.get(url)
  235.        time.sleep(4)
  236.        button = driver.find_element(By.CSS_SELECTOR, 'div.yamb-oknyx')  # повторно находим кнопку
  237.        button.click()
  238.        pass
  239.      pass
  240.  
  241. except Exception as ex1:
  242.   # print(ex1)
  243.   pass  # print(number)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement