Spaces:
Runtime error
Runtime error
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() | |