Advertisement
Guest User

Untitled

a guest
Dec 21st, 2021
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.18 KB | None | 0 0
  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. from selenium.webdriver.support.ui import WebDriverWait
  4. from selenium.webdriver.support import expected_conditions as EC
  5. from selenium.webdriver.chrome.options import Options
  6.  
  7. from datetime import datetime
  8. from time import sleep
  9. from pathlib import Path
  10.  
  11. import sqlite3
  12. import os
  13.  
  14. #script path
  15. MAIN_PATH = os.getcwd()
  16.  
  17. #USERNAME AND PASSWORDS
  18. I_UNAME = ''
  19. I_PW = ''
  20.  
  21. TD_UNAME = ''
  22. TD_PW = ''
  23.  
  24. #time to sleep between checks
  25. SLEEP_TIME = 60 * 30
  26.  
  27.  
  28. def get_driver():
  29.     options = Options()
  30.     options.add_argument('--headless')
  31.     options.add_argument('--disable-gpu')
  32.  
  33.     driver = webdriver.Chrome(options=options)
  34.  
  35.     return driver
  36.  
  37.  
  38. def startup():
  39.     #checks if db exists and creates if none found
  40.     sql_db = Path(MAIN_PATH + r'\workout.db')
  41.     if not sql_db.is_file():
  42.         conn = sqlite3.connect(sql_db)
  43.         cur = conn.cursor()
  44.         with conn:
  45.             cur.execute('CREATE TABLE past_workouts (link TEXT PRIMARY KEY, load_date TEXT)')
  46.  
  47.         conn.close
  48.  
  49.     return sql_db
  50.  
  51.  
  52. def get_workout(driver, sql_db):
  53.     #navigate to main icu page
  54.     driver.get('https://intervals.icu/')
  55.  
  56.     #login to intervals.icu
  57.     WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//*[@class='v-btn' and text()='Login']"))).click()
  58.  
  59.     WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, f"//*[@name='email']"))).send_keys(I_UNAME)
  60.     WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, f"//*[@name='password']"))).send_keys(I_PW)
  61.  
  62.     WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//*[@class='v-btn__content' and text()='Login']"))).click()
  63.  
  64.     #bypass the sign-up prompt NOTE: !!! STRONGLY CONSIDER SIGNING UP !!!
  65.     WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//*[@class='v-icon material-icons theme--dark' and text()='close']"))).click()
  66.  
  67.     #find todays workout and get the TrainerDay link
  68.     WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//*[@class='day day clickable today']//*[@class='activity']"))).click()
  69.     td_link = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, "div.markdown a"))).get_attribute('href')
  70.  
  71.     if not check_workout(td_link, sql_db):
  72.         return td_link
  73.     else:
  74.         driver.quit()
  75.         return False
  76.  
  77.  
  78. def push_workout(driver, td_link):
  79.     #navigate to td login page
  80.     driver.get('https://trainerday.com/login')
  81.  
  82.     WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//*[@class='wpforms-field-large wpforms-field-required']"))).send_keys(TD_UNAME)
  83.     WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//input[@type='password']"))).send_keys(TD_PW)
  84.  
  85.     WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//*[@class='wpforms-submit' and text()='Login']"))).click()
  86.  
  87.     #now that we are logged in navigate to the workout page
  88.     driver.get(td_link)
  89.  
  90.     WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//*[contains(text(), 'Send To')]"))).click()
  91.     WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//*[contains(text(), 'TrainingPeaks (Power)')]"))).click()
  92.  
  93.     #sleep to confirm send
  94.     sleep(5)
  95.  
  96.     driver.quit()
  97.  
  98.  
  99. def check_workout(td_link, sql_db):
  100.     #checks if workout has been found and sent to TP before
  101.     conn = sqlite3.connect(sql_db)
  102.     cur = conn.cursor()
  103.  
  104.     workout = cur.execute("SELECT 1 FROM past_workouts WHERE link=?", (td_link,)).fetchone()
  105.  
  106.     try:
  107.         if workout:
  108.             return True
  109.         else:
  110.             with conn:
  111.                 now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
  112.                 cur.execute("INSERT INTO past_workouts VALUES(?,?)", (td_link, now))
  113.             return False
  114.     finally:
  115.         conn.close()
  116.  
  117.  
  118. if __name__ == '__main__':
  119.     sql_db = startup()
  120.     while True:
  121.         driver = get_driver()
  122.         td_link = get_workout(driver, sql_db)
  123.         if td_link:
  124.             push_workout(driver, td_link)
  125.  
  126.         sleep(SLEEP_TIME)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement