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.request import Request
from classes.response import Response from classes.response import Response
from classes.httpclient import HTTPClient from classes.httpclient import HTTPClient
from classes.hafas import Hafas

View file

@ -1,11 +1,16 @@
from datetime import datetime from datetime import datetime
from json import dumps
from random import SystemRandom
from string import ascii_lowercase, digits
from classes import HTTPClient
class Hafas: class Hafas:
API_URL = "https://fahrplan.oebb.at/bin/mgate.exe?rnd=%i" API_URL = "https://fahrplan.oebb.at/bin/mgate.exe?rnd=%i"
BASE_CONTENT = { BASE_CONTENT = {
"id": "h7iqfi6m2eskyk8x", "id": None, # h7iqfi6m2eskyk8x
"ver": "1.32", "ver": "1.32",
"lang": "deu", "lang": "deu",
"auth": { "auth": {
@ -13,10 +18,10 @@ class Hafas:
"aid": "5vHavmuWPWIfetEe" "aid": "5vHavmuWPWIfetEe"
}, },
"client": { "client": {
"id": "OEBB", "id": "OEBB", # OEBB
"type": "WEB", "type": "WEB",
"name": "webapp", "name": "bahnapi.eu", # webapp
"l": "vs_webapp" "l": "oebb_py" # vs_webapp
}, },
"formatted": False, "formatted": False,
"ext": "OEBB.11", "ext": "OEBB.11",
@ -24,3 +29,30 @@ class Hafas:
def __init__(self): def __init__(self):
self.timestamp = int(datetime.now().timestamp() * 1000) 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): class HTTPClient:
def __init__(self, *args, **kwargs): def __init__(self, url, payload=None, headers=None):
requests.Session.__init__(self, *args, **kwargs) self.request = Request(url, payload, headers or {})
self.headers = { self.request.add_header(
"User-Agent": "oebb_py/git (+https://kumig.it/kumitterer/oebb_py)"} "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") self.cfrm = split[0].encode("latin-1").decode("utf-8")
try: 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: except:
output = "<h1>400 Bad Request</h1>\n" output = "<h1>400 Bad Request</h1>\n"
output += "A request type must be provided." output += "A request type must be provided."

View file

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