Files
telekom-bike/main.py
2021-11-04 17:36:14 +01:00

94 lines
3.5 KiB
Python

import re
import sys
from datetime import datetime
from time import sleep
from requests import post
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from tabulate import tabulate
def main():
wanted_bikes = read_bike_file('wanted_bikes')
known_bikes = read_bike_file('known_bikes')
chrome_options = Options()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
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')
print(f'Found {len(bikes)} (possible) 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.')
elif bike.text == 'Ihr Fahrrad ist nicht dabei?':
print(f'Ad: "{bike.text}"')
else:
alert(f'Unknown bike found: {bike.text}!')
print()
for link in check_links:
driver.get(link)
name = driver.find_element_by_css_selector('h1.mb-0')
print(f'Checking availability for {name.text}:')
sizes = driver.find_elements_by_css_selector('div.size-list-wrapper > ul > li > div > div > h3')
results = []
for size in sizes:
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)
results.append([size.text, availability])
if size.text == 'L' and availability != 'red':
alert(f'We got availability for {name.text} in size {size.text}!')
print(tabulate(results, tablefmt="pretty"))
print('')
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!')
print()
except:
alert(f'Error in Bike Checker! {sys.exc_info()}')