import re import sys from datetime import datetime from time import sleep # from playsound import playsound from requests import post from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.keys import Keys def main(): wanted_bikes = read_bike_file('wanted_bikes') known_bikes = read_bike_file('known_bikes') chrome_options = Options() chrome_options.add_argument("--headless") chrome_options.add_argument("--disable-gpu") driver = webdriver.Chrome(options=chrome_options) driver.get('https://telekom.company-bike.com') pw = driver.find_element_by_id('password') pw.send_keys("#Magenta-only") pw.send_keys(Keys.RETURN) driver.get('https://telekom.company-bike.com/shop?filter=1&type=Pedelec&groups=MTB/Cross&fed=1') bikes = driver.find_elements_by_css_selector('div.product-info > h4') bikes.pop() print(f'Found {len(bikes)} bikes.') check_links = [] for bike in bikes: if bike.text in known_bikes: if bike.text in wanted_bikes: check_links.append(bike.find_element_by_css_selector('a').get_property('href')) else: print(f'{bike.text} known but not wanted.') else: alert(f'Unknown bike found: {bike.text}!') for link in check_links: driver.get(link) name = driver.find_element_by_css_selector('h1.mb-0') print(f'Checking {name.text}:') sizes = driver.find_elements_by_css_selector('div.size-list-wrapper > ul > li > div > div > h3') for size in sizes: if size.text != 'L': print(f'Not caring for size {size.text}.') continue availability = size.find_element_by_xpath('..').find_element_by_css_selector('span').get_attribute("class") availability = re.search(r'ado-(?!light)(\w+)-bulb', availability) if not availability: alert(f'Error in availability check for {name.text} in size {size.text}') continue availability = availability.group(1) print(f'Availability of size {size.text}: {availability}') if availability != 'red': alert(f'We got availability for {name.text} in size {size.text}!') driver.close() def read_bike_file(filename): with open(filename, 'r') as bike_file: return bike_file.read().splitlines() def alert(text = 'Alarm!'): print(text) url = "https://hass.schnur.cloud/api/services/notify/mobile_app_benes_iphone" headers = { "Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiI3MmQzZjA3YzA3NTg0MWU5YThmNzYxNjg1YzJjYzFmOCIsImlhdCI6MTYzMDQ4MDEyNSwiZXhwIjoxOTQ1ODQwMTI1fQ.DoyyMdjGlzavcLIjWXKk3Oqp1PgQQj0_DrbCzYNsLIE", "content-type": "application/json", } data = f'{{"message": "{text}"}}' post(url, data=data, headers=headers) # playsound('alarm.mp3') alert('Starting Telekom Bike Checker...') try: while(True): print(f'{datetime.now().strftime("%X")}: Starting new check.') main() print('Sleeping for 15 minutes...') sleep(60*15) print('Ihr wollt den selben Song nochmal? Okay, hier kommt der selbe Song nochmal!') except: alert(f'Error in Bike Checker! {sys.exc_info()}')