from datetime import datetime from os import getenv import utils.gtfs_realtime_pb2 as gtfs import pytz import redis import requests import json db_host = getenv('DB_REDIS_HOST') db_port = getenv('DB_REDIS_PORT') tz = pytz.timezone(getenv('TZ')) r = redis.Redis(host=db_host, port=db_port, decode_responses=True) def main(): print(datetime.now(tz)) fileproto = download_file_proto() if fileproto == None: return False namefile = r.get('fileproto') if namefile == fileproto['name']: print(namefile, flush=True) return # eliminar toda la informacion actual r.flushdb() r.set('fileproto', fileproto['name']) print(fileproto['name'], flush=True) data = read_file_proto_x_stop(fileproto['content']) # save data to redis db for key in data: r.set(key, json.dumps(data[key])) def download_file_proto(): response = requests.get('https://app.ilab.cl/gtfs-rt/api/concepcion') if response.status_code == 200: content_disposition = response.headers['Content-Disposition'] nombre_archivo = content_disposition.split('filename=')[1] return { 'name': nombre_archivo, 'content': response.content } return None """ agrupa los trayectos a llegar al paradero """ def read_file_proto_x_stop(content): feed = gtfs.FeedMessage() feed.ParseFromString(content) data_stop = {} for entity in feed.entity: if entity.HasField('trip_update'): # agregar trayectos con paraderos for update in entity.trip_update.stop_time_update: trip_data = { "id": str(entity.id), "stop_id": None, "stop_sequence": None, "trip_id": entity.trip_update.trip.trip_id, "route_id": entity.trip_update.trip.route_id, "direction_id": entity.trip_update.trip.direction_id, "start_time": entity.trip_update.trip.start_time, "start_date": entity.trip_update.trip.start_date, "arrival_time": None, "hora_llegada": None, "schedule_relationship": entity.trip_update.trip.schedule_relationship, "vehicle_license_plate": entity.trip_update.vehicle.license_plate, "latitude": entity.vehicle.position.latitude, "longitude": entity.vehicle.position.longitude, "bearing": entity.vehicle.position.bearing, "odometer": entity.vehicle.position.odometer, "speed": entity.vehicle.position.speed } trip_data["stop_id"] = update.stop_id trip_data["stop_sequence"] = update.stop_sequence trip_data["arrival_time"] = update.arrival.time trip_data["hora_llegada"] = datetime.fromtimestamp(update.arrival.time).strftime('%H:%M:%S') stop_id = 'none' if update.stop_id != None and update.stop_id > '': stop_id = update.stop_id key = f'stop_id:{stop_id}' if key in data_stop: data_stop[key].append(trip_data) else: data_stop[key] = [ trip_data ] else: # agregar trayectos sin paradero key = f'stop_id:none' trip_data = { "id": str(entity.id), "trip_id": entity.vehicle.trip.trip_id, "route_id":entity.vehicle.trip.route_id, "direction_id": entity.vehicle.trip.direction_id, "start_time": entity.vehicle.trip.start_time, "start_date": entity.vehicle.trip.start_date, "schedule_relationship": entity.vehicle.trip.schedule_relationship, "vehicle_license_plate": entity.vehicle.vehicle.license_plate, "latitude": entity.vehicle.position.latitude, "longitude": entity.vehicle.position.longitude, "bearing": entity.vehicle.position.bearing, "odometer": entity.vehicle.position.odometer, "speed": entity.vehicle.position.speed } if key in data_stop: data_stop[key].append(trip_data) else: data_stop[key] = [ trip_data ] return data_stop; """ agrupa los trayectos hechos por linea """ def read_file_proto_x_route(content): feed = gtfs.FeedMessage() feed.ParseFromString(content) data_route = {} for entity in feed.entity: if entity.HasField('trip_update'): trip_data = { "id": str(entity.id), "trip_id": entity.trip_update.trip.trip_id, "route_id": entity.trip_update.trip.route_id, "direction_id": entity.trip_update.trip.direction_id, "start_time": entity.trip_update.trip.start_time, "start_date": entity.trip_update.trip.start_date, "schedule_relationship": entity.trip_update.trip.schedule_relationship, "vehicle_license_plate": entity.trip_update.vehicle.license_plate, "latitude": entity.vehicle.position.latitude, "longitude": entity.vehicle.position.longitude, "bearing": entity.vehicle.position.bearing, "odometer": entity.vehicle.position.odometer, "speed": entity.vehicle.position.speed } for update in entity.trip_update.stop_time_update: key = f'route:{trip_data["route_id"]}-{trip_data["direction_id"]}' if key in data_route: data_route[key].append(trip_data) else: data_route[key] = [ trip_data ] return data_route; main()