Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from libs_voice import *
- import tkinter as tk
- from tkinter import Frame, Label
- from pynput import keyboard
- from pynput.keyboard import Controller as Contr1, Key
- driver=0
- previous_message = None
- def on_press(key): # обработчик клави. # print(key )
- key = str(key).replace(" ", "")
- if key == "Key.shift_r": #
- k.set_flag(True)
- return True
- if key == "Key.space" or key =="Key.right" or key =="Key.left"\
- or key =="Key.down" or key =="Key.up":
- k.set_flag(False)
- return True
- if key == "Key.alt":
- driver=k.get_driver()
- k.update_dict()
- return True
- else:
- return True
- def on_release(key):
- pass
- return True
- def a():
- listener = keyboard.Listener(on_press=on_press, on_release=on_release)
- listener.start()
- # driver.set_window_position(1, 505)
- # Размер окна: Ширина = 693, Высота = 407 # Координаты окна: X = 662, Y = 292
- excluded_phrases = [
- "С чего начнём?Нарисовать картинку",
- "Для звонков телефон как-то удобнее, давайте попробую там.",
- "Яндекс — с АлисойБыстрый поиск и Алиса всегда рядомПоиск текстом, картинкой или голосомУмная",
- "Три заветных слова: мобильное приложение Яндекса. Там такое наверняка можно сделать."
- ] # input() # Получение текущего адреса страницы
- option = get_option() # Включить настройки.# option.add_argument("--headless") # Включение headless-режима
- driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=option)
- # driver.set_window_size(553, 357) # optiol
- driver.get("https://alice.yandex.ru/chat/01938823-14ea-4000-bd7a-3cca57830d6a/") # открыть сайт
- driver.implicitly_wait(5) # Даём странице время загрузиться
- # Ждём кнопку переключения режима
- mode_button = WebDriverWait(driver, 10).until(
- EC.element_to_be_clickable((By.CSS_SELECTOR, 'button.model-switcher__button'))
- )
- mode_button.click()
- base_mode_button = WebDriverWait(driver, 10).until(
- EC.element_to_be_clickable((By.XPATH, '//button[.//h5[text()="Базовый режим"]]')))# Кликаем на кнопку
- base_mode_button.click()# Находим первый элемент <li> в списке чатов
- del_all_chats(driver)
- button = WebDriverWait(driver, 5).until(
- EC.element_to_be_clickable((By.CSS_SELECTOR, 'div[aria-label="Алиса, начни слушать"]')))
- button.click()
- # html_content = driver.page_source
- # with open('page_source.html', 'w', encoding='utf-8') as file:
- # file.write(html_content)
- # collapse_button = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, '//button[.//span[text()="Свернуть"]]')) ) # Кликаем на кнопку
- # collapse_button.click()
- # driver.execute_script("document.querySelector('.standalone__header').style.display='none';")
- # driver.execute_script(
- # "var element = document.querySelector('.standalone__sidebar'); element.parentNode.removeChild(element);")
- # JavaScript для поиска активного <svg> и группы <g>
- find_number = """
- const lottie = document.querySelector('[data-testid="oknyx-lottie-listening"]');
- const activeSvg = Array.from(lottie.querySelectorAll('svg')).find(svg =>
- !svg.classList.contains('animation-hidden') && svg.style.display !== 'none'
- );
- if (activeSvg) {
- const activeGroup = Array.from(activeSvg.querySelectorAll('g[filter]')).find(g =>
- g.style.display !== 'none'
- );
- if (activeGroup) {
- const filterAttr = activeGroup.getAttribute('filter');
- const match = filterAttr.match(/#__lottie_element_(\\d+)/);
- return match ? parseInt(match[1]) : null;
- }
- }
- return null;
- """
- lottie = driver.find_element(By.CSS_SELECTOR, '[data-testid="oknyx-lottie-listening"]') # Находим контейнер
- def get_user_messages(driver): # Извлекаем текст всех сообщений пользователя
- user_m = [message.text.strip() for message in driver.find_elements(By.CLASS_NAME, 'message-bubble_container_from-user')]
- message = user_m[-1] if user_m else "" # Определяем последнее сообщение, если список не пустой
- counts = len(user_m)
- return message, counts # Возвращаем результаты
- def get_last_from_alica(driver):
- return [m.find_element_by_css_selector(".markdown-text span").text for m in
- driver.find_elements_by_class_name("chat__message")
- if "from-user" not in m.find_element_by_class_name("message-bubble_container").get_attribute("class")][-3:]
- def get_last_three_messages(driver, class_name):
- messages = driver.find_elements(By.CLASS_NAME, class_name) # Найти все элементы с заданным классом
- last_three_messages = [message.text.strip() for message in messages[-3:]] # Получить текст последних трех элементов
- return last_three_messages
- def get_element_attributes(element):# Получает все атрибуты элемента и возвращает их в виде словаря."""
- attributes = driver.execute_script("""
- var items = {};
- for (var i = 0; i < arguments[0].attributes.length; i++) {
- var item = arguments[0].attributes[i];
- items[item.name] = item.value;
- }
- return items;
- """, element)
- return attributes
- def is_text_stable(driver, timeout=3):
- # while True: # Находим все сообщения пользователя
- # initial_text = driver.find_elements(By.CLASS_NAME, 'message-bubble_container_from-user')[-1].text # Ждём 3 секунды перед повторной проверкой
- # time.sleep(timeout) # Снова получаем текст и сравниваем
- # final_text = driver.find_elements(By.CLASS_NAME, 'message-bubble_container_from-user')[-1].text
- # if initial_text == final_text:
- # break
- while True:
- try:
- placeholder_element = driver.find_element(By.CSS_SELECTOR, '.chat__streaming-placeholder.svelte-10qurrr')
- if placeholder_element:
- pass
- except:
- break
- return True
- def run_app(driver, len_c):
- try:
- def update_label():
- try: # Получаем текст последнего элеменмы тебя ждем
- nonlocal len_c # Объявляем len_c как nonlocal
- mic_button = WebDriverWait(driver, 1).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.yamb-oknyx')))
- aria_label = mic_button.get_attribute('aria-label') # Проверяем, активен ли микрофон # print( counts1)
- filter_elem = driver.find_element(By.CSS_SELECTOR, ".yamb-oknyx-lottie.svelte-rdfi3w").get_attribute("data-testid")
- message, counts = get_user_messages(driver)
- label.config(text=str(message)) # Обновляем текст метки
- len_message = len(message) * 10 # len_len=600
- if len(message)<4:
- len_message = len(message) * 10+12 # len_len=600
- root.geometry(f"{len_message}x20+600+1025") # Первые 2 определяют ширину высоту. Последние 2 x и y координаты на экране.
- if "listening" or "thinking" in filter_elem :#'стоп' in aria_label:#"thinking" in filter_elem :#or #and counts > len_c:or "thinking"listening
- # print(aria_label)
- root.deiconify() # показать панель.
- len_c=counts
- else:
- # print(aria_label)
- root.withdraw() #
- time.sleep(5)
- root.deiconify() # показать панель.
- except Exception as e:
- pass
- # Запланируем следующий вызов через 1 секунду
- root.after(1, update_label)
- # Создаем главное окно
- root = tk.Tk() # Создаем фрейм
- frame = Frame(root) # Создаем метку с начальным текстом
- label = tk.Label(frame, text="...", font='Times 14', anchor="center")
- label.pack(padx=3, fill=tk.X, expand=True)
- frame.pack(fill=tk.X)
- root.overrideredirect(True) # Настраиваем окно
- root.resizable(True, True)
- root.attributes("-topmost", True)
- update_label() # Запускаем обновление метки
- root.mainloop() # Запускаем приложение в новом потоке с передачей параметра driver
- except:
- pass
- def get_latest_message(driver, message="", len_c=0):
- try:
- driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
- filter_elem = WebDriverWait(driver, 4).until( EC.presence_of_element_located((By.CSS_SELECTOR, ".yamb-oknyx-lottie.svelte-rdfi3w"))
- ).get_attribute("data-testid")
- alisa_m = driver.find_elements(By.CSS_SELECTOR, '[data-testid="message-bubble-container"]')
- last_alisa_m = alisa_m[-1].text # последнее сообщение от алисы
- aria_label= mic_button.get_attribute('aria-label')
- counts_alisa_m = len(alisa_m)
- if filter_elem == "oknyx-lottie-thinking" and 'Алиса, стоп' in aria_label:
- # button.click()
- # 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"))
- # ).get_attribute("data-testid"):
- # time.sleep(0.3)
- # button.click()
- # break
- message, counts = get_user_messages(driver)
- return message, counts
- else:
- if counts > len_c and message != last_alisa_m:# and filter_elem == "oknyx-lottie-listening": # counts % 2 == 0 andcounts_user > counts_alisa_m
- # and filter_elem =="oknyx-lottie-listening"
- is_text_stable(driver, 2)
- message, counts = get_user_messages_info(driver)
- print("user_m")
- return message, counts
- message, counts = get_user_messages_info(driver)
- return "", counts
- except Exception as ex:
- user_m=[message.text.strip() for message in driver.find_elements(By.CLASS_NAME, 'message-bubble_container_from-user')]
- counts = len(user_m)
- return "", len_c # Возврат по умолчанию, если ни одно условие не выполнилось
- # pass #
- try:
- a()
- counts = 0 #len([message.text.strip() for message in driver.find_elements(By.CLASS_NAME, 'message-bubble_container_from-user')])
- previous_message=""
- app_thread = threading.Thread(target=run_app, args=(driver,counts,))
- app_thread.start()
- button = driver.find_element(By.CSS_SELECTOR, 'div.yamb-oknyx') # повторно находим кнопку
- button.click()
- url = str(driver.current_url)
- while True:
- try: # time.sleep(0.33) # Найдите кнопку микрофона
- mic_button = WebDriverWait(driver, 4).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.yamb-oknyx'))) # Получите значение aria-label
- aria_label = mic_button.get_attribute('aria-label') # Проверяем, активен ли микрофон # print( counts1)
- if 'Алиса, стоп' in aria_label:# print("on")
- previous_message1, counts1 = get_latest_message(driver, previous_message, counts)
- if (counts1 > counts and len(previous_message1) !=0 and not any(phrase in previous_message1 for phrase in excluded_phrases)):
- print("+++++++")
- print(counts1) # print(counts)
- counts=counts1 # break
- thread = threading.Thread(target=process_text, args=(previous_message1, k,)) # break # #thread.daemon
- thread.start()# # thread.join()
- else: # print("ло")
- filter_elem = WebDriverWait(driver, 4).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".yamb-oknyx-lottie.svelte-rdfi3w"))).get_attribute("data-testid")
- button.click()
- except Exception as ex1:
- # print(ex1)
- current_url = str(driver.current_url) # Получение текущего адреса страницы
- if "/search/" in current_url: # Проверка, содержится ли в адресе строка "/alice.yandex.ru/chat/" # Переход на нужный URL
- print("22222")
- driver.get(url)
- time.sleep(4)
- button.click()
- pass
- pass
- except Exception as ex1:
- # print(ex1)
- pass # print(number)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement