from seleniumwire import webdriver # Import from seleniumwire from seleniumwire.utils import decode from time import sleep from collections import deque from flask import Flask as f from flask import Response from dateutil import parser from datetime import datetime, timedelta, timezone import json import re options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument("--incognito") options.add_argument("--nogpu") options.add_argument("--disable-gpu") options.add_argument("--window-size=1280,1280") options.add_argument("--no-sandbox") options.add_argument("--enable-javascript") options.add_argument('--disable-dev-shm-usage') # Create a new instance of the Chrome driver driver = webdriver.Chrome(options=options) q = deque() valuestore = {} datestore = {} app = f("web") h2 = timedelta(hours=2) def interceptor(request, response): # A response interceptor takes two args if 'ws-travis.dus.com/socket.io/?EIO=3&transport=polling' in request.url : body = decode(response.body, response.headers.get('Content-Encoding', 'identity')) x = re.split("\d\d\d:\d\d\/dus,", body.decode("utf-8")) for i in [i for i in x if i]: try: j = json.loads(i) handleJson(j) except ValueError: if i.find("online-level") > 0: print ("Fixed: ", i) j = json.loads(i[:i.rfind(']') + 1]) handleJson(j) else: print ("Err: ", i) def idIsRecent(id): return id in valuestore and datetime.now(timezone.utc) - parser.parse(datestore[id]) < timedelta(seconds=30) def handleJson(jsonObj): if isinstance(jsonObj, list): if 'online-level' in jsonObj: #typ = jsonObj[1]["LevelValues"][0]["Type"] value = jsonObj[1]["LevelValues"][0]["Values"][0] NmtId = jsonObj[1]["NmtId"] time = jsonObj[1]["Time"] valuestore[NmtId] = value datestore[NmtId] = time # Gibt den letzten bekannten Wert fuer die NMTID zurueck @app.route('/nmt/') def nmtid(id): if id in valuestore and datetime.now(timezone.utc) - parser.parse(datestore[id]) < timedelta(seconds=30): return format( valuestore[id], '.1f') else: return "E_NA" # Entweder out of date oder nicht existent # Gibt eine Liste mit verfuegbaren ids zurueck @app.route('/ids') def ids(): l = filter(idIsRecent,list(valuestore.keys())) return ','.join(map(str,l)) if __name__ == '__main__': driver.response_interceptor = interceptor driver.get('https://dus-travis.dus.com/') app.run(host='0.0.0.0', port=80, debug=False)