import os # Import the os module import logging import time from selenium import webdriver from selenium.webdriver.chrome.service import Service 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 # Inicializar o driver do Selenium com o ChromeDriverManager print("Instalando o ChromeDriver...", end="\n") chromedriver_path = ChromeDriverManager().install() print("ChromeDriver instalado com sucesso em " + chromedriver_path + "!", end="\n") # options = webdriver.ChromeOptions() # options.add_experimental_option('w3c', False) # Desativar o protocolo W3C para usar o DevTools Protocol driver = webdriver.Chrome() # Habilitar a captura de requisições de rede driver.execute_cdp_cmd('Network.enable', {}) # Função para encontrar um elemento usando o XPath def find(xpath): return WebDriverWait(driver, 10).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() # 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() # 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() # 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) # 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( ) # 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) # Função para clicar no botão de pesquisa def click_search_marriottvc(): find("//span[@class='search-carat']").click() # 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: logging.error("Elemento não encontrado dentro do tempo limite") 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: 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: logging.error( "Elemento não encontrado dentro do tempo limite") # Exemplo de uso 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}") driver.quit()