import datetime import json import requests from flask import Flask, request from flask_restful import Api, Resource app = Flask(__name__) api = Api(app) def send_request(url, raw): headers = { "User-Agent": "EGO Genel Mudurlugu-EGO Cepte-3.1.0 GT-I9500 7.1.2", "Content-Type":"application/x-www-form-urlencoded", "Content-Length":str(len(raw)) } r = requests.post(url, headers=headers, data=raw) content = r.content.decode("cp1252") replace_chars = {"Ý":"I", "ý":"i", "ð":"g", "þ":"s", "Þ":"S"} for key in replace_chars: content.replace(key, replace_chars[key]) content = content.replace("'", '"') content = json.loads(content) return content conn1 = send_request( 'http://88.255.141.70/mbl/android/connect.asp?SID=0.392509188312098&VER=3.1.0&LAN=tr&UID=%7BACB78701' '-2727-4E9A-AE62-28491D671A7D%7D-130570234&FNC=Connect', "UID=%7BACB78701-2727-4E9A-AE62-28491D671A7D%7D-130570234&UPS=TRUE") conn2 = send_request( 'http://88.255.141.66/mbl/android/connect.asp?SID=0.392509188312098&VER=3.1.0&LAN=tr&UID=%7BACB78701' '-2727-4E9A-AE62-28491D671A7D%7D-130570234&FNC=Start', "") bus_data = open("modules/databases/bus.json", "r") bus_json = json.loads(bus_data.read()) routes = bus_json["stops"] bus_data.close() print('\n', conn1, '\n\n', conn2, '\n') def time_small(t1, t2): time1 = datetime.datetime.strptime(t1, "%H:%M") time2 = datetime.datetime.strptime(t2, "%H:%M") if time1 < time2: return False else: return True def time_diff(t1, t2): time1 = datetime.datetime.strptime(t1, "%H:%M") time2 = datetime.datetime.strptime(t2, "%H:%M") response = "" if abs(time2.hour - time1.hour) < 10: response += "0" if time2.minute - time1.minute >= 0: response += str(abs(time2.hour - time1.hour)) else: response += str(abs(abs(time2.hour - time1.hour)-1)) response += ":" if abs(time2.minute - time1.minute) < 10: response += "0" response += str(abs(time2.minute - time1.minute)) return response def time_sum(t1, t2): time1 = datetime.datetime.strptime(t1, "%H:%M") time2 = datetime.datetime.strptime(t2, "%H:%M") response = "" if time2.hour + time1.hour < 10: response += "0" if time2.minute + time1.minute > 60: response += str(time2.hour + time1.hour + 1) else: response += str(time2.hour + time1.hour) response += ":" if time2.minute + time1.minute % 60 < 10: response += "0" response += str((time2.minute + time1.minute) % 60) return response def get_closest_time(times, time): closest = [0, 0] for i in times[0]: if i.hour < time.hour or (i.hour == time.hour and i.minute - 6 < time.minute): continue else: if closest[0] == 0: closest[0] = i continue if abs(i.hour - time.hour) < abs(closest[0].hour - time.hour): closest[0] = i continue elif abs(i.hour - time.hour) == abs(closest[0].hour - time.hour): if i.minute - time.minute < closest[0].minute - time.minute: closest[0] = i if closest[0] == 0: return [] for i in times[1]: if i.hour < closest[0].hour or (i.hour == closest[0].hour and i.minute - 6 < closest[0].minute): continue else: if closest[1] == 0: closest[1] = i continue if abs(i.hour - time.hour) < abs(closest[1].hour - time.hour): closest[1] = i continue elif abs(i.hour - time.hour) == abs(closest[1].hour - time.hour): if i.minute - time.minute < closest[1].minute - time.minute: closest[1] = i if closest[1] == 0: return [] return [closest[0].strftime("%H:%M"), closest[1].strftime("%H:%M")] class Transit(Resource): def post(self): change = False args = request.form stops_raw = {"user":{}, "dest":{}} stops_arr = {"user":{}, "dest":{}} url_closestops = "http://88.255.141.66/mbl/android/action.asp?SID=0.392509188312098&VER=3.1.0&LAN=tr&UID"\ "=%7BACB78701"\ "-2727-4E9A-AE62-28491D671A7D%7D-130570234&FNC=YakinDuraklar" closestops = send_request(url_closestops, "LAT={0}&LNG={1}&MSF=500".format(args["lat_usr"], args["lng_usr"])) for stop in closestops["data"][0]["table"]: stops_arr["user"][stop["kod"]] = stop["hatlar"].split(",") closestops = send_request(url_closestops, "LAT={0}&LNG={1}&MSF=500".format(args["lat_dest"], args["lng_dest"])) for stop in closestops["data"][0]["table"]: stops_arr["dest"][stop["kod"]] = stop["hatlar"].split(",") one_bus = {k.strip(): [dict({x:n for n in stops_arr["user"] for x in stops_arr["user"][n]})[k], dict({x:n for n in stops_arr["dest"] for x in stops_arr["dest"][n]})[k]] for k in (list(set([x for n in stops_arr["user"] for x in stops_arr["user"][n]]) & set([x for n in stops_arr["dest"] for x in stops_arr["dest"][n]])))} travel = {"routes":[], "total":[]} time_cur = datetime.datetime.strptime("13:00","%H:%M") if len(one_bus) > 0: for i in one_bus: travel["routes"].append([{"name":i, "stops":[one_bus[i][0], one_bus[i][1]]}]) else: routes_arr = {"user":{}, "dest":{}} stopno = {} for i in stops_arr["user"]: for j in stops_arr["user"][i]: try: routes_arr["user"][j.strip()] = bus_json["stops"][j.strip()] except KeyError: stops = send_request( "http://88.255.141.66/mbl/android/action.asp?SID=0.8737969480190279&VER=3.1.0&LAN=tr" "&UID" "=%7BACB78701-2727-4E9A-AE62-28491D671A7D%7D-130570234&FNC=HatBilgileri", "KOD={}".format(j.strip()))["data"][0]["table_durak"] bus_json["stops"][j.strip()] = [x["kod"] for x in stops] routes_arr["user"][j.strip()] = bus_json["stops"][j.strip()] for x in stops: bus_json["stop_info"][x["kod"]] = { "name": x["ad"], "location":x["konum"], "lat": x["lat"], "lng": x["lng"] } change = True stopno[j.strip()] = i for i in stops_arr["dest"]: for j in stops_arr["dest"][i]: try: routes_arr["dest"][j.strip()] = bus_json["stops"][j.strip()] except KeyError: stops = send_request( "http://88.255.141.66/mbl/android/action.asp?SID=0.8737969480190279&VER=3.1.0&LAN=tr" "&UID" "=%7BACB78701-2727-4E9A-AE62-28491D671A7D%7D-130570234&FNC=HatBilgileri", "KOD={}".format(j.strip()))["data"][0]["table_durak"] bus_json["stops"][j.strip()] = [x["kod"] for x in stops] routes_arr["dest"][j.strip()] = bus_json["stops"][j.strip()] for x in stops: bus_json["stop_info"][x["kod"]] = { "name": x["ad"], "location":x["konum"], "lat": x["lat"], "lng": x["lng"] } change = True stopno[j.strip()] = i for i in routes_arr["user"]: for j in routes_arr["user"][i]: for k in routes_arr["dest"]: for x in routes_arr["dest"][k]: if j.strip() == x.strip(): travel["routes"].append([ {"name":i.strip(), "stops":[stopno[i.strip()], x.strip()]}, {"name":k.strip(), "stops":[x.strip(), stopno[k.strip()]]}]) for i in range(len(travel["routes"])): for k in range(len(travel["routes"][i])): url = "http://88.255.141.66/mbl/android/action.asp?SID=0.4474110208361718&VER=3.1.0&LAN=tr&UID"\ "=%7BACB78701-2727-4E9A-AE62-28491D671A7D%7D-130570234&FNC=DuraktanGecisSaatleri " weekno = 4 times_anal = [[], []] for j in range(2): try: times_raw = bus_json["times"][travel["routes"][i][k]["name"]] except Exception: bus_json["times"][travel["routes"][i][k]["name"]] = {} try: times_raw = bus_json["times"][travel["routes"][i][k]["name"]][ travel["routes"][i][k]["stops"][j]] except Exception: bus_json["times"][travel["routes"][i][k]["name"]][travel["routes"][i][k]["stops"][j]] = {} if weekno < 5: try: weekday = "HAFTA+%C4%B0%C3%87%C4%B0" times_raw =\ bus_json["times"][travel["routes"][i][k]["name"]][travel["routes"][i][k]["stops"][j]][ "weekday"] except KeyError: bus_json["times"][travel["routes"][i][k]["name"]][travel["routes"][i][k]["stops"][j]][ "weekday"] = send_request(url, "HAT={0}&DURAK={1}&TUR={2}".format( travel["routes"][i][k]["name"], travel["routes"][i][k]["stops"][j], weekday))[ "data"][0]["table"] times_raw =\ bus_json["times"][travel["routes"][i][k]["name"]][travel["routes"][i][k]["stops"][j]][ "weekday"] change = True elif weekno == 5: try: weekday = "CUMARTES%C4%B0" times_raw =\ bus_json["times"][travel["routes"][i][k]["name"]][travel["routes"][i][k]["stops"][j]][ "saturday"] except KeyError: bus_json["times"][travel["routes"][i][k]["name"]][travel["routes"][i][k]["stops"][j]][ "saturday"] = send_request(url, "HAT={0}&DURAK={1}&TUR={2}".format( travel["routes"][i][k]["name"], travel["routes"][i][k]["stops"][j], weekday))[ "data"][0]["table"] times_raw =\ bus_json["times"][travel["routes"][i][k]["name"]][travel["routes"][i][k]["stops"][j]][ "saturday"] change = True else: try: weekday = "PAZAR" times_raw =\ bus_json["times"][travel["routes"][i][k]["name"]][travel["routes"][i][k]["stops"][j]][ "sunday"] except KeyError: bus_json["times"][travel["routes"][i][k]["name"]][travel["routes"][i][k]["stops"][j]][ "sunday"] = send_request(url, "HAT={0}&DURAK={1}&TUR={2}".format( travel["routes"][i][k]["name"], travel["routes"][i][k]["stops"][j], weekday))[ "data"][0]["table"] times_raw =\ bus_json["times"][travel["routes"][i][k]["name"]][travel["routes"][i][k]["stops"][j]][ "sunday"] change = True for time in times_raw: times_anal[j].append( datetime.datetime.strptime("{0}:{1}".format(time["saat"], time["dakika"]), "%H:%M")) closest_times = get_closest_time([times_anal[0], times_anal[1]], time_cur) travel["routes"][i][k]["time"] = closest_times empty = [] for i in range(len(travel["routes"])): remove = True for k in range(len(travel["routes"][i])): if remove: if len(travel["routes"][i][k]["time"]) == 0: empty.append(i - len(empty)) remove = False for i in empty: travel["routes"].pop(i) if change: bus_data = open("modules/databases/bus.json", "w") bus_data.write(json.dumps(bus_json, indent=2, sort_keys=True)) bus_data.close() for route in travel["routes"]: start = route[0]["time"][0] end = route[-1]["time"][1] diff = time_diff(start, end) print (route) print (diff) diff = time_sum(diff, time_diff(time_cur.strftime("%H:%M"), start)) diff = time_sum(diff, "00:05") travel["total"].append(diff) shortest = 0 for i in range(len(travel["total"])): if shortest == 0: shortest = {"routes":travel["routes"][i], "time":travel["total"][i]} continue if time_small(shortest["time"], travel["total"][i]): shortest = {"routes":travel["routes"][i], "time":travel["total"][i]} if change: bus_data = open("modules/databases/bus.json", "w") bus_data.write(json.dumps(bus_json, indent=2, sort_keys=True)) bus_data.close() for i in range(len(shortest["routes"])): try: shortest["routes"][i]["names"] = [bus_json["stop_info"][shortest["routes"][i][0]]["name"],bus_json["stop_info"][shortest["routes"][i][1]]["name"]] except KeyError: shortest["routes"][i]["names"] = [] shortest["routes"][i]["locations"] = [] shortest["routes"][i]["coordinates"] = [] for j in range(2): data = send_request("http://88.255.141.66/mbl/android/action.asp?SID=0.21893997000802157&VER=3.1.0&LAN=tr&UID=%7BACB78701-2727-4E9A-AE62-28491D671A7D%7D-130570234&FNC=Duraklar", "QUERY={}".format(shortest["routes"][i]["stops"][j]))["data"][0]["table"][0] bus_json["stop_info"][shortest["routes"][i]["stops"][j]] ={ "name": data["ad"], "location": data["konum"], "lat": data["lat"], "lng": data["lng"] } shortest["routes"][i]["names"].append(bus_json["stop_info"][shortest["routes"][i]["stops"][j]]["name"]) shortest["routes"][i]["locations"].append(bus_json["stop_info"][shortest["routes"][i]["stops"][j]]["location"]) shortest["routes"][i]["coordinates"].append({"lat":bus_json["stop_info"][shortest["routes"][i]["stops"][j]]["lat"], "lng":bus_json["stop_info"][shortest["routes"][i]["stops"][j]]["lng"]}) change=True if change: bus_data = open("modules/databases/bus.json", "w") bus_data.write(json.dumps(bus_json, indent=2, sort_keys=True)) bus_data.close() return shortest if __name__ == '__main__': api.add_resource(Transit, '/transit', '/transit/') app.run(host='0.0.0.0', port=5000)