import os import logging import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from datetime import datetime import calendar from dotenv import load_dotenv load_dotenv() # Inicializar o driver do Selenium com o ChromeDriverManager print("Verificando a versão do ChromeDriver...", end="\n") chromedriver_path = ChromeDriverManager().install() print("ChromeDriver instalado com sucesso em " + chromedriver_path + "!", end="\n") options = Options() options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.add_argument('--disable-gpu') options.add_argument('--disable-setuid-sandbox') options.add_argument('--remote-debugging-port=9222') # Adicione esta linha para corrigir o erro try: driver = webdriver.Chrome(service=Service(chromedriver_path), options=options) # Habilitar a captura de requisições de rede driver.execute_cdp_cmd('Network.enable', {}) except Exception as e: print(f"Erro ao iniciar o ChromeDriver: {e}") raise # Função para encontrar um elemento usando o XPath def find(xpath): return WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.XPATH, xpath))) # Função para fazer login no Marriott Vacation Club def login_marriottvc(): driver.get('https://login.marriottvacationclub.com/login') find("//input[@id='username']").send_keys(os.getenv('MARRIOTT_USERNAME')) find("//input[@id='password']").send_keys(os.getenv('MARRIOTT_PASSWORD')) find("//button[@type='submit']").click() print("Login realizado com sucesso!") # Função para abrir a página de reserva de pontos def open_bookvacation_marriottvc(): find("//a[contains(text(), 'USE POINTS')]").click() find("//li[contains(text(), 'Book Using Club Points')]").click() print("Página de reserva de pontos aberta com sucesso!") # Função para inserir o destino def input_destination_marriottvc(dest): destination_box = find("//input[contains(@placeholder, 'Destination')]") destination_box.send_keys(dest) find("//ul[@class='hotel']//li[1]").click() print(f"Destino '{dest}' inserido com sucesso!") # Função para inserir o número de hóspedes def input_guests_marriottvc(num_guests): find("//input[@id='numGuests']").clear() find("//input[@id='numGuests']").send_keys(num_guests) print(f"Número de hóspedes '{num_guests}' inserido com sucesso!") # Função para selecionar o mês desejado def input_month_marriottvc(month): find("//select[@id='searchbymonth']").click() print(calendar.month_name[month].lower()) find(f"//option[@id='id_{calendar.month_name[month].lower()}2024']").click() print(f"Mês '{calendar.month_name[month]}' selecionado com sucesso!") # Função para inserir o número de noites def input_nights_marriottvc(num_nights): find("//input[@id='numNights']").clear() find("//input[@id='numNights']").send_keys(num_nights) print(f"Número de noites '{num_nights}' inserido com sucesso!") # Função para clicar no botão de pesquisa def click_search_marriottvc(): find("//span[@class='search-carat']").click() print("Botão de pesquisa clicado com sucesso!") # Função para verificar a disponibilidade def check_availability_marriottvc(check_in_day, num_nights, month): input_month_marriottvc(month) input_nights_marriottvc(num_nights) click_search_marriottvc() try: find( '//*[@id="rtWebPanel"]/div/main/div[3]/form/div/div/div[2]/div[3]/div[2]/div[1]/button' ).click() except TimeoutException as e: logging.error(f"Erro ao clicar no botão de pesquisa: {e}") while True: try: day = WebDriverWait(driver, 0.5).until( EC.presence_of_element_located(( By.XPATH, f"//button[contains(@aria-label, ' {check_in_day} ') and @class='day enabled']" ))) print( f"Dia {day.text} até {int(day.text) + int(num_nights)} está disponível no marriottvacationclub.com" ) return day.text, calendar.month_name[month] except Exception as e: logging.error(f"Erro ao verificar a disponibilidade: {e}") check_in_day = str(int(check_in_day) + 1) if int(check_in_day) > 31: month += 1 check_in_day = '01' input_month_marriottvc(month) input_nights_marriottvc(num_nights) click_search_marriottvc() try: find( '//*[@id="rtWebPanel"]/div/main/div[3]/form/div/div/div[2]/div[3]/div[2]/div[1]/button' ).click() except TimeoutException as e: logging.error(f"Erro ao clicar no botão de pesquisa: {e}") # Exemplo de uso try: login_marriottvc() open_bookvacation_marriottvc() input_destination_marriottvc('Marriott\'s Mountain Valley Lodge') input_guests_marriottvc('2') available_day, available_month = check_availability_marriottvc( 27, 4, 7) # Verifica a disponibilidade para 27 de Julho com 4 noites print(f"Dia disponível: {available_day} de {available_month}") finally: print("Driver encerrado com sucesso!") driver.quit()