Skip to content

Commit

Permalink
do MORE stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
DasMoorhuhn committed May 9, 2022
1 parent 3bd3560 commit 9a3ce08
Show file tree
Hide file tree
Showing 6 changed files with 93 additions and 15 deletions.
36 changes: 30 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
# Python Tankstellen Api Wrapper

Dies ist ein API Wrapper für Tankstellen in Deutschland. Als Quelle wird [TankerKönig](https://tankerkoenig.de/) verwendet.
Dies ist ein API Wrapper für Tankstellen in Deutschland. Als Quelle wird [TankerKönig](https://tankerkoenig.de/) verwendet. Ziel ist es, einfache Objekte zu bekommen mit allen Daten einer Tankstelle. Jaaaa ich weiß, es gibt die [PyTankerKoening](https://pypi.org/project/pytankerkoenig/) Lib, die haut aber das JSON einfach so raus.

## Getting started
1. API Key: </br>
Expand All @@ -11,11 +10,36 @@ Dies ist ein API Wrapper für Tankstellen in Deutschland. Als Quelle wird [Tanke
1. Das Objekt secret vom secretHandler erstellen </br>
2. Die Methode `loadFromSecret` ausführen. Damit wird die Datei `secret.txt` ausgelesen.
3. Rückgabewerte: </br>
0: Secret wurde geladen </br>
1: Fehler beim Lesen von `secret.txt` </br> </br>
- 0: Secret wurde geladen </br>
- 1: Fehler beim Lesen von `secret.txt` </br> </br>
3. ApiHandler:
1. api Objekt erstellen. Mit übergeben wird die Postleitzahl und das secret Objekt
2. Methoden:
- ## getGasStations(raduisInKM:float, spritType:str, onlyInThisPostCode:bool, sortedBy:str):
- raduisInKM:
- max: 25
- Radius in Kilometer um die Postleitzahl herum
- spritType:
- e5
- e10
- diesel
- all
- onlyInThisPostCode:
- True: Gibt nur die Tankstellen zurück, die mit der Postleitzahl vom api Objekt (classes.city) übereinstimmen
- False: Gibt alle Tankstellen im diffinierten Radius zurück
- sortedBy [TODO]:
- price: Sortiert die Liste nach Preis (Von Günstig nacg Teuer)
- postCode: Sortiert die Liste nach Postleitzahl (Aufsteigend)
- distance: Sortiert die Liste nach Distanz zur Postleitzahl (Aufsteigend, KM)
- none: gibt die Liste ohne überarbeitung weiter
- return value:
- Liste der Tankstellen
- ## getGasStationDetail(stationID:str):
- stationID: die Tankstellen ID
- return value:
- gasStationDetail Objekt (classes.gasStationDetail)
- 1 bei einem Fehler

# Libs
## Libs
[pgeocode](https://pypi.org/project/pgeocode/): Für die Längen- und Breitengrade von einer Postleitzahl </br>
[requests](https://pypi.org/project/requests/): Zum aufrufen der TankerKönig API
[requests](https://pypi.org/project/requests/): Zum aufrufen der TankerKönig API
2 changes: 2 additions & 0 deletions __init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from apiHandler import api as tankerKoenig_main
import classes as tankerKoenig_classes
43 changes: 36 additions & 7 deletions apiHandler.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
'''
Diese lib holt sich die Informationen von Tankstellen via API https://tankerkoening.de und gibt diese als Objekte zurück
Projektseite GitLab: https://gitlab.com/HendrikHeine/python-gas-station-api/
Hendrik Heine, 2022
'''


import pgeocode
import requests as _requests
from secretHandler import secret as _secret
from classes import *


class api:
def __init__(self, postalCode:int, secret:_secret) -> None:
'''postalCode: Die Postleitzahl\nsecret: Das secret Objekt'''
Expand All @@ -17,12 +23,29 @@ def __init__(self, postalCode:int, secret:_secret) -> None:
self.__listURL = f"{self.__baseURL}/list.php" # Umkreissuche
self.__detailURL = f"{self.__baseURL}/detail.php" # Details zu einer bestimmten Tankstelle
self.__reportURL = f"{self.__baseURL}/complaint.php" # Zum Melden von falschen Angaben
self.version = "0.0.1"
self.date = "09.05.2022"

self.__stations = []

self.__stations = []
def __sortStationList(self, stationList:list, sortedBy:str):
listForReturn = []
try:
if sortedBy == "price":
pass
if sortedBy == "postCode":
pass
if sortedBy == "distance":
pass
if sortedBy == "none":
listForReturn = stationList

finally:
return listForReturn


def getGasStations(self, raduisInKM:float=10.0, spritType:str="all", onlyInThisPostCode:bool=False, sortedBy:str="postCode"):
'''Max Radius: 25KM\nSpritTypes: e5, e10, diesel, all\nOnlyInThisPostCode: Zeigt nur Tanketsllen mit der passenden Postleitzahl\nSortedBy: price, postCode, distanz'''
def getGasStations(self, raduisInKM:float=10.0, spritType:str="all", onlyInThisPostCode:bool=False, sortedBy:str="none"):
'''Max Radius: 25KM\nSpritTypes: e5, e10, diesel, all\nOnlyInThisPostCode: Zeigt nur Tanketsllen mit der passenden Postleitzahl\nSortedBy: price, postCode, distance, none'''
req = f"{self.__listURL}?lat={self.__city.lat}&lng={self.__city.lng}&rad={raduisInKM}&sort=dist&type={spritType}&apikey={self.__apiKey}"
response = _requests.api.get(req).json()
if response["ok"] and response["status"] == "ok":
Expand All @@ -37,7 +60,13 @@ def getGasStations(self, raduisInKM:float=10.0, spritType:str="all", onlyInThisP
else:
listForReturn.append(station)

return listForReturn
return self.__sortStationList(stationList=listForReturn, sortedBy=sortedBy)

def getStaionDeteails(self):
pass
def getGasStaionDetails(self, staionID:str):
'''Mehr details zu einer bestimmten Tankstelle'''
req = f"{self.__detailURL}?id={staionID}&apikey={self.__apiKey}"
response = _requests.api.get(req).json()
if response["ok"] and response["status"] == "ok":
return gasSationDetail(response["station"])
else:
return 1
2 changes: 2 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# v0.0.1 (09.05.2022)
* added: apiHandler, classes and changelog
21 changes: 20 additions & 1 deletion classes.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,29 @@ def __init__(self, value:dict) -> None:
self.e10 = value["e10"]
self.isOpen = value["isOpen"]

class gasSationDetail:
def __init__(self, value:dict) -> None:
self.id = value["id"]
self.name = value["name"]
self.brand = value["brand"]
self.street = value["street"]
self.houseNumber = value["houseNumber"]
self.postCode = value["postCode"]
self.place = value["place"]
self.lat = value["lat"]
self.lng = value["lng"]
self.diesel = value["diesel"]
self.e5 = value["e5"]
self.e10 = value["e10"]
self.isOpen = value["isOpen"]
self.wholeDay = value["wholeDay"]
self.openingTimes = value["openingTimes"]
self.closedAt = value["overrides"]

class city:
def __init__(self, lat, lng, name, postalCode, communityCode) -> None:
self.lat = lat
self.lng = lng
self.name = name
self.postalCode = int(postalCode)
self.communityCode = communityCode
self.communityCode = communityCode
4 changes: 3 additions & 1 deletion tankApi.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,10 @@
stations = api.getGasStations(onlyInThisPostCode=True, raduisInKM=5, spritType="all")
for station in stations:
station:gasSation
print(station.postCode)
stationDetail = api.getGasStaionDetails(staionID=station.id)
stationDetail:gasSationDetail
print(station.brand)
print(stationDetail.wholeDay)
print("")
else:
exit("Error reading secret")

0 comments on commit 9a3ce08

Please sign in to comment.