import re import requests import xml.etree.ElementTree as ET from datetime import datetime from pystache import render from time import sleep CITY = 'Braunschweig'; STOPS = ['Ludwigstraße', 'Hamburger Straße']; ENTRIES = 6; def run(emit, log_err): templates = dict() for name in ['inner','outer']: with open('modules/bus/{}.mustache'.format(name), 'r') as f: templates[name] = f.read() emit(render(templates['outer'], [normalize_stop(s) for s in STOPS])) while True: for stop in STOPS: try: ns = normalize_stop(stop) deps = get_data(stop, ENTRIES) ctx = {'stop': stop, 'normalizedStop': ns, 'deps': deps} emit(render(templates['inner'], ctx), outlet=ns) except Exception as e: log_err(e) sleep(60) def fetch_data(stop): url = "http://62.154.206.87/efaws2/default/XML_DM_REQUEST?sessionID=0&requestID=0&language=de&useRealtime=1&coordOutputFormat=WGS84[DD.ddddd]&locationServerActive=1&mode=direct&dmLineSelectionAll=1&depType=STOPEVENTS&useAllStops=1&command=null&type_dm=stop&name_dm={} {}&mId=efa_rc2".format(CITY, stop); r = requests.get(url) return r.text def get_data(stop, count): t = ET.fromstring(fetch_data(stop)) deps = t.find('itdDepartureMonitorRequest').find('itdDepartureList') out = [] for dep in list(deps)[:count]: line = dep.find('itdServingLine') time = dep.find('itdDateTime').find('itdTime') out.append({ 'line': line.get('symbol'), 'renderedLine': render_line(line.get('symbol')), 'dir': line.get('direction').replace(CITY, '').strip(), 'platform': dep.get('platform'), 'hour': time.get('hour').zfill(2), 'minute': time.get('minute').zfill(2) }) return out def render_line(line): image = '' if len(line) < 3: image = 'tram.svg' else: image = 'bus.svg' return '<img src="/modules/bus/{}"> {}'.format(image, line) def normalize_stop(stop): return re.sub('[^a-zA-Z0-9_]', '', stop)