Advertisement
egor230

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

Oct 26th, 2024 (edited)
243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 12.63 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. driver.implicitly_wait(5)  # Даём странице время загрузиться
  47. # Ждём кнопку переключения режима
  48. mode_button = WebDriverWait(driver, 10).until(
  49.  EC.element_to_be_clickable((By.CSS_SELECTOR, 'button.model-switcher__button'))
  50. )
  51. mode_button.click()
  52. base_mode_button = WebDriverWait(driver, 10).until(
  53.     EC.element_to_be_clickable((By.XPATH, '//button[.//h5[text()="Базовый режим"]]')))# Кликаем на кнопку
  54. base_mode_button.click()# Находим первый элемент <li> в списке чатов
  55.  
  56. del_all_chats(driver)
  57. button = WebDriverWait(driver, 5).until(
  58.   EC.element_to_be_clickable((By.CSS_SELECTOR, 'div[aria-label="Алиса, начни слушать"]')))
  59. button.click()
  60.  
  61. # html_content = driver.page_source
  62. # with open('page_source.html', 'w', encoding='utf-8') as file:
  63. #   file.write(html_content)
  64.  
  65. # collapse_button = WebDriverWait(driver, 10).until(  EC.element_to_be_clickable((By.XPATH, '//button[.//span[text()="Свернуть"]]')) ) # Кликаем на кнопку
  66. # collapse_button.click()
  67. # driver.execute_script("document.querySelector('.standalone__header').style.display='none';")
  68. # driver.execute_script(
  69. #   "var element = document.querySelector('.standalone__sidebar'); element.parentNode.removeChild(element);")
  70.  
  71. # JavaScript для поиска активного <svg> и группы <g>
  72. find_number = """
  73. const lottie = document.querySelector('[data-testid="oknyx-lottie-listening"]');
  74. const activeSvg = Array.from(lottie.querySelectorAll('svg')).find(svg =>
  75.    !svg.classList.contains('animation-hidden') && svg.style.display !== 'none'
  76. );
  77. if (activeSvg) {
  78.    const activeGroup = Array.from(activeSvg.querySelectorAll('g[filter]')).find(g =>
  79.        g.style.display !== 'none'
  80.    );
  81.    if (activeGroup) {
  82.        const filterAttr = activeGroup.getAttribute('filter');
  83.        const match = filterAttr.match(/#__lottie_element_(\\d+)/);
  84.        return match ? parseInt(match[1]) : null;
  85.    }
  86. }
  87. return null;
  88. """
  89.  
  90. lottie = driver.find_element(By.CSS_SELECTOR, '[data-testid="oknyx-lottie-listening"]')  # Находим контейнер
  91.  
  92. def get_user_messages(driver):  # Извлекаем текст всех сообщений пользователя
  93.   user_m = [message.text.strip() for message in driver.find_elements(By.CLASS_NAME, 'message-bubble_container_from-user')]
  94.   message = user_m[-1] if user_m else ""  # Определяем последнее сообщение, если список не пустой
  95.   counts = len(user_m)
  96.   return message, counts  # Возвращаем результаты
  97. def get_last_from_alica(driver):
  98.   return [m.find_element_by_css_selector(".markdown-text span").text for m in
  99.           driver.find_elements_by_class_name("chat__message")
  100.           if "from-user" not in m.find_element_by_class_name("message-bubble_container").get_attribute("class")][-3:]
  101.  
  102. def get_last_three_messages(driver, class_name):
  103.   messages = driver.find_elements(By.CLASS_NAME, class_name)  # Найти все элементы с заданным классом
  104.   last_three_messages = [message.text.strip() for message in messages[-3:]]  # Получить текст последних трех элементов
  105.   return last_three_messages
  106. def get_element_attributes(element):# Получает все атрибуты элемента и возвращает их в виде словаря."""
  107.     attributes = driver.execute_script("""
  108.        var items = {};
  109.        for (var i = 0; i < arguments[0].attributes.length; i++) {
  110.            var item = arguments[0].attributes[i];
  111.            items[item.name] = item.value;
  112.        }
  113.        return items;
  114.    """, element)
  115.     return attributes
  116.  
  117. def is_text_stable(driver, timeout=3):
  118.  # while True:    # Находим все сообщения пользователя
  119.  #  initial_text = driver.find_elements(By.CLASS_NAME, 'message-bubble_container_from-user')[-1].text        # Ждём 3 секунды перед повторной проверкой
  120.  #  time.sleep(timeout)    # Снова получаем текст и сравниваем
  121.  #  final_text = driver.find_elements(By.CLASS_NAME, 'message-bubble_container_from-user')[-1].text
  122.  #  if initial_text == final_text:
  123.  #    break
  124.  while True:
  125.   try:
  126.     placeholder_element = driver.find_element(By.CSS_SELECTOR, '.chat__streaming-placeholder.svelte-10qurrr')
  127.     if  placeholder_element:
  128.      pass
  129.   except:
  130.    break
  131.  return True
  132. def run_app(driver, len_c):
  133.  try:
  134.   def update_label():
  135.     try:  # Получаем текст последнего элеменмы тебя ждем
  136.      nonlocal len_c  # Объявляем len_c как nonlocal
  137.      mic_button =  WebDriverWait(driver, 1).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.yamb-oknyx')))
  138.      aria_label = mic_button.get_attribute('aria-label')      # Проверяем, активен ли микрофон   # print( counts1)
  139.      filter_elem = driver.find_element(By.CSS_SELECTOR, ".yamb-oknyx-lottie.svelte-rdfi3w").get_attribute("data-testid")
  140.      message, counts = get_user_messages(driver)
  141.      label.config(text=str(message))  # Обновляем текст метки
  142.      len_message = len(message) * 10 # len_len=600
  143.      if len(message)<4:
  144.       len_message = len(message) * 10+12 # len_len=600
  145.      root.geometry(f"{len_message}x20+600+1025")  # Первые 2 определяют ширину высоту. Последние 2 x и y координаты на экране.
  146.      if "listening" or "thinking" in filter_elem :#'стоп'  in aria_label:#"thinking"  in filter_elem :#or #and counts > len_c:or "thinking"listening
  147.       # print(aria_label)
  148.       root.deiconify() # показать панель.
  149.       len_c=counts
  150.      else:
  151.       # print(aria_label)
  152.       root.withdraw()  #
  153.       time.sleep(5)
  154.       root.deiconify() # показать панель.
  155.     except Exception as e:
  156.       pass
  157.  
  158.     # Запланируем следующий вызов через 1 секунду
  159.     root.after(1, update_label)
  160.   # Создаем главное окно
  161.   root = tk.Tk()  # Создаем фрейм
  162.   frame = Frame(root)  # Создаем метку с начальным текстом
  163.   label = tk.Label(frame, text="...", font='Times 14', anchor="center")
  164.   label.pack(padx=3, fill=tk.X, expand=True)
  165.   frame.pack(fill=tk.X)
  166.  
  167.   root.overrideredirect(True)  # Настраиваем окно
  168.   root.resizable(True, True)
  169.   root.attributes("-topmost", True)
  170.  
  171.   update_label()  # Запускаем обновление метки
  172.   root.mainloop()   # Запускаем приложение в новом потоке с передачей параметра driver
  173.  except:
  174.    pass
  175. def get_latest_message(driver, message="", len_c=0):
  176.   try:
  177.     driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
  178.     filter_elem = WebDriverWait(driver, 4).until( EC.presence_of_element_located((By.CSS_SELECTOR, ".yamb-oknyx-lottie.svelte-rdfi3w"))
  179.     ).get_attribute("data-testid")
  180.     alisa_m = driver.find_elements(By.CSS_SELECTOR, '[data-testid="message-bubble-container"]')
  181.     last_alisa_m = alisa_m[-1].text  # последнее сообщение от алисы
  182.     aria_label= mic_button.get_attribute('aria-label')
  183.     counts_alisa_m = len(alisa_m)
  184.     if filter_elem == "oknyx-lottie-thinking" and 'Алиса, стоп'  in aria_label:
  185.      # button.click()
  186.      # 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"))
  187.      # ).get_attribute("data-testid"):
  188.      #  time.sleep(0.3)
  189.      # button.click()
  190.      #     break
  191.      message, counts = get_user_messages(driver)
  192.      return message, counts
  193.     else:
  194.      if counts > len_c  and  message != last_alisa_m:# and filter_elem == "oknyx-lottie-listening":  # counts % 2 == 0 andcounts_user > counts_alisa_m
  195.       # and filter_elem =="oknyx-lottie-listening"
  196.       is_text_stable(driver, 2)
  197.       message, counts = get_user_messages_info(driver)
  198.       print("user_m")
  199.       return message, counts
  200.      message, counts = get_user_messages_info(driver)
  201.      return "", counts
  202.   except Exception as ex:
  203.     user_m=[message.text.strip() for message in driver.find_elements(By.CLASS_NAME, 'message-bubble_container_from-user')]
  204.     counts = len(user_m)
  205.     return "", len_c  # Возврат по умолчанию, если ни одно условие не выполнилось
  206.     # pass       #
  207. try:
  208.    a()
  209.    counts = 0 #len([message.text.strip() for message in driver.find_elements(By.CLASS_NAME, 'message-bubble_container_from-user')])
  210.    previous_message=""
  211.    app_thread = threading.Thread(target=run_app, args=(driver,counts,))
  212.    app_thread.start()
  213.    button = driver.find_element(By.CSS_SELECTOR, 'div.yamb-oknyx')  # повторно находим кнопку
  214.    button.click()
  215.    url = str(driver.current_url)
  216.    while True:
  217.     try:      # time.sleep(0.33)      # Найдите кнопку микрофона
  218.      mic_button =  WebDriverWait(driver, 4).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.yamb-oknyx')))      # Получите значение aria-label
  219.      aria_label = mic_button.get_attribute('aria-label')      # Проверяем, активен ли микрофон   # print( counts1)
  220.      if  'Алиса, стоп'  in aria_label:#        print("on")
  221.       previous_message1, counts1 = get_latest_message(driver, previous_message, counts)
  222.       if (counts1 > counts and len(previous_message1) !=0 and not any(phrase in previous_message1 for phrase in excluded_phrases)):
  223.         print("+++++++")
  224.         print(counts1)     # print(counts)
  225.         counts=counts1          #  break
  226.         thread = threading.Thread(target=process_text, args=(previous_message1, k,)) #  break  #     #thread.daemon
  227.         thread.start()#          # thread.join()
  228.      else:        # print("ло")
  229.       filter_elem = WebDriverWait(driver, 4).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".yamb-oknyx-lottie.svelte-rdfi3w"))).get_attribute("data-testid")
  230.       button.click()
  231.     except Exception as ex1:
  232.      # print(ex1)
  233.      current_url = str(driver.current_url)  # Получение текущего адреса страницы
  234.      if "/search/" in current_url:  # Проверка, содержится ли в адресе строка "/alice.yandex.ru/chat/"     # Переход на нужный URL
  235.        print("22222")
  236.        driver.get(url)
  237.        time.sleep(4)
  238.        button.click()
  239.        pass
  240.      pass
  241.  
  242. except Exception as ex1:
  243.   # print(ex1)
  244.   pass  # print(number)
  245.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement