#!/usr/bin/python3 import requests import sys import os import json import time import datetime import re def searchStop(name): url = "https://webapi.vvo-online.de/tr/pointfinder" myobj = {"query": name, "stopsOnly": True, "regionalOnly": True} x = requests.post(url, json=myobj) x = x.json() points = x["Points"] stops = [] for Point in x["Points"]: stops.append([Point.split(sep="|")[0], Point.split(sep="|")[3], Point.split(sep="|")[2]]) return stops def selectStop(stops): print("Your query matches the following stops:\n") for i, stop in enumerate(stops): print(f"({i:>2d}) {stop[1]}, {stop[2]}") selection = int(input("\nPlease select... ")) stopId = stops[selection][0] stopName = stops[selection][1] stopCity = stops[selection][2] return stopId, stopName def getMaxLength(elem, array): return max(map(lambda f: len(f[elem]), array)) def getDepartures(stopId): url = "https://webapi.vvo-online.de/dm" myobj = {"stopid": stopId} now = datetime.datetime.now() x = requests.post(url, json=myobj) x = x.json() print(f"Departures for {x['Name']}, {x['Place']}:\n ") for Departure in x["Departures"]: MotType = Departure["Mot"] LineName = Departure["LineName"] Direction = Departure["Direction"] ScheduledTime = datetime.datetime.fromtimestamp( int(re.match(r"/Date[(](\d*)", Departure["ScheduledTime"]).group(1)) / 1000 ) if "RealTime" in Departure: RealTime = datetime.datetime.fromtimestamp( int(re.match(r"/Date[(](\d*)", Departure["RealTime"]).group(1)) / 1000 ) else: RealTime = None if "State" in Departure and Departure["State"] == "Delayed": delay = int((RealTime - ScheduledTime).seconds / 60) else: delay = "" DepartureTime = (RealTime or ScheduledTime).strftime("%H:%M") relativeDeparture = int(((RealTime or ScheduledTime) - now).seconds / 60) print( f"{MotType:>{getMaxLength("Mot",x["Departures"])}s} " f"{LineName:>{getMaxLength("LineName",x['Departures'])}s} " f"{Direction:{getMaxLength("Direction",x["Departures"])}s} " f"{DepartureTime} " f"{relativeDeparture:>3} " f"{delay} " ) return if __name__ == "__main__": import argparse parser = argparse.ArgumentParser( prog="VVO EFA Haltestellenauskunft", description="Miau!", epilog="=^.^=" ) parser.add_argument("stopQuery") # positional argument args = parser.parse_args() if __name__ == "__main__": import argparse parser = argparse.ArgumentParser( prog="VVO EFA Haltestellenauskunft", description="Miau!", epilog="=^.^=" ) parser.add_argument("stopQuery") # positional argument args = parser.parse_args() stop = searchStop(args.stopQuery) if len(stop) > 1: stopId, stopName = selectStop(stop) else: stopId = stop[0][0] getDepartures(stopId) sys.exit()