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) # Даём странице время загрузиться
- # Находим <span> по тексту "Продвинутый режим"
- span = WebDriverWait(driver, 10).until(
- EC.presence_of_element_located((By.XPATH, '//span[text()="Продвинутый режим"]')))
- button = span.find_element(By.XPATH, "..")
- button.click()# Выполняем клик
- base_mode_button = WebDriverWait(driver, 10).until(
- EC.element_to_be_clickable((By.XPATH, '//button[.//h5[text()="Базовый режим"]]'))
- )
- # Кликаем на кнопку
- base_mode_button.click()# Находим первый элемент <li> в списке чатов
- # Находим кнопку с title="Развернуть"
- expand_button = WebDriverWait(driver, 10).until(
- EC.element_to_be_clickable((By.XPATH, '//button[@title="Развернуть"]')))# Кликаем на кнопку
- expand_button.click()
- # Ждём, пока список чатов загрузится
- chats = WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".chat-list-group__list li.chat-list-item"))
- )
- chats[0].find_element(By.CSS_SELECTOR, "button.chat-list-item__chat").click()
- collapse_button = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, '//button[.//span[text()="Свернуть"]]')) ) # Кликаем на кнопку
- collapse_button.click()
- # input()
- # html_content = driver.page_source
- # with open('page_source.html', 'w', encoding='utf-8') as file:
- # file.write(html_content)
- # button.click()
- button = WebDriverWait(driver, 5).until(
- EC.element_to_be_clickable((By.CSS_SELECTOR, 'div[aria-label="Алиса, начни слушать"]'))
- )
- 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_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
- command = [sys.executable, # Путь к текущему интерпретатору Python
- "text_display.py", str(driver.find_elements(By.CLASS_NAME, 'message-bubble_container_from-user')[-1])]
- 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):
- try:
- def update_label():
- try: # Получаем текст последнего элемента
- name = driver.find_elements(By.CLASS_NAME, 'message-bubble_container_from-user')[-1].text
- len_len = len(name) * 12 + 10# len_len=600
- root.geometry(f"{len_len}x20+700+1025") # Первые 2 определяют ширину высоту. Последние 2 x и y координаты на экране.
- label.config(text=name) # Обновляем текст метки
- except Exception as e:
- pass
- # Запланируем следующий вызов через 1 секунду
- root.after(50, update_label)
- # Создаем главное окно
- root = tk.Tk() # Создаем фрейм
- frame = Frame(root) # Создаем метку с начальным текстом
- label = Label(frame, text="...", font='Times 14')
- label.pack(side=tk.LEFT, padx=3, fill=tk.X, expand=False)
- frame.pack(fill=tk.X) # Упаковываем фрейм
- root.overrideredirect(True) # Настраиваем окно
- root.resizable(True, True)
- root.attributes("-topmost", True)
- update_label() # Запускаем обновление метки
- root.mainloop() # Запускаем приложение в новом потоке с передачей параметра driver
- except:
- pass
- app_thread = threading.Thread(target=run_app, args=(driver,))
- app_thread.start()
- 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_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(counts)
- 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()
- url = str(driver.current_url)
- previous_message=""
- counts = len([message.text.strip() for message in driver.find_elements(By.CLASS_NAME, 'message-bubble_container_from-user')])
- 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("+++++++")
- 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 = driver.find_element(By.CSS_SELECTOR, 'div.yamb-oknyx') # повторно находим кнопку
- button.click()
- pass
- pass
- except Exception as ex1:
- # print(ex1)
- pass # print(number)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement