95 lines
3.5 KiB
Python
95 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')
|
|
# leben
|
|
|
|
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()}')
|