diff --git a/Dockerfile b/Dockerfile index 3af2560..1b3b857 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM python:3.10 RUN pip install --no-cache-dir --upgrade pip && \ - pip install --no-cache-dir selenium-wire + pip install --no-cache-dir selenium-wire flask RUN apt-get update && apt-get -y install chromium diff --git a/README.md b/README.md index 5b967b6..94fb65c 100644 --- a/README.md +++ b/README.md @@ -4,4 +4,16 @@ Das Projekt wird gestartet mit `docker compose up` (`docker-compose up`) Bisher werden nur daten des Typs "online-level" verarbeitet, aber der Rest sollte einigermassen trivial sein. -Ich habe keine Ahnung, wie und in welchem Format ihr das an euren zentralen Thinger Server senden wollt, aber kÃnnt ihr vieleicht auch selber erledigen. +Ich habe keine Ahnung, wie und in welchem Format ihr das an euren zentralen Thinger Server senden wollt, aber kÃnnt ihr vieleicht auch selber erledigen. + +### server-web.py + +Hier wird der web server direkt im Programm gestartet. Der Server lauscht auf Port 80. Im docker container gestartet kann man den server auf port 8050 anfragen + +``` +# Liste mit ids +curl http://127.0.0.1:8050/ids +# Wert der Id +curl http://127.0.0.1:8050/nmt/6 +``` + diff --git a/docker-compose.yml b/docker-compose.yml index 74af0e8..fa9806b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,5 +5,7 @@ services: build: . restart: always mem_limit: 1024m + ports: + - 127.0.0.1:8050:80 volumes: - - ./server.py:/app/server.py + - ./server-web.py:/app/server.py diff --git a/server-web.py b/server-web.py new file mode 100644 index 0000000..200977b --- /dev/null +++ b/server-web.py @@ -0,0 +1,71 @@ +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 +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 = {} +app = f("web") + +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 handleJson(jsonObj): + if isinstance(jsonObj, list): + if 'online-level' in jsonObj: + #typ = jsonObj[1]["LevelValues"][0]["Type"] + value = jsonObj[1]["LevelValues"][0]["Values"] + NmtId = jsonObj[1]["NmtId"] + #time = jsonObj[1]["Time"] + valuestore[NmtId] = value + +# Gibt den letzten bekannten Wert fuer die NMTID zurueck +@app.route('/nmt/') +def nmtid(id): + if id in valuestore: + return valuestore[id] + else: + return "Not Found" + +# Gibt eine Liste mit verfuegbaren ids zurueck +@app.route('/ids') +def ids(): + l = 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) diff --git a/server.py b/server.py index 92ffb4d..200977b 100644 --- a/server.py +++ b/server.py @@ -2,6 +2,8 @@ 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 import json import re @@ -18,6 +20,8 @@ options.add_argument('--disable-dev-shm-usage') # Create a new instance of the Chrome driver driver = webdriver.Chrome(options=options) q = deque() +valuestore = {} +app = f("web") def interceptor(request, response): # A response interceptor takes two args if 'ws-travis.dus.com/socket.io/?EIO=3&transport=polling' in request.url : @@ -37,26 +41,31 @@ def interceptor(request, response): # A response interceptor takes two args def handleJson(jsonObj): - if isinstance(jsonObj, list): if 'online-level' in jsonObj: - typ = jsonObj[1]["LevelValues"][0]["Type"] + #typ = jsonObj[1]["LevelValues"][0]["Type"] value = jsonObj[1]["LevelValues"][0]["Values"] NmtId = jsonObj[1]["NmtId"] - time = jsonObj[1]["Time"] - - q.append([typ, value, NmtId, time]) + #time = jsonObj[1]["Time"] + valuestore[NmtId] = value +# Gibt den letzten bekannten Wert fuer die NMTID zurueck +@app.route('/nmt/') +def nmtid(id): + if id in valuestore: + return valuestore[id] + else: + return "Not Found" -driver.response_interceptor = interceptor +# Gibt eine Liste mit verfuegbaren ids zurueck +@app.route('/ids') +def ids(): + l = list(valuestore.keys()) + return ','.join(map(str,l)) -driver.get('https://dus-travis.dus.com/') +if __name__ == '__main__': + driver.response_interceptor = interceptor -while True: - sleep(1) - l = len(q) - for i in range(1, l): - a = q.pop() - #print ("[", a[3], "]: ", "NmtId: ", a[2] , " Typ: ", a[0], " Wert: ", a[1]) - print("Popped ",l," Messages") + driver.get('https://dus-travis.dus.com/') + app.run(host='0.0.0.0', port=80, debug=False)