Kick requests module out, working Hafas request implementation

This commit is contained in:
Kumi 2022-04-20 10:53:42 +02:00
parent 6a8a614b3d
commit 06f83af3d8
Signed by: kumi
GPG key ID: 5D1CE6AF1805ECA2
5 changed files with 58 additions and 13 deletions

View file

@ -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

View file

@ -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()

View file

@ -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()

View file

@ -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 = "<h1>400 Bad Request</h1>\n"
output += "A request type must be provided."

View file

@ -1,5 +1,4 @@
pytz
bs4
requests
overpy
html5lib