Files
telekom-bike/main.py
2021-09-01 18:29:11 +02:00

89 lines
3.3 KiB
Python

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()}')