from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from time import sleep
import logging
import os
import sys
from dotenv import load_dotenv
def main():
logging.basicConfig(
format="%(asctime)s %(levelname)-8s %(message)s",
level=logging.INFO,
datefmt="%Y-%m-%d %H:%M:%S",
)
load_dotenv()
test_ua = "Mozilla/5.0 (Windows NT 4.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36"
options = Options()
# options.add_argument("--headless") # Remove this if you want to see the browser (Headless makes the chromedriver not have a GUI)
# options.add_argument("--window-size=1920,1080")
options.add_argument(f"--user-agent={test_ua}")
options.add_argument("--no-sandbox")
options.add_argument("--disable-extensions")
driver = webdriver.Chrome(options=options)
loginRenfe(driver)
navigate_to_tickets(driver)
main_loop(driver)
sleep(5)
driver.get_screenshot_as_file("bought.png")
logging.info("TICKET BOUGHT!!")
sleep(999999999)
def loginRenfe(driver):
driver.get("https://venta.renfe.com/vol/loginParticular.do")
sleep(5)
driver.find_element(By.ID, "num_tarjeta").send_keys(os.getenv("RENFE_EMAIL"))
driver.find_element(By.ID, "pass-login").send_keys(os.getenv("RENFE_PASSWORD"))
driver.find_element(By.ID, "loginButtonId").click()
sleep(15)
def navigate_to_tickets(driver):
driver.get("https://venta.renfe.com/vol/myPassesCard.do")
sleep(5)
element = driver.find_element(By.XPATH, "//a[contains(@onclick, 'submitNew')]")
driver.execute_script("arguments[0].scrollIntoView(true);", element)
sleep(2)
driver.execute_script("arguments[0].click();", element)
sleep(5)
# todo: select radio button ida o vuelta
datepicker = driver.find_element(By.ID, "fecha1")
driver.execute_script(f"arguments[0].value = '06/01/2025';", datepicker)
element = driver.find_element(By.ID, "submitSiguiente")
driver.execute_script("arguments[0].scrollIntoView(true);", element)
sleep(2)
driver.execute_script("arguments[0].click();", element)
sleep(5)
def main_loop(driver):
select_button = None
while True:
# if this is not found, then we presume we have to login again
try:
row = driver.find_element(By.XPATH, f"//tr[td[contains(text(), '{sys.argv[1]}')]]".format())
except Exception:
loginRenfe(driver)
navigate_to_tickets(driver)
continue
try:
select_button = row.find_element(
By.XPATH, ".//button[contains(text(), 'Seleccionar')]"
)
break
except Exception:
logging.info("No available places - refreshing...")
driver.refresh()
sleep(15)
continue
driver.execute_script("arguments[0].scrollIntoView(true);", select_button)
sleep(2)
driver.execute_script("arguments[0].click();", select_button)
sleep(5)
element = driver.find_element(By.ID, "submitSiguiente")
driver.execute_script("arguments[0].click();", element)
if __name__ == "__main__":
main()