From 06f83af3d889a7599fc4da3bbf2053bc48aba079 Mon Sep 17 00:00:00 2001 From: Kumi Date: Wed, 20 Apr 2022 10:53:42 +0200 Subject: [PATCH] Kick requests module out, working Hafas request implementation --- classes/__init__.py | 1 + classes/hafas.py | 40 ++++++++++++++++++++++++++++++++++++---- classes/httpclient.py | 26 ++++++++++++++++++++------ classes/request.py | 3 +-- requirements.txt | 1 - 5 files changed, 58 insertions(+), 13 deletions(-) diff --git a/classes/__init__.py b/classes/__init__.py index a3fd47b..5eca9d5 100644 --- a/classes/__init__.py +++ b/classes/__init__.py @@ -5,3 +5,4 @@ from classes.train import Train from classes.request import Request from classes.response import Response from classes.httpclient import HTTPClient +from classes.hafas import Hafas \ No newline at end of file diff --git a/classes/hafas.py b/classes/hafas.py index bc59e93..3f0631c 100644 --- a/classes/hafas.py +++ b/classes/hafas.py @@ -1,11 +1,16 @@ from datetime import datetime +from json import dumps +from random import SystemRandom +from string import ascii_lowercase, digits + +from classes import HTTPClient class Hafas: API_URL = "https://fahrplan.oebb.at/bin/mgate.exe?rnd=%i" BASE_CONTENT = { - "id": "h7iqfi6m2eskyk8x", + "id": None, # h7iqfi6m2eskyk8x "ver": "1.32", "lang": "deu", "auth": { @@ -13,10 +18,10 @@ class Hafas: "aid": "5vHavmuWPWIfetEe" }, "client": { - "id": "OEBB", + "id": "OEBB", # OEBB "type": "WEB", - "name": "webapp", - "l": "vs_webapp" + "name": "bahnapi.eu", # webapp + "l": "oebb_py" # vs_webapp }, "formatted": False, "ext": "OEBB.11", @@ -24,3 +29,30 @@ class Hafas: def __init__(self): self.timestamp = int(datetime.now().timestamp() * 1000) + + @classmethod + def generateID(self, len=16, chars=ascii_lowercase + digits): + r = SystemRandom() + return "".join([r.choice(chars) for _ in range(len)]) + + def buildRequest(self, request_type, request_data, **kwargs): + client = HTTPClient(self.API_URL % int( + datetime.now().timestamp() * 1000)) + + data = self.BASE_CONTENT + data[request_type] = request_data + + if "language" in kwargs.items(): + data["lang"] = kwargs["language"] + + if "id" in kwargs.items(): + data["id"] = kwargs["id"] + if not data["id"]: + data["id"] = self.__class__.generateID() + + client.data = dumps(data) + return client + + def request(self, request_type, request_data): + client = self.buildRequest(request_type, request_data) + return client.execute() diff --git a/classes/httpclient.py b/classes/httpclient.py index 6348697..beede3d 100644 --- a/classes/httpclient.py +++ b/classes/httpclient.py @@ -1,8 +1,22 @@ -import requests +from urllib.request import Request, urlopen -class HTTPClient(requests.Session): - def __init__(self, *args, **kwargs): - requests.Session.__init__(self, *args, **kwargs) - self.headers = { - "User-Agent": "oebb_py/git (+https://kumig.it/kumitterer/oebb_py)"} +class HTTPClient: + def __init__(self, url, payload=None, headers=None): + self.request = Request(url, payload, headers or {}) + self.request.add_header( + "User-Agent", "oebb_py/git (+https://kumig.it/kumitterer/oebb_py)") + + @property + def data(self): + return self.request.data + + @data.setter + def data(self, value): + if isinstance(value, str): + value = value.encode() + + self.request.data = value + + def execute(self): + return urlopen(self.request).read() \ No newline at end of file diff --git a/classes/request.py b/classes/request.py index 511469f..90f694a 100644 --- a/classes/request.py +++ b/classes/request.py @@ -52,8 +52,7 @@ class Request: self.cfrm = split[0].encode("latin-1").decode("utf-8") try: - self.rtype = "conn" if self.conn else "val" if self.val else self.args["type"][0].lower( - ) + self.rtype = "conn" if self.conn else "val" if self.val else self.args["type"][0].lower() except: output = "

400 Bad Request

\n" output += "A request type must be provided." diff --git a/requirements.txt b/requirements.txt index f156e16..99a8367 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,4 @@ pytz bs4 -requests overpy html5lib