From 9bc1ec3cfd140573350054f30eecfbef81e66a28 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sun, 7 Jun 2020 22:49:18 -0400 Subject: [PATCH 001/124] Upload current --- OpenSky Bot testing.py | 141 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 OpenSky Bot testing.py diff --git a/OpenSky Bot testing.py b/OpenSky Bot testing.py new file mode 100644 index 0000000..a51be06 --- /dev/null +++ b/OpenSky Bot testing.py @@ -0,0 +1,141 @@ +#Import Modules +from opensky_api import OpenSkyApi +from geopy.geocoders import Nominatim +import json +import time +from colorama import Fore, Back, Style +#Various imports for output +from pushbullet import Pushbullet +pb = Pushbullet("***REMOVED***") + +geolocator = Nominatim(user_agent="OpenSkyBot", timeout=5) +api = OpenSkyApi("", "") + +#Set Plane ICAO +TRACK_PLANE = 'a4c79b' + +#Pre Set Variables +geo_altitude = None +feeding = None +last_feeding = None +#Begin Looping program +while True: +#Preset reseting variables + invalid_Location = None + longitude = None + latitude = None +#Get API States for Plane + planeData = api.get_states(icao24=TRACK_PLANE) + print (Fore.YELLOW) + print ("OpenSky Debug", planeData) + print(Style.RESET_ALL) + +#Pull Variables from planeData + if (planeData != None): + for dataStates in planeData.states: + longitude = (dataStates.longitude) + latitude = (dataStates.latitude) + on_ground = (dataStates.on_ground) + geo_altitude = (dataStates.geo_altitude) + + print (Fore.BLUE) + print ("On Ground: ", on_ground) + print ("Latitude: ", latitude) + print ("Longitude: ", longitude) + print ("GEO Alitude: ", geo_altitude) + + + #Lookup Location of coordinates + if not((longitude == None) and (latitude == None)): + + combined = f"{latitude}, {longitude}" + location = geolocator.reverse(combined) + print (Fore.YELLOW) + print ("Geopy debug: ", location.raw) + print(Style.RESET_ALL) + feeding = True + else: + print (Fore.RED + 'Not Feeding Location') + feeding = False + print(Style.RESET_ALL) + print ("Feeding: ", feeding) + #Figure if valid location, valid being geopy finds a location + if feeding: + try: + geoError = location.raw['error'] + except KeyError: + invalid_Location = False + geoError = None + else: + invalid_Location = True + + + + if invalid_Location: + print (Fore.RED) + print ("Invalid Location: ", invalid_Location) + print (geoError) + print ("Likely Over Water or Invalid Location") + print(Style.RESET_ALL) + + + #Convert Full address to sep variables + elif feeding: + address = location.raw['address'] + country = address.get('country', '') + state = address.get('state', '') + county = address.get('county', '') + city = address.get('city', '') + + + print (Fore.YELLOW) + print ("Address Fields debug: ", address) + print(Style.RESET_ALL) + print (Fore.GREEN) + print("Entire Address: ", location.address) + print () + print ("Country: ", country) + print ("State: ", state) + print ("City: ", city) + print ("County: ", county) + print(Style.RESET_ALL) + + + + #Check if tookoff + tookoff = bool(last_feeding is False and feeding and on_ground is False and invalid_Location is False and geo_altitude < 10000) + print ("Tookoff Just Now:", tookoff) + + #Check if Landed + landed = bool((last_feeding and feeding is False and invalid_Location is False and last_geo_altitude < 10000) or (on_ground and last_on_ground is False)) + print ("Landed Just Now:", landed) + + + + + + + #Takeoff Notifcation and Landed + if tookoff: + tookoff_message = ("Just took off from" + " " + city + ", " + state + ", " + country) + print (tookoff_message) + push = pb.push_note("Elon's Jet", tookoff_message) + + + if landed: + landed_message = ("Landed just now at" + " " + city + ", " + state + ", " + country) + print (landed_message) + push = pb.push_note("Elon's Jet", landed_message) + + + last_feeding = feeding + last_geo_altitude = geo_altitude + last_on_ground = on_ground + else: + print ("Rechecking OpenSky") + planeDataMSG = str(planeData) + push = pb.push_note("Rechecking OpenSky, OpenSky Debug->", planeDataMSG) + + print (Back.MAGENTA, "--------------------------------------------------------------------") + print(Style.RESET_ALL) + time.sleep(15) \ No newline at end of file From b9d2254162119cd77090ceb59ac01adb85063429 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Mon, 8 Jun 2020 13:53:37 -0400 Subject: [PATCH 002/124] Change Name and changes --- OpenSky Bot testing.py => OpenSky Bot.py | 101 +++++++++++------------ 1 file changed, 50 insertions(+), 51 deletions(-) rename OpenSky Bot testing.py => OpenSky Bot.py (59%) diff --git a/OpenSky Bot testing.py b/OpenSky Bot.py similarity index 59% rename from OpenSky Bot testing.py rename to OpenSky Bot.py index a51be06..49c305f 100644 --- a/OpenSky Bot testing.py +++ b/OpenSky Bot.py @@ -6,24 +6,28 @@ import time from colorama import Fore, Back, Style #Various imports for output from pushbullet import Pushbullet -pb = Pushbullet("***REMOVED***") +pb = Pushbullet("") geolocator = Nominatim(user_agent="OpenSkyBot", timeout=5) api = OpenSkyApi("", "") #Set Plane ICAO -TRACK_PLANE = 'a4c79b' +TRACK_PLANE = 'A833535AF' #Pre Set Variables geo_altitude = None feeding = None last_feeding = None +last_on_ground = None +on_ground = None +invalid_Location = None +longitude = None +latitude = None +running_Count = 0 #Begin Looping program while True: -#Preset reseting variables - invalid_Location = None - longitude = None - latitude = None + running_Count += 1 + print (Back.MAGENTA, "--------", running_Count, "-------------------------------------------------------------", Style.RESET_ALL) #Get API States for Plane planeData = api.get_states(icao24=TRACK_PLANE) print (Fore.YELLOW) @@ -31,7 +35,7 @@ while True: print(Style.RESET_ALL) #Pull Variables from planeData - if (planeData != None): + if planeData != None: for dataStates in planeData.states: longitude = (dataStates.longitude) latitude = (dataStates.latitude) @@ -46,7 +50,7 @@ while True: #Lookup Location of coordinates - if not((longitude == None) and (latitude == None)): + if longitude != None and latitude != None: combined = f"{latitude}, {longitude}" location = geolocator.reverse(combined) @@ -55,10 +59,10 @@ while True: print(Style.RESET_ALL) feeding = True else: - print (Fore.RED + 'Not Feeding Location') + print (Fore.RED + 'Not Feeding') feeding = False print(Style.RESET_ALL) - print ("Feeding: ", feeding) + #Figure if valid location, valid being geopy finds a location if feeding: try: @@ -68,74 +72,69 @@ while True: geoError = None else: invalid_Location = True - - - - if invalid_Location: - print (Fore.RED) + print ("Invalid Location: ", invalid_Location) - print (geoError) - print ("Likely Over Water or Invalid Location") - print(Style.RESET_ALL) + + if invalid_Location: + print (Fore.RED) + print (geoError) + print ("Likely Over Water or Invalid Location") + print(Style.RESET_ALL) - #Convert Full address to sep variables - elif feeding: - address = location.raw['address'] - country = address.get('country', '') - state = address.get('state', '') - county = address.get('county', '') - city = address.get('city', '') - - - print (Fore.YELLOW) - print ("Address Fields debug: ", address) - print(Style.RESET_ALL) - print (Fore.GREEN) - print("Entire Address: ", location.address) - print () - print ("Country: ", country) - print ("State: ", state) - print ("City: ", city) - print ("County: ", county) - print(Style.RESET_ALL) + #Convert Full address to sep variables only if Valid Location + elif invalid_location is False: + address = location.raw['address'] + country = address.get('country', '') + state = address.get('state', '') + county = address.get('county', '') + city = address.get('city', '') + + + # print (Fore.YELLOW) + # print ("Address Fields debug: ", address) + # print(Style.RESET_ALL) + print (Fore.GREEN) + print("Entire Address: ", location.address) + print () + print ("Country: ", country) + print ("State: ", state) + print ("City: ", city) + print ("County: ", county) + print(Style.RESET_ALL) - #Check if tookoff +#Check if tookoff tookoff = bool(last_feeding is False and feeding and on_ground is False and invalid_Location is False and geo_altitude < 10000) print ("Tookoff Just Now:", tookoff) - #Check if Landed +#Check if Landed landed = bool((last_feeding and feeding is False and invalid_Location is False and last_geo_altitude < 10000) or (on_ground and last_on_ground is False)) print ("Landed Just Now:", landed) - - - - #Takeoff Notifcation and Landed if tookoff: - tookoff_message = ("Just took off from" + " " + city + ", " + state + ", " + country) + tookoff_message = ("Just took off from" + " " + (city or county) + ", " + state + ", " + country) print (tookoff_message) push = pb.push_note("Elon's Jet", tookoff_message) - if landed: - landed_message = ("Landed just now at" + " " + city + ", " + state + ", " + country) + landed_message = ("Landed just now at" + " " + (city or county) + ", " + state + ", " + country) print (landed_message) push = pb.push_note("Elon's Jet", landed_message) - +#Set Variables to compare to next check last_feeding = feeding last_geo_altitude = geo_altitude last_on_ground = on_ground + else: print ("Rechecking OpenSky") planeDataMSG = str(planeData) push = pb.push_note("Rechecking OpenSky, OpenSky Debug->", planeDataMSG) - print (Back.MAGENTA, "--------------------------------------------------------------------") - print(Style.RESET_ALL) - time.sleep(15) \ No newline at end of file + print (Back.MAGENTA, "--------", running_Count, "-------------------------------------------------------------", Style.RESET_ALL) + print ("") + time.sleep(15) From 9a6321489d4775a6fa5585c904bfebce66df58cb Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Wed, 24 Jun 2020 12:32:39 -0400 Subject: [PATCH 003/124] Starting to Make Readme --- README.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..2db9745 --- /dev/null +++ b/README.md @@ -0,0 +1,24 @@ +# plane-notify +Python to Notify If a Selected Plane has taken off or landed + +Required PIP packages +OpenSky API https://github.com/openskynetwork/opensky-api +geopy https://github.com/geopy/geopy +colorama https://github.com/tartley/colorama + +##Install OpenSky API +```bash +apt install git +git clone https://github.com/openskynetwork/opensky-api.git +pip install -e ~/opensky-api/python +``` +##Install Colorama and geopy +```bash +pip install colorama +pip install geopy +``` +##Install Pushbullet and Tweepy optional output methods already implemented in code +```bash +pip install tweepy +pip install pip pushbullet.py +``` From 30fb93f4690b4366779356b12b44f2845e509db3 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Wed, 24 Jun 2020 12:50:56 -0400 Subject: [PATCH 004/124] Update README.md --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 2db9745..4c41c95 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,24 @@ # plane-notify -Python to Notify If a Selected Plane has taken off or landed +Still WIP Should not use yet. Notify If a Selected Plane has taken off or landed using Python with OpenSky API, outputs location of takeoff location of landing and takeoff by revese lookup of cordinates. -Required PIP packages -OpenSky API https://github.com/openskynetwork/opensky-api -geopy https://github.com/geopy/geopy -colorama https://github.com/tartley/colorama +## Required PIP packages +- OpenSky API https://github.com/openskynetwork/opensky-api +- geopy https://github.com/geopy/geopy +- colorama https://github.com/tartley/colorama -##Install OpenSky API +### Install OpenSky API ```bash apt install git git clone https://github.com/openskynetwork/opensky-api.git pip install -e ~/opensky-api/python ``` -##Install Colorama and geopy +### Install Colorama and geopy ```bash pip install colorama pip install geopy ``` -##Install Pushbullet and Tweepy optional output methods already implemented in code +### Install Pushbullet and Tweepy optional output methods already implemented in code ```bash pip install tweepy -pip install pip pushbullet.py +pip install pushbullet.py ``` From 33cdbf8c5e4d492b321707afb5afb1d528b3577a Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 27 Jun 2020 18:09:55 -0400 Subject: [PATCH 005/124] Backing up old changesfrom PC- 1 --- OpenSky Bot.py | 50 ++++++++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/OpenSky Bot.py b/OpenSky Bot.py index 49c305f..15413c8 100644 --- a/OpenSky Bot.py +++ b/OpenSky Bot.py @@ -6,16 +6,16 @@ import time from colorama import Fore, Back, Style #Various imports for output from pushbullet import Pushbullet -pb = Pushbullet("") +pb = Pushbullet("***************") -geolocator = Nominatim(user_agent="OpenSkyBot", timeout=5) -api = OpenSkyApi("", "") +geolocator = Nominatim(user_agent="************", timeout=5) +api = OpenSkyApi(*********) #Set Plane ICAO -TRACK_PLANE = 'A833535AF' - +TRACK_PLANE = 'A095B4' #Pre Set Variables geo_altitude = None +geo_alt_ft = None feeding = None last_feeding = None last_on_ground = None @@ -29,7 +29,7 @@ while True: running_Count += 1 print (Back.MAGENTA, "--------", running_Count, "-------------------------------------------------------------", Style.RESET_ALL) #Get API States for Plane - planeData = api.get_states(icao24=TRACK_PLANE) + planeData = api.get_states(icao24=TRACK_PLANE.lower()) print (Fore.YELLOW) print ("OpenSky Debug", planeData) print(Style.RESET_ALL) @@ -39,16 +39,18 @@ while True: for dataStates in planeData.states: longitude = (dataStates.longitude) latitude = (dataStates.latitude) - on_ground = (dataStates.on_ground) - geo_altitude = (dataStates.geo_altitude) - - print (Fore.BLUE) - print ("On Ground: ", on_ground) - print ("Latitude: ", latitude) - print ("Longitude: ", longitude) - print ("GEO Alitude: ", geo_altitude) - - + on_ground = (dataStates.on_ground) + geo_alt_m = (dataStates.geo_altitude) + print (Fore.CYAN) + print ("On Ground: ", on_ground) + print ("Latitude: ", latitude) + print ("Longitude: ", longitude) + print ("GEO Alitude: ", geo_alt_ft) + + if geo_alt_m is None: + geo_alt_ft = 0 + else: + geo_alt_ft = geo_alt_m * 3.281 #Lookup Location of coordinates if longitude != None and latitude != None: @@ -83,7 +85,7 @@ while True: #Convert Full address to sep variables only if Valid Location - elif invalid_location is False: + elif invalid_Location is False: address = location.raw['address'] country = address.get('country', '') state = address.get('state', '') @@ -106,11 +108,11 @@ while True: #Check if tookoff - tookoff = bool(last_feeding is False and feeding and on_ground is False and invalid_Location is False and geo_altitude < 10000) + tookoff = bool(last_feeding is False and feeding and on_ground is False and invalid_Location is False and geo_alt_ft < 10000) print ("Tookoff Just Now:", tookoff) #Check if Landed - landed = bool((last_feeding and feeding is False and invalid_Location is False and last_geo_altitude < 10000) or (on_ground and last_on_ground is False)) + landed = bool((last_feeding and feeding is False and invalid_Location is False and (on_ground or last_geo_alt_ft < 10000)) or (on_ground and last_on_ground is False)) print ("Landed Just Now:", landed) @@ -118,16 +120,18 @@ while True: if tookoff: tookoff_message = ("Just took off from" + " " + (city or county) + ", " + state + ", " + country) print (tookoff_message) - push = pb.push_note("Elon's Jet", tookoff_message) + push = pb.push_note("title", tookoff_message) if landed: landed_message = ("Landed just now at" + " " + (city or county) + ", " + state + ", " + country) print (landed_message) - push = pb.push_note("Elon's Jet", landed_message) + push = pb.push_note("title", landed_message) + from playsound import playsound + playsound('callouts.mp3') #Set Variables to compare to next check last_feeding = feeding - last_geo_altitude = geo_altitude + last_geo_alt_ft = geo_alt_ft last_on_ground = on_ground else: @@ -138,3 +142,5 @@ while True: print (Back.MAGENTA, "--------", running_Count, "-------------------------------------------------------------", Style.RESET_ALL) print ("") time.sleep(15) + + From 5b56a60500a4f30bd6b7c8f8c6ad17c82a5c1d33 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 27 Jun 2020 18:12:43 -0400 Subject: [PATCH 006/124] Backing up old changesfrom PC- 2 --- OpenSky Bot.py | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/OpenSky Bot.py b/OpenSky Bot.py index 15413c8..5066290 100644 --- a/OpenSky Bot.py +++ b/OpenSky Bot.py @@ -6,13 +6,13 @@ import time from colorama import Fore, Back, Style #Various imports for output from pushbullet import Pushbullet -pb = Pushbullet("***************") +pb = Pushbullet("*********************") -geolocator = Nominatim(user_agent="************", timeout=5) -api = OpenSkyApi(*********) +geolocator = Nominatim(user_agent="***********", timeout=5) +api = OpenSkyApi(**********************) #Set Plane ICAO -TRACK_PLANE = 'A095B4' +TRACK_PLANE = 'icao********' #Pre Set Variables geo_altitude = None geo_alt_ft = None @@ -23,13 +23,21 @@ on_ground = None invalid_Location = None longitude = None latitude = None +geo_alt_m = None running_Count = 0 #Begin Looping program while True: running_Count += 1 print (Back.MAGENTA, "--------", running_Count, "-------------------------------------------------------------", Style.RESET_ALL) +#Reset Variables + geo_alt_ft = None + longitude = None + latitude = None + on_ground = None + geo_alt_m = None #Get API States for Plane - planeData = api.get_states(icao24=TRACK_PLANE.lower()) + planeData = None + planeData = api.get_states(time_secs=0, icao24=TRACK_PLANE.lower()) print (Fore.YELLOW) print ("OpenSky Debug", planeData) print(Style.RESET_ALL) @@ -41,16 +49,19 @@ while True: latitude = (dataStates.latitude) on_ground = (dataStates.on_ground) geo_alt_m = (dataStates.geo_altitude) + callsign = (datStates.callsign) + icao = (dataStates.icao24) + if geo_alt_m == None and on_ground: + geo_alt_ft = 0 + elif type(geo_alt_m) is float: + geo_alt_ft = geo_alt_m * 3.281 print (Fore.CYAN) + print ("ICAO24: ", icao) + print ("Callsign: ", callsign) print ("On Ground: ", on_ground) print ("Latitude: ", latitude) print ("Longitude: ", longitude) print ("GEO Alitude: ", geo_alt_ft) - - if geo_alt_m is None: - geo_alt_ft = 0 - else: - geo_alt_ft = geo_alt_m * 3.281 #Lookup Location of coordinates if longitude != None and latitude != None: @@ -126,8 +137,7 @@ while True: landed_message = ("Landed just now at" + " " + (city or county) + ", " + state + ", " + country) print (landed_message) push = pb.push_note("title", landed_message) - from playsound import playsound - playsound('callouts.mp3') + #Set Variables to compare to next check last_feeding = feeding @@ -137,10 +147,10 @@ while True: else: print ("Rechecking OpenSky") planeDataMSG = str(planeData) - push = pb.push_note("Rechecking OpenSky, OpenSky Debug->", planeDataMSG) +# push = pb.push_note("Rechecking OpenSky, OpenSky Debug->", planeDataMSG) print (Back.MAGENTA, "--------", running_Count, "-------------------------------------------------------------", Style.RESET_ALL) print ("") - time.sleep(15) + time.sleep(25) From 5d03bc71cd68a07649257150b20d3d58b0068ae5 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 27 Jun 2020 18:14:33 -0400 Subject: [PATCH 007/124] Backing up old changesfrom PC- 3 --- OpenSky Bot.py | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/OpenSky Bot.py b/OpenSky Bot.py index 5066290..54f6037 100644 --- a/OpenSky Bot.py +++ b/OpenSky Bot.py @@ -6,13 +6,13 @@ import time from colorama import Fore, Back, Style #Various imports for output from pushbullet import Pushbullet -pb = Pushbullet("*********************") +pb = Pushbullet("*") -geolocator = Nominatim(user_agent="***********", timeout=5) -api = OpenSkyApi(**********************) +geolocator = Nominatim(user_agent="*", timeout=5) +api = OpenSkyApi("*", "*") #Set Plane ICAO -TRACK_PLANE = 'icao********' +TRACK_PLANE = '*' #Pre Set Variables geo_altitude = None geo_alt_ft = None @@ -24,6 +24,8 @@ invalid_Location = None longitude = None latitude = None geo_alt_m = None +icao = None +callsign = None running_Count = 0 #Begin Looping program while True: @@ -45,23 +47,23 @@ while True: #Pull Variables from planeData if planeData != None: for dataStates in planeData.states: + icao = (dataStates.icao24) + callsign = (dataStates.callsign) longitude = (dataStates.longitude) latitude = (dataStates.latitude) on_ground = (dataStates.on_ground) geo_alt_m = (dataStates.geo_altitude) - callsign = (datStates.callsign) - icao = (dataStates.icao24) if geo_alt_m == None and on_ground: geo_alt_ft = 0 elif type(geo_alt_m) is float: geo_alt_ft = geo_alt_m * 3.281 - print (Fore.CYAN) - print ("ICAO24: ", icao) - print ("Callsign: ", callsign) - print ("On Ground: ", on_ground) - print ("Latitude: ", latitude) - print ("Longitude: ", longitude) - print ("GEO Alitude: ", geo_alt_ft) + print (Fore.CYAN) + print ("ICAO: ", icao) + print ("Callsign: ", callsign) + print ("On Ground: ", on_ground) + print ("Latitude: ", latitude) + print ("Longitude: ", longitude) + print ("GEO Alitude: ", geo_alt_ft) #Lookup Location of coordinates if longitude != None and latitude != None: @@ -147,10 +149,10 @@ while True: else: print ("Rechecking OpenSky") planeDataMSG = str(planeData) -# push = pb.push_note("Rechecking OpenSky, OpenSky Debug->", planeDataMSG) + push = pb.push_note("Rechecking OpenSky, OpenSky Debug->", planeDataMSG) print (Back.MAGENTA, "--------", running_Count, "-------------------------------------------------------------", Style.RESET_ALL) print ("") - time.sleep(25) + time.sleep(15) From 5125e7a3c5c2dc1bf20315fd7ef7402b10a33f43 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 27 Jun 2020 18:17:58 -0400 Subject: [PATCH 008/124] Backing up old changes from PC- 4 --- OpenSky Bot.py | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/OpenSky Bot.py b/OpenSky Bot.py index 54f6037..335c7ab 100644 --- a/OpenSky Bot.py +++ b/OpenSky Bot.py @@ -1,21 +1,27 @@ #Import Modules -from opensky_api import OpenSkyApi +#Setup Geopy from geopy.geocoders import Nominatim +geolocator = Nominatim(user_agent="*", timeout=5) + import json import time from colorama import Fore, Back, Style -#Various imports for output + +#Setup PushBullet from pushbullet import Pushbullet pb = Pushbullet("*") +elon_jet_channel = pb.get_channel('') -geolocator = Nominatim(user_agent="*", timeout=5) -api = OpenSkyApi("*", "*") +#Setup OpenSKy +from opensky_api import OpenSkyApi +opens_api = OpenSkyApi("*", "*") #Set Plane ICAO TRACK_PLANE = '*' #Pre Set Variables geo_altitude = None geo_alt_ft = None +last_geo_alt_ft = None feeding = None last_feeding = None last_on_ground = None @@ -24,9 +30,9 @@ invalid_Location = None longitude = None latitude = None geo_alt_m = None +running_Count = 0 icao = None callsign = None -running_Count = 0 #Begin Looping program while True: running_Count += 1 @@ -39,7 +45,7 @@ while True: geo_alt_m = None #Get API States for Plane planeData = None - planeData = api.get_states(time_secs=0, icao24=TRACK_PLANE.lower()) + planeData = opens_api.get_states(time_secs=0, icao24=TRACK_PLANE.lower()) print (Fore.YELLOW) print ("OpenSky Debug", planeData) print(Style.RESET_ALL) @@ -53,7 +59,7 @@ while True: latitude = (dataStates.latitude) on_ground = (dataStates.on_ground) geo_alt_m = (dataStates.geo_altitude) - if geo_alt_m == None and on_ground: + if geo_alt_m == None: geo_alt_ft = 0 elif type(geo_alt_m) is float: geo_alt_ft = geo_alt_m * 3.281 @@ -133,12 +139,13 @@ while True: if tookoff: tookoff_message = ("Just took off from" + " " + (city or county) + ", " + state + ", " + country) print (tookoff_message) - push = pb.push_note("title", tookoff_message) + push = elon_jet_channel.push_note("*", tookoff_message) if landed: landed_message = ("Landed just now at" + " " + (city or county) + ", " + state + ", " + country) print (landed_message) - push = pb.push_note("title", landed_message) + push = elon_jet_channel.push_note("*", landed_message) + #Set Variables to compare to next check @@ -149,7 +156,7 @@ while True: else: print ("Rechecking OpenSky") planeDataMSG = str(planeData) - push = pb.push_note("Rechecking OpenSky, OpenSky Debug->", planeDataMSG) + print (Back.MAGENTA, "--------", running_Count, "-------------------------------------------------------------", Style.RESET_ALL) print ("") From d68b85cd0a3bb62f7a2afbff3891284e79272023 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 27 Jun 2020 18:20:11 -0400 Subject: [PATCH 009/124] Backing up old changesfrom PC- 5 --- OpenSky Bot.py | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/OpenSky Bot.py b/OpenSky Bot.py index 335c7ab..9089071 100644 --- a/OpenSky Bot.py +++ b/OpenSky Bot.py @@ -10,18 +10,20 @@ from colorama import Fore, Back, Style #Setup PushBullet from pushbullet import Pushbullet pb = Pushbullet("*") -elon_jet_channel = pb.get_channel('') +elon_jet_channel = pb.get_channel('') #Setup OpenSKy from opensky_api import OpenSkyApi opens_api = OpenSkyApi("*", "*") #Set Plane ICAO -TRACK_PLANE = '*' +TRACK_PLANE = 'A5B1A8' #Pre Set Variables geo_altitude = None geo_alt_ft = None last_geo_alt_ft = None +last_below_10k_ft = None +below_10k_ft = None feeding = None last_feeding = None last_on_ground = None @@ -59,9 +61,9 @@ while True: latitude = (dataStates.latitude) on_ground = (dataStates.on_ground) geo_alt_m = (dataStates.geo_altitude) - if geo_alt_m == None: + if geo_alt_m == None and on_ground: geo_alt_ft = 0 - elif type(geo_alt_m) is float: + elif geo_alt_m != None : geo_alt_ft = geo_alt_m * 3.281 print (Fore.CYAN) print ("ICAO: ", icao) @@ -69,7 +71,7 @@ while True: print ("On Ground: ", on_ground) print ("Latitude: ", latitude) print ("Longitude: ", longitude) - print ("GEO Alitude: ", geo_alt_ft) + print ("GEO Alitude Ft: ", geo_alt_ft) #Lookup Location of coordinates if longitude != None and latitude != None: @@ -124,14 +126,17 @@ while True: print ("County: ", county) print(Style.RESET_ALL) - - +#Check if below 10k ft + if geo_alt_ft is None: + below_10k_ft = False + elif geo_alt_ft < 10000: + below_10k_ft = True #Check if tookoff - tookoff = bool(last_feeding is False and feeding and on_ground is False and invalid_Location is False and geo_alt_ft < 10000) + tookoff = bool(last_feeding is False and feeding and on_ground is False and invalid_Location is False and below_10k_ft) print ("Tookoff Just Now:", tookoff) #Check if Landed - landed = bool((last_feeding and feeding is False and invalid_Location is False and (on_ground or last_geo_alt_ft < 10000)) or (on_ground and last_on_ground is False)) + landed = bool((last_feeding and feeding is False and invalid_Location is False and (on_ground or last_below_10k_ft)) or (on_ground and last_on_ground is False)) print ("Landed Just Now:", landed) @@ -152,6 +157,7 @@ while True: last_feeding = feeding last_geo_alt_ft = geo_alt_ft last_on_ground = on_ground + last_below_10k_ft = below_10k_ft else: print ("Rechecking OpenSky") From 23a011fa2d9fe8ce345d2ecf9941df8ccb1012a8 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 27 Jun 2020 18:22:11 -0400 Subject: [PATCH 010/124] Backing up old changesfrom PC- 6 --- OpenSky Bot.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/OpenSky Bot.py b/OpenSky Bot.py index 9089071..27ebdec 100644 --- a/OpenSky Bot.py +++ b/OpenSky Bot.py @@ -10,14 +10,14 @@ from colorama import Fore, Back, Style #Setup PushBullet from pushbullet import Pushbullet pb = Pushbullet("*") -elon_jet_channel = pb.get_channel('') +elon_jet_channel = pb.get_channel('') #Setup OpenSKy from opensky_api import OpenSkyApi opens_api = OpenSkyApi("*", "*") #Set Plane ICAO -TRACK_PLANE = 'A5B1A8' +TRACK_PLANE = '' #Pre Set Variables geo_altitude = None geo_alt_ft = None @@ -61,9 +61,7 @@ while True: latitude = (dataStates.latitude) on_ground = (dataStates.on_ground) geo_alt_m = (dataStates.geo_altitude) - if geo_alt_m == None and on_ground: - geo_alt_ft = 0 - elif geo_alt_m != None : + if geo_alt_m != None : geo_alt_ft = geo_alt_m * 3.281 print (Fore.CYAN) print ("ICAO: ", icao) @@ -112,6 +110,8 @@ while True: state = address.get('state', '') county = address.get('county', '') city = address.get('city', '') + town = address.get('town', '') + hamlet = address.get('hamlet', '') # print (Fore.YELLOW) @@ -123,6 +123,8 @@ while True: print ("Country: ", country) print ("State: ", state) print ("City: ", city) + print ("Town: ", town) + print ("Hamlet: ", hamlet) print ("County: ", county) print(Style.RESET_ALL) @@ -144,12 +146,12 @@ while True: if tookoff: tookoff_message = ("Just took off from" + " " + (city or county) + ", " + state + ", " + country) print (tookoff_message) - push = elon_jet_channel.push_note("*", tookoff_message) + push = elon_jet_channel.push_note("title", tookoff_message) if landed: landed_message = ("Landed just now at" + " " + (city or county) + ", " + state + ", " + country) print (landed_message) - push = elon_jet_channel.push_note("*", landed_message) + push = elon_jet_channel.push_note("title", landed_message) From fdb9df4bec36145a6eccffd39ea84481465a37e6 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 27 Jun 2020 18:24:57 -0400 Subject: [PATCH 011/124] Backing up old changesfrom PC- 7 --- OpenSky Bot.py | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/OpenSky Bot.py b/OpenSky Bot.py index 27ebdec..02b0915 100644 --- a/OpenSky Bot.py +++ b/OpenSky Bot.py @@ -9,12 +9,12 @@ from colorama import Fore, Back, Style #Setup PushBullet from pushbullet import Pushbullet -pb = Pushbullet("*") +pb = Pushbullet("") elon_jet_channel = pb.get_channel('') #Setup OpenSKy from opensky_api import OpenSkyApi -opens_api = OpenSkyApi("*", "*") +opens_api = OpenSkyApi("", "") #Set Plane ICAO TRACK_PLANE = '' @@ -22,8 +22,8 @@ TRACK_PLANE = '' geo_altitude = None geo_alt_ft = None last_geo_alt_ft = None -last_below_10k_ft = None -below_10k_ft = None +last_below_5k_ft = None + feeding = None last_feeding = None last_on_ground = None @@ -35,11 +35,13 @@ geo_alt_m = None running_Count = 0 icao = None callsign = None +takeoff_time = None #Begin Looping program while True: running_Count += 1 print (Back.MAGENTA, "--------", running_Count, "-------------------------------------------------------------", Style.RESET_ALL) #Reset Variables + below_5k_ft = None geo_alt_ft = None longitude = None latitude = None @@ -61,8 +63,10 @@ while True: latitude = (dataStates.latitude) on_ground = (dataStates.on_ground) geo_alt_m = (dataStates.geo_altitude) - if geo_alt_m != None : + if geo_alt_m != None: geo_alt_ft = geo_alt_m * 3.281 + elif geo_alt_m == None and on_ground: + geo_alt_ft = 0 print (Fore.CYAN) print ("ICAO: ", icao) print ("Callsign: ", callsign) @@ -130,15 +134,15 @@ while True: #Check if below 10k ft if geo_alt_ft is None: - below_10k_ft = False - elif geo_alt_ft < 10000: - below_10k_ft = True + below_5k_ft = False + elif geo_alt_ft < 5000: + below_5k_ft = True #Check if tookoff - tookoff = bool(last_feeding is False and feeding and on_ground is False and invalid_Location is False and below_10k_ft) + tookoff = bool(invalid_Location is False and below_5k_ft and on_ground is False and ((last_feeding is False and feeding) or (last_on_ground))) print ("Tookoff Just Now:", tookoff) #Check if Landed - landed = bool((last_feeding and feeding is False and invalid_Location is False and (on_ground or last_below_10k_ft)) or (on_ground and last_on_ground is False)) + landed = bool(last_below_5k_ft and invalid_Location is False and ((last_feeding and feeding is False) or (on_ground and last_on_ground is False))) print ("Landed Just Now:", landed) @@ -159,7 +163,7 @@ while True: last_feeding = feeding last_geo_alt_ft = geo_alt_ft last_on_ground = on_ground - last_below_10k_ft = below_10k_ft + last_below_5k_ft = below_5k_ft else: print ("Rechecking OpenSky") From cf1c3524893fdd9ba3b0512647150f927b90489f Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 27 Jun 2020 18:28:59 -0400 Subject: [PATCH 012/124] Backing up old changes from PC- 8 --- OpenSky Bot.py | 61 ++++++++++++++++++++++++++++++------------------- OpenSkySetup.py | 5 ++++ 2 files changed, 42 insertions(+), 24 deletions(-) create mode 100644 OpenSkySetup.py diff --git a/OpenSky Bot.py b/OpenSky Bot.py index 02b0915..c730d7a 100644 --- a/OpenSky Bot.py +++ b/OpenSky Bot.py @@ -6,24 +6,21 @@ geolocator = Nominatim(user_agent="*", timeout=5) import json import time from colorama import Fore, Back, Style +import datetime +from OpenSkySetup import pullplane #Setup PushBullet from pushbullet import Pushbullet pb = Pushbullet("") elon_jet_channel = pb.get_channel('') -#Setup OpenSKy -from opensky_api import OpenSkyApi -opens_api = OpenSkyApi("", "") - #Set Plane ICAO TRACK_PLANE = '' #Pre Set Variables geo_altitude = None geo_alt_ft = None last_geo_alt_ft = None -last_below_5k_ft = None - +last_below_desired_ft = None feeding = None last_feeding = None last_on_ground = None @@ -39,9 +36,10 @@ takeoff_time = None #Begin Looping program while True: running_Count += 1 + start_time = time.time() print (Back.MAGENTA, "--------", running_Count, "-------------------------------------------------------------", Style.RESET_ALL) #Reset Variables - below_5k_ft = None + below_desired_ft = None geo_alt_ft = None longitude = None latitude = None @@ -49,7 +47,7 @@ while True: geo_alt_m = None #Get API States for Plane planeData = None - planeData = opens_api.get_states(time_secs=0, icao24=TRACK_PLANE.lower()) + planeData = pullplane(TRACK_PLANE) print (Fore.YELLOW) print ("OpenSky Debug", planeData) print(Style.RESET_ALL) @@ -74,6 +72,7 @@ while True: print ("Latitude: ", latitude) print ("Longitude: ", longitude) print ("GEO Alitude Ft: ", geo_alt_ft) + #Lookup Location of coordinates if longitude != None and latitude != None: @@ -111,6 +110,7 @@ while True: elif invalid_Location is False: address = location.raw['address'] country = address.get('country', '') + country_code = address.get('country_code', '').upper() state = address.get('state', '') county = address.get('county', '') city = address.get('city', '') @@ -123,7 +123,7 @@ while True: # print(Style.RESET_ALL) print (Fore.GREEN) print("Entire Address: ", location.address) - print () + print ("Country Code: ", country_code) print ("Country: ", country) print ("State: ", state) print ("City: ", city) @@ -131,46 +131,59 @@ while True: print ("Hamlet: ", hamlet) print ("County: ", county) print(Style.RESET_ALL) - -#Check if below 10k ft + +#Check if below desire ft if geo_alt_ft is None: - below_5k_ft = False - elif geo_alt_ft < 5000: - below_5k_ft = True + below_desired_ft = False + elif geo_alt_ft < 10000: + below_desired_ft = True #Check if tookoff - tookoff = bool(invalid_Location is False and below_5k_ft and on_ground is False and ((last_feeding is False and feeding) or (last_on_ground))) + tookoff = bool(invalid_Location is False and below_desired_ft and on_ground is False and ((last_feeding is False and feeding) or (last_on_ground))) print ("Tookoff Just Now:", tookoff) - -#Check if Landed - landed = bool(last_below_5k_ft and invalid_Location is False and ((last_feeding and feeding is False) or (on_ground and last_on_ground is False))) - print ("Landed Just Now:", landed) +#Check if Landed + landed = bool(last_below_desired_ft and invalid_Location is False and ((last_feeding and feeding is False and last_on_ground is False) or (on_ground and last_on_ground is False))) + print ("Landed Just Now:", landed) + + #Chose city town county or hamlet for location as not all are always avalible. + if feeding and invalid_Location is False: + aera_hierarchy = city or town or county or hamlet #Takeoff Notifcation and Landed if tookoff: - tookoff_message = ("Just took off from" + " " + (city or county) + ", " + state + ", " + country) + tookoff_message = ("Just took off from" + " " + aera_hierarchy + ", " + state + ", " + country_code) print (tookoff_message) push = elon_jet_channel.push_note("title", tookoff_message) + takeoff_time = time.time() + + if landed: - landed_message = ("Landed just now at" + " " + (city or county) + ", " + state + ", " + country) + landed_message = ("Landed just now in" + " " + aera_hierarchy + ", " + state + ", " + country_code) print (landed_message) push = elon_jet_channel.push_note("title", landed_message) + takeoff_time = None - #Set Variables to compare to next check last_feeding = feeding last_geo_alt_ft = geo_alt_ft last_on_ground = on_ground - last_below_5k_ft = below_5k_ft + last_below_desired_ft = below_desired_ft else: print ("Rechecking OpenSky") planeDataMSG = str(planeData) + if takeoff_time != None: + elapsed_time = time.time() - takeoff_time + timesince = time.strftime("Time Since Take off %H Hours : %M Mins : %S Secs", time.gmtime(elapsed_time)) + print(timesince) - print (Back.MAGENTA, "--------", running_Count, "-------------------------------------------------------------", Style.RESET_ALL) + + elapsed_calc_time = time.time() - start_time + + print (Back.MAGENTA, "--------", running_Count, "------------------------Elapsed Time- ", elapsed_calc_time, "-------------------------------------", Style.RESET_ALL) print ("") time.sleep(15) diff --git a/OpenSkySetup.py b/OpenSkySetup.py new file mode 100644 index 0000000..62d9cff --- /dev/null +++ b/OpenSkySetup.py @@ -0,0 +1,5 @@ +def pullplane(TRACK_PLANE): + from opensky_api import OpenSkyApi + opens_api = OpenSkyApi("", "") + planeData = opens_api.get_states(time_secs=0, icao24=TRACK_PLANE.lower()) + return planeData \ No newline at end of file From f9a36ca1e59c0c6069ac04f79bc727f9c684eabe Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 27 Jun 2020 18:33:27 -0400 Subject: [PATCH 013/124] Backing up old changes from PC- 9 --- OpenSky Bot.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/OpenSky Bot.py b/OpenSky Bot.py index c730d7a..1ff8b40 100644 --- a/OpenSky Bot.py +++ b/OpenSky Bot.py @@ -11,7 +11,7 @@ from OpenSkySetup import pullplane #Setup PushBullet from pushbullet import Pushbullet -pb = Pushbullet("") +pb = Pushbullet("') #Set Plane ICAO @@ -47,7 +47,10 @@ while True: geo_alt_m = None #Get API States for Plane planeData = None - planeData = pullplane(TRACK_PLANE) + try: + planeData = pullplane(TRACK_PLANE) + except: + print ("Opensky Error") print (Fore.YELLOW) print ("OpenSky Debug", planeData) print(Style.RESET_ALL) @@ -77,7 +80,10 @@ while True: if longitude != None and latitude != None: combined = f"{latitude}, {longitude}" - location = geolocator.reverse(combined) + try: + location = geolocator.reverse(combined) + except: + print ("Geopy API Error") print (Fore.YELLOW) print ("Geopy debug: ", location.raw) print(Style.RESET_ALL) From 03f8a25bb2906823645a8d71e63c9129c821a952 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 27 Jun 2020 18:46:47 -0400 Subject: [PATCH 014/124] Change defined modules and add tweeting --- OpenSky Bot.py | 9 +++++++-- OpenSkySetup.py => defOpenSky.py | 0 defTweet.py | 9 +++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) rename OpenSkySetup.py => defOpenSky.py (100%) create mode 100644 defTweet.py diff --git a/OpenSky Bot.py b/OpenSky Bot.py index 1ff8b40..7679cd6 100644 --- a/OpenSky Bot.py +++ b/OpenSky Bot.py @@ -7,13 +7,16 @@ import json import time from colorama import Fore, Back, Style import datetime -from OpenSkySetup import pullplane +from defOpenSky import pullplane #Setup PushBullet from pushbullet import Pushbullet -pb = Pushbullet("") elon_jet_channel = pb.get_channel('') +#Setup Tweepy +from defTweet import tweepysetup +tweet_api = tweepysetup() #Set Plane ICAO TRACK_PLANE = '' #Pre Set Variables @@ -160,6 +163,7 @@ while True: tookoff_message = ("Just took off from" + " " + aera_hierarchy + ", " + state + ", " + country_code) print (tookoff_message) push = elon_jet_channel.push_note("title", tookoff_message) + tweet_api.update_status(tookoff_message) takeoff_time = time.time() @@ -168,6 +172,7 @@ while True: landed_message = ("Landed just now in" + " " + aera_hierarchy + ", " + state + ", " + country_code) print (landed_message) push = elon_jet_channel.push_note("title", landed_message) + tweet_api.update_status(landed_message) takeoff_time = None diff --git a/OpenSkySetup.py b/defOpenSky.py similarity index 100% rename from OpenSkySetup.py rename to defOpenSky.py diff --git a/defTweet.py b/defTweet.py new file mode 100644 index 0000000..c4c36c1 --- /dev/null +++ b/defTweet.py @@ -0,0 +1,9 @@ +# Authenticate to Twitter +def tweepysetup(): + #DOCU + #https://realpython.com/twitter-bot-python-tweepy/ + import tweepy + auth = tweepy.OAuthHandler("CONSUMER_KEY", "CONSUMER_SECRET") + auth.set_access_token("ACCESS_TOKEN", "ACCESS_TOKEN_SECRET") + tweet_api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True) + return tweet_api \ No newline at end of file From 5cc9a0b5785e7f7248b917b9978abcaf08189378 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Sat, 27 Jun 2020 18:59:19 -0400 Subject: [PATCH 015/124] Add screen --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 4c41c95..3094390 100644 --- a/README.md +++ b/README.md @@ -22,3 +22,5 @@ pip install geopy pip install tweepy pip install pushbullet.py ``` +### Install Screen to run in background +apt install screen From 44e4b06bccffa1c6a502e71abea5c5aa6c1f50a7 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Sat, 27 Jun 2020 21:30:28 -0400 Subject: [PATCH 016/124] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3094390..0409968 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # plane-notify -Still WIP Should not use yet. Notify If a Selected Plane has taken off or landed using Python with OpenSky API, outputs location of takeoff location of landing and takeoff by revese lookup of cordinates. +Developed so I could auto tweet Elon Musk's jet activity. +Still WIP Should not use yet. Nearing final first version. Notify If a Selected Plane has taken off or landed using Python with OpenSky API, outputs location of takeoff location of landing and takeoff by revese lookup of cordinates. ## Required PIP packages - OpenSky API https://github.com/openskynetwork/opensky-api From 566c5a740fcbdcb98baf7e8e50e109baa2ff1195 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Mon, 6 Jul 2020 21:59:14 -0400 Subject: [PATCH 017/124] Add more info --- README.md | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0409968..96812d9 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,15 @@ # plane-notify -Developed so I could auto tweet Elon Musk's jet activity. -Still WIP Should not use yet. Nearing final first version. Notify If a Selected Plane has taken off or landed using Python with OpenSky API, outputs location of takeoff location of landing and takeoff by revese lookup of cordinates. +Nearing final first version. Notify If a Selected Plane has taken off or landed using Python with OpenSky API, outputs location of takeoff location of landing and takeoff by revese lookup of cordinates. +## How It works +- Takes data about every 15 seconds from OpenSky Network compares it to previous data with whats I've defined as a landing or takeoff event. +- A takeoff event event is the plane is not on ground, below 10k feet and ((previously no data and now getting data) or was previously on ground). +- A landing event is previosly below 10k feet and (previously getting data, no longer getting data and previously not on ground) or (now on ground and previously not on ground). +- Given the coordinates of the aircraft the coordinates are reverse looked up for a location name. (Geopy Nomination Geolocater) +- At time of takeoff a takeoff time is set which is refrenced in landing event to calculate an approximate total flight time. +- Static map image is created based off location name. (Google Static Maps API) +- If the landing event and takeoff events are true creates the output to Twitter and Pushbullet, uses the location name, map image and takeoff time if landing. (Tweepy and Pushbullet ) +a ## Required PIP packages - OpenSky API https://github.com/openskynetwork/opensky-api - geopy https://github.com/geopy/geopy @@ -24,4 +32,36 @@ pip install tweepy pip install pushbullet.py ``` ### Install Screen to run in background +``` apt install screen +``` + +### Make sure Python is installed +``` +apt install python3 +``` +### Download / Clone +``` +git clone https://github.com/Jxck-S/plane-notify.git +cd plane-notify +``` + +### Configure defOpenSky, defTweet and defMap with API keys +- defOpenSky doesn't require an OpenSky API key but bennefits from one. +- defTweet can be disabled if removed from NotifyBot.py or give Twitter API keys to it. +- Pushbullet is setup in main NotifyBot.py +- defMap needs Google Static Map API keys. +- edit them with nano or vi + + +### Enter and create new Screen Session +``` +screen -R +``` + +### Start Program +``` +python3 NotifyBot.py +``` + + From 3e7c244647deddb013c304cd39841285630a852c Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Mon, 6 Jul 2020 22:05:50 -0400 Subject: [PATCH 018/124] Refrences --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 96812d9..7aed365 100644 --- a/README.md +++ b/README.md @@ -64,4 +64,12 @@ screen -R python3 NotifyBot.py ``` +#### Refrences +- https://opensky-network.org/apidoc/ +- https://geopy.readthedocs.io/en/stable/ +- https://www.geeksforgeeks.org/python-get-google-map-image-specified-location-using-google-static-maps-api/ +- https://realpython.com/twitter-bot-python-tweepy/ +- https://github.com/rbrcsk/pushbullet.py + + From 1b627617339565a699eb91509dcadbfc9314f5f7 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Wed, 22 Jul 2020 12:35:45 -0400 Subject: [PATCH 019/124] Add Image Map ability --- OpenSky Bot.py | 36 ++++++++++++++++++++++++++---------- defMap.py | 22 ++++++++++++++++++++++ 2 files changed, 48 insertions(+), 10 deletions(-) create mode 100644 defMap.py diff --git a/OpenSky Bot.py b/OpenSky Bot.py index 7679cd6..ea531c4 100644 --- a/OpenSky Bot.py +++ b/OpenSky Bot.py @@ -1,18 +1,20 @@ +#Github Updated - NotifyBot 8 #Import Modules #Setup Geopy from geopy.geocoders import Nominatim -geolocator = Nominatim(user_agent="*", timeout=5) +geolocator = Nominatim(user_agent="OpenSkyBot", timeout=5) import json import time from colorama import Fore, Back, Style import datetime from defOpenSky import pullplane +from defMap import getMap #Setup PushBullet from pushbullet import Pushbullet pb = Pushbullet("") -elon_jet_channel = pb.get_channel('') +pb_channel = pb.get_channel('') #Setup Tweepy from defTweet import tweepysetup @@ -162,18 +164,32 @@ while True: if tookoff: tookoff_message = ("Just took off from" + " " + aera_hierarchy + ", " + state + ", " + country_code) print (tookoff_message) - push = elon_jet_channel.push_note("title", tookoff_message) - tweet_api.update_status(tookoff_message) + getMap(aera_hierarchy + ", " + state + ", " + country_code) + with open("map.png", "rb") as pic: + map_data = pb.upload_file(pic, "Tookoff") + push = pb_channel.push_note("title", tookoff_message) + push = pb_channel.push_file(**map_data) + tweet_api.update_with_media("map.png", status = tookoff_message) takeoff_time = time.time() - if landed: - landed_message = ("Landed just now in" + " " + aera_hierarchy + ", " + state + ", " + country_code) + if landed: + landed_time_msg = "" + if takeoff_time != None: + landed_time = time.time() - takeoff_time + landed_time_msg = time.strftime("Apx. flt. time %H Hours : %M Mins ", time.gmtime(landed_time)) + landed_message = ("Landed just now in" + " " + aera_hierarchy + ", " + state + ", " + country_code + ". " + landed_time_msg) print (landed_message) - push = elon_jet_channel.push_note("title", landed_message) - tweet_api.update_status(landed_message) + getMap(aera_hierarchy + ", " + state + ", " + country_code) + with open("map.png", "rb") as pic: + map_data = pb.upload_file(pic, "Landed") + push = pb_channel.push_note("title", landed_message) + push = pb_channel.push_file(**map_data) + tweet_api.update_with_media("map.png", status = landed_message) takeoff_time = None + landed_time = None + time_since_tk = None #Set Variables to compare to next check @@ -187,8 +203,8 @@ while True: planeDataMSG = str(planeData) if takeoff_time != None: elapsed_time = time.time() - takeoff_time - timesince = time.strftime("Time Since Take off %H Hours : %M Mins : %S Secs", time.gmtime(elapsed_time)) - print(timesince) + time_since_tk = time.strftime("Time Since Take off %H Hours : %M Mins : %S Secs", time.gmtime(elapsed_time)) + print(time_since_tk) diff --git a/defMap.py b/defMap.py new file mode 100644 index 0000000..f42313e --- /dev/null +++ b/defMap.py @@ -0,0 +1,22 @@ +def getMap(mapLocation): + import requests + api_key = "" + url = "https://maps.googleapis.com/maps/api/staticmap?" + + center = str(mapLocation) + zoom = 9 + + r = requests.get(url + "center=" + center + "&zoom=" + + str(zoom) + "&size=800x800 &key=" + + api_key + "&sensor=false") + + # wb mode is stand for write binary mode + f = open('map.png', 'wb') + + # r.content gives content, + # in this case gives image + f.write(r.content) + + # close method of file object + # save and close the file + f.close() \ No newline at end of file From 45eae0aaf53bcf5dbbf7619783437172d53f2b63 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Wed, 22 Jul 2020 12:47:10 -0400 Subject: [PATCH 020/124] Add TODO --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7aed365..552c9a0 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,9 @@ screen -R ``` python3 NotifyBot.py ``` - +### TODO +implement YAML file for config options +implement airport name, done by closest airport #### Refrences - https://opensky-network.org/apidoc/ - https://geopy.readthedocs.io/en/stable/ From 41ee72932be40ea625c101cd7bb2d6132fad1eee Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Tue, 28 Jul 2020 12:08:15 -0400 Subject: [PATCH 021/124] Why I made --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 552c9a0..336d812 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # plane-notify Nearing final first version. Notify If a Selected Plane has taken off or landed using Python with OpenSky API, outputs location of takeoff location of landing and takeoff by revese lookup of cordinates. +## Why I made it +Made it so I could track Elon Musk's Jet and share with others of his whereabouts follow on twitter @ElonJet https://twitter.com/ElonJet ## How It works - Takes data about every 15 seconds from OpenSky Network compares it to previous data with whats I've defined as a landing or takeoff event. From ef8ecb191100004bf642528e5cac2c67e1e2fea8 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Mon, 3 Aug 2020 09:35:46 -0400 Subject: [PATCH 022/124] Create LICENSE --- LICENSE | 674 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 674 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. From 05dee4bfe617fa465b5ebd64ff69c06027738e44 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Fri, 14 Aug 2020 22:45:30 -0400 Subject: [PATCH 023/124] ICAO upper, tested finding airport name --- OpenSky Bot.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/OpenSky Bot.py b/OpenSky Bot.py index ea531c4..bb3aa14 100644 --- a/OpenSky Bot.py +++ b/OpenSky Bot.py @@ -1,4 +1,4 @@ -#Github Updated - NotifyBot 8 +#Github Updated - NotifyBot 9 #Import Modules #Setup Geopy from geopy.geocoders import Nominatim @@ -21,6 +21,7 @@ from defTweet import tweepysetup tweet_api = tweepysetup() #Set Plane ICAO TRACK_PLANE = '' +icao = TRACK_PLANE.upper() #Pre Set Variables geo_altitude = None geo_alt_ft = None @@ -35,7 +36,6 @@ longitude = None latitude = None geo_alt_m = None running_Count = 0 -icao = None callsign = None takeoff_time = None #Begin Looping program @@ -191,7 +191,6 @@ while True: landed_time = None time_since_tk = None - #Set Variables to compare to next check last_feeding = feeding last_geo_alt_ft = geo_alt_ft From 688f617c87a8e757401f856b2c5d6973d85e6d15 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Fri, 14 Aug 2020 23:37:28 -0400 Subject: [PATCH 024/124] Add config file and screenshot capability --- OpenSky Bot.py | 71 ++++++++++++++++++++++++++++++++++---------------- config.ini | 28 ++++++++++++++++++++ defMap.py | 5 +++- defOpenSky.py | 5 +++- defSS.py | 20 ++++++++++++++ defTweet.py | 9 ++++--- 6 files changed, 110 insertions(+), 28 deletions(-) create mode 100644 config.ini create mode 100644 defSS.py diff --git a/OpenSky Bot.py b/OpenSky Bot.py index bb3aa14..4a77c33 100644 --- a/OpenSky Bot.py +++ b/OpenSky Bot.py @@ -1,6 +1,9 @@ -#Github Updated - NotifyBot 9 +#Github Updated - NotifyBot 10 #Import Modules #Setup Geopy +#Clear Terminal +import os +os.system('cls' if os.name == 'nt' else 'clear') from geopy.geocoders import Nominatim geolocator = Nominatim(user_agent="OpenSkyBot", timeout=5) @@ -10,20 +13,32 @@ from colorama import Fore, Back, Style import datetime from defOpenSky import pullplane from defMap import getMap +#Setup Config File +import configparser +config = configparser.ConfigParser() +config.read('config.ini') #Setup PushBullet -from pushbullet import Pushbullet -pb = Pushbullet("") -pb_channel = pb.get_channel('') +if config.getboolean('PUSHBULLET', 'ENABLE'): + from pushbullet import Pushbullet + pb = Pushbullet(config['PUSHBULLET']['API_KEY']) + pb_channel = pb.get_channel(config.get('PUSHBULLET', 'CHANNEL_TAG')) +else: + pb_channel = None + pb = None + +from defSS import getSS #Setup Tweepy -from defTweet import tweepysetup -tweet_api = tweepysetup() +if config.getboolean('TWITTER', 'ENABLE'): + from defTweet import tweepysetup + tweet_api = tweepysetup() +else: + tweet_api = None #Set Plane ICAO -TRACK_PLANE = '' +TRACK_PLANE = config.get('PLANE', 'ICAO') icao = TRACK_PLANE.upper() -#Pre Set Variables -geo_altitude = None +#Pre Set Non Reseting Variables geo_alt_ft = None last_geo_alt_ft = None last_below_desired_ft = None @@ -63,7 +78,7 @@ while True: #Pull Variables from planeData if planeData != None: for dataStates in planeData.states: - icao = (dataStates.icao24) + icao = (dataStates.icao24).upper() callsign = (dataStates.callsign) longitude = (dataStates.longitude) latitude = (dataStates.latitude) @@ -165,15 +180,19 @@ while True: tookoff_message = ("Just took off from" + " " + aera_hierarchy + ", " + state + ", " + country_code) print (tookoff_message) getMap(aera_hierarchy + ", " + state + ", " + country_code) - with open("map.png", "rb") as pic: - map_data = pb.upload_file(pic, "Tookoff") - push = pb_channel.push_note("title", tookoff_message) - push = pb_channel.push_file(**map_data) - tweet_api.update_with_media("map.png", status = tookoff_message) + getSS(icao) + if pb != None: + with open("map.png", "rb") as pic: + map_data = pb.upload_file(pic, "Tookoff IMG") + push = pb_channel.push_note(config.get('PUSHBULLET', 'TITLE'), tookoff_message) + push = pb_channel.push_file(**map_data) + with open("screenshot.png", "rb") as pic: + map_data = pb.upload_file(pic, "Tookoff IMG2") + push = pb_channel.push_file(**map_data) + if tweet_api != None: + tweet_api.update_with_media("map.png", status = tookoff_message) takeoff_time = time.time() - - if landed: landed_time_msg = "" if takeoff_time != None: @@ -182,15 +201,21 @@ while True: landed_message = ("Landed just now in" + " " + aera_hierarchy + ", " + state + ", " + country_code + ". " + landed_time_msg) print (landed_message) getMap(aera_hierarchy + ", " + state + ", " + country_code) - with open("map.png", "rb") as pic: - map_data = pb.upload_file(pic, "Landed") - push = pb_channel.push_note("title", landed_message) - push = pb_channel.push_file(**map_data) - tweet_api.update_with_media("map.png", status = landed_message) + getSS(icao) + if pb != None: + with open("map.png", "rb") as pic: + map_data = pb.upload_file(pic, "Landed IMG") + push = pb_channel.push_note(config.get('PUSHBULLET', 'TITLE'), landed_message) + push = pb_channel.push_file(**map_data) + with open("screenshot.png", "rb") as pic: + map_data = pb.upload_file(pic, "Landed IMG2") + push = pb_channel.push_file(**map_data) + if tweet_api != None: + tweet_api.update_with_media("map.png", status = landed_message) takeoff_time = None landed_time = None time_since_tk = None - + #Set Variables to compare to next check last_feeding = feeding last_geo_alt_ft = geo_alt_ft diff --git a/config.ini b/config.ini new file mode 100644 index 0000000..381e7ba --- /dev/null +++ b/config.ini @@ -0,0 +1,28 @@ +#V1 +[PLANE] +#Plane +ICAO = planeicaohere + +#Place Opensky credentials here +[OPENSKY] +USERNAME = None +PASSWORD = None + +[GOOGLE] +#API KEYS - enable static map images API in GCP and get key +STATICMAPKEY = googleapikey + + + +[TWITTER] +ENABLE = FALSE +CONSUMER_KEY = ckhere +CONSUMER_SECRET = cshere +ACCESS_TOKEN = athere +ACCESS_TOKEN_SECRET = atshere + +[PUSHBULLET] +ENABLE = FALSE +TITLE = "Title" +API_KEY = apikey +CHANNEL_TAG = channeltag \ No newline at end of file diff --git a/defMap.py b/defMap.py index f42313e..2c85547 100644 --- a/defMap.py +++ b/defMap.py @@ -1,6 +1,9 @@ def getMap(mapLocation): import requests - api_key = "" + import configparser + config = configparser.ConfigParser() + config.read('config.ini') + api_key = config.get('GOOGLE', 'STATICMAPKEY') url = "https://maps.googleapis.com/maps/api/staticmap?" center = str(mapLocation) diff --git a/defOpenSky.py b/defOpenSky.py index 62d9cff..db5f694 100644 --- a/defOpenSky.py +++ b/defOpenSky.py @@ -1,5 +1,8 @@ def pullplane(TRACK_PLANE): + import configparser + config = configparser.ConfigParser() + config.read('config.ini') from opensky_api import OpenSkyApi - opens_api = OpenSkyApi("", "") + opens_api = OpenSkyApi(config.get('OPENSKY', 'USERNAME'), config.get('OPENSKY', 'PASSWORD')) planeData = opens_api.get_states(time_secs=0, icao24=TRACK_PLANE.lower()) return planeData \ No newline at end of file diff --git a/defSS.py b/defSS.py new file mode 100644 index 0000000..a9efd5c --- /dev/null +++ b/defSS.py @@ -0,0 +1,20 @@ +#https://pypi.org/project/selenium/ +#https://zwbetz.com/download-chromedriver-binary-and-add-to-your-path-for-automated-functional-testing/ +#https://pythonspot.com/selenium-take-screenshot/ +#https://sites.google.com/a/chromium.org/chromedriver/downloads +#https://tecadmin.net/setup-selenium-with-chromedriver-on-debian/ +#https://blog.testproject.io/2018/02/20/chrome-headless-selenium-python-linux-servers/ +#https://serverfault.com/questions/172076/how-to-find-the-browser-versions-from-command-line-in-linux-windows +from selenium import webdriver +import time +def getSS(icao): + chrome_options = webdriver.ChromeOptions() + chrome_options.add_argument('--headless') + chrome_options.add_argument('window-size=800,800') + # chrome_options.add_argument('--no-sandbox') # required when running as root user. otherwise you would get no sandbox errors. + browser = webdriver.Chrome(options=chrome_options) + url = "https://globe.adsbexchange.com/?largeMode=2&hideButtons&hideSidebar&zoom=9&icao=" + icao + browser.get(url) + time.sleep(10) + browser.save_screenshot("screenshot.png") + browser.quit() \ No newline at end of file diff --git a/defTweet.py b/defTweet.py index c4c36c1..6dfd677 100644 --- a/defTweet.py +++ b/defTweet.py @@ -1,9 +1,12 @@ # Authenticate to Twitter +import configparser +config = configparser.ConfigParser() +config.read('config.ini') +import tweepy def tweepysetup(): #DOCU #https://realpython.com/twitter-bot-python-tweepy/ - import tweepy - auth = tweepy.OAuthHandler("CONSUMER_KEY", "CONSUMER_SECRET") - auth.set_access_token("ACCESS_TOKEN", "ACCESS_TOKEN_SECRET") + auth = tweepy.OAuthHandler(config.get('TWITTER', 'CONSUMER_KEY'), config.get('TWITTER', 'CONSUMER_SECRET')) + auth.set_access_token(config.get('TWITTER', 'ACCESS_TOKEN'), config.get('TWITTER', 'ACCESS_TOKEN_SECRET')) tweet_api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True) return tweet_api \ No newline at end of file From 54c48dc8d459fd6cacef8bb4e76cbe5668d57a74 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Fri, 14 Aug 2020 23:58:51 -0400 Subject: [PATCH 025/124] Add ADSBX data option, and multiple enable bools --- OpenSky Bot.py | 187 ++++++++++++++++++++++++++++--------------------- config.ini | 34 ++++++--- defADSBX.py | 34 +++++++++ defDiscord.py | 10 +++ defOpenSky.py | 35 ++++++++- defSS.py | 8 +-- 6 files changed, 210 insertions(+), 98 deletions(-) create mode 100644 defADSBX.py create mode 100644 defDiscord.py diff --git a/OpenSky Bot.py b/OpenSky Bot.py index 4a77c33..081833d 100644 --- a/OpenSky Bot.py +++ b/OpenSky Bot.py @@ -1,9 +1,9 @@ -#Github Updated - NotifyBot 10 +#Github Updated - NotifyBot 11 #Import Modules -#Setup Geopy #Clear Terminal import os os.system('cls' if os.name == 'nt' else 'clear') +#Setup Geopy from geopy.geocoders import Nominatim geolocator = Nominatim(user_agent="OpenSkyBot", timeout=5) @@ -11,13 +11,27 @@ import json import time from colorama import Fore, Back, Style import datetime -from defOpenSky import pullplane -from defMap import getMap +from defOpenSky import pullOpenSky +from defADSBX import pullADSBX + #Setup Config File import configparser config = configparser.ConfigParser() config.read('config.ini') +if config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): + from defMap import getMap +else: + from defSS import getSS + +if config.getboolean('DISCORD', 'ENABLE'): + from defDiscord import sendDis +#Setup Tweepy +if config.getboolean('TWITTER', 'ENABLE'): + from defTweet import tweepysetup + tweet_api = tweepysetup() +else: + tweet_api = None #Setup PushBullet if config.getboolean('PUSHBULLET', 'ENABLE'): from pushbullet import Pushbullet @@ -27,16 +41,8 @@ else: pb_channel = None pb = None -from defSS import getSS - -#Setup Tweepy -if config.getboolean('TWITTER', 'ENABLE'): - from defTweet import tweepysetup - tweet_api = tweepysetup() -else: - tweet_api = None #Set Plane ICAO -TRACK_PLANE = config.get('PLANE', 'ICAO') +TRACK_PLANE = config.get('DATA', 'ICAO') icao = TRACK_PLANE.upper() #Pre Set Non Reseting Variables geo_alt_ft = None @@ -66,52 +72,58 @@ while True: on_ground = None geo_alt_m = None #Get API States for Plane - planeData = None - try: - planeData = pullplane(TRACK_PLANE) - except: - print ("Opensky Error") - print (Fore.YELLOW) - print ("OpenSky Debug", planeData) - print(Style.RESET_ALL) + plane_Dict = None + if config.get('DATA', 'SOURCE') == "OPENS": + plane_Dict, failed = pullOpenSky(TRACK_PLANE) + print (Fore.YELLOW) + print ("OpenSky Sourced Data: ", plane_Dict) + print(Style.RESET_ALL) + elif config.get('DATA', 'SOURCE') == "ADSBX": + plane_Dict, failed = pullADSBX(TRACK_PLANE) + print (Fore.YELLOW) + print ("ADSBX Sourced Data: ", plane_Dict) + print(Style.RESET_ALL) -#Pull Variables from planeData - if planeData != None: - for dataStates in planeData.states: - icao = (dataStates.icao24).upper() - callsign = (dataStates.callsign) - longitude = (dataStates.longitude) - latitude = (dataStates.latitude) - on_ground = (dataStates.on_ground) - geo_alt_m = (dataStates.geo_altitude) - if geo_alt_m != None: - geo_alt_ft = geo_alt_m * 3.281 - elif geo_alt_m == None and on_ground: - geo_alt_ft = 0 - print (Fore.CYAN) - print ("ICAO: ", icao) - print ("Callsign: ", callsign) - print ("On Ground: ", on_ground) - print ("Latitude: ", latitude) - print ("Longitude: ", longitude) - print ("GEO Alitude Ft: ", geo_alt_ft) + print (Fore.CYAN) + print ("Failed:", failed) + print ("ICAO:", icao) + print(Style.RESET_ALL) - #Lookup Location of coordinates - if longitude != None and latitude != None: - - combined = f"{latitude}, {longitude}" - try: - location = geolocator.reverse(combined) - except: - print ("Geopy API Error") - print (Fore.YELLOW) - print ("Geopy debug: ", location.raw) - print(Style.RESET_ALL) - feeding = True - else: - print (Fore.RED + 'Not Feeding') +#Pull Variables from plane_Dict + if failed is False: + if plane_Dict == None: feeding = False - print(Style.RESET_ALL) + elif plane_Dict != None: + for key, value in plane_Dict.items(): + exec(key + '=value') + print (Fore.CYAN) + if config.get('DATA', 'SOURCE') == "ADSBX": + print("Registration: ", reg) + else: + print("Registration: ", "Only shows when using ADSBX!") + print ("Callsign: ", callsign) + print ("On Ground: ", on_ground) + print ("Latitude: ", latitude) + print ("Longitude: ", longitude) + print ("GEO Alitude Ft: ", geo_alt_ft) + print(Style.RESET_ALL) + #Lookup Location of coordinates + if longitude != None and latitude != None: + combined = f"{latitude}, {longitude}" + try: + location = geolocator.reverse(combined) + except: + print ("Geopy API Error") + print (Fore.YELLOW) + # print ("Geopy debug: ", location.raw) + print(Style.RESET_ALL) + feeding = True + else: + print (Fore.RED + 'No Location') + feeding = False + print(Style.RESET_ALL) + + #Figure if valid location, valid being geopy finds a location if feeding: @@ -141,9 +153,7 @@ while True: county = address.get('county', '') city = address.get('city', '') town = address.get('town', '') - hamlet = address.get('hamlet', '') - - + hamlet = address.get('hamlet', '') # print (Fore.YELLOW) # print ("Address Fields debug: ", address) # print(Style.RESET_ALL) @@ -157,21 +167,21 @@ while True: print ("Hamlet: ", hamlet) print ("County: ", county) print(Style.RESET_ALL) - -#Check if below desire ft - if geo_alt_ft is None: - below_desired_ft = False - elif geo_alt_ft < 10000: - below_desired_ft = True + + #Check if below desire ft + if geo_alt_ft is None: + below_desired_ft = False + elif geo_alt_ft < 10000: + below_desired_ft = True #Check if tookoff tookoff = bool(invalid_Location is False and below_desired_ft and on_ground is False and ((last_feeding is False and feeding) or (last_on_ground))) print ("Tookoff Just Now:", tookoff) - + #Check if Landed landed = bool(last_below_desired_ft and invalid_Location is False and ((last_feeding and feeding is False and last_on_ground is False) or (on_ground and last_on_ground is False))) print ("Landed Just Now:", landed) - + #Chose city town county or hamlet for location as not all are always avalible. if feeding and invalid_Location is False: aera_hierarchy = city or town or county or hamlet @@ -179,19 +189,27 @@ while True: if tookoff: tookoff_message = ("Just took off from" + " " + aera_hierarchy + ", " + state + ", " + country_code) print (tookoff_message) - getMap(aera_hierarchy + ", " + state + ", " + country_code) - getSS(icao) + #Google Map or tar1090 screenshot + if config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): + getMap(aera_hierarchy + ", " + state + ", " + country_code) + else: + getSS(icao) + #Discord + if config.getboolean('DISCORD', 'ENABLE'): + dis_message = icao + " " + tookoff_message + sendDis(dis_message) + #PushBullet if pb != None: with open("map.png", "rb") as pic: map_data = pb.upload_file(pic, "Tookoff IMG") push = pb_channel.push_note(config.get('PUSHBULLET', 'TITLE'), tookoff_message) push = pb_channel.push_file(**map_data) - with open("screenshot.png", "rb") as pic: - map_data = pb.upload_file(pic, "Tookoff IMG2") - push = pb_channel.push_file(**map_data) + #Twitter if tweet_api != None: tweet_api.update_with_media("map.png", status = tookoff_message) takeoff_time = time.time() + os.remove("map.png") + if landed: landed_time_msg = "" @@ -200,21 +218,28 @@ while True: landed_time_msg = time.strftime("Apx. flt. time %H Hours : %M Mins ", time.gmtime(landed_time)) landed_message = ("Landed just now in" + " " + aera_hierarchy + ", " + state + ", " + country_code + ". " + landed_time_msg) print (landed_message) - getMap(aera_hierarchy + ", " + state + ", " + country_code) - getSS(icao) + #Google Map or tar1090 screenshot + if config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): + getMap(aera_hierarchy + ", " + state + ", " + country_code) + else: + getSS(icao) + #Discord + if config.getboolean('DISCORD', 'ENABLE'): + dis_message = icao + " " + landed_message + sendDis(dis_message) + #PushBullet if pb != None: with open("map.png", "rb") as pic: map_data = pb.upload_file(pic, "Landed IMG") push = pb_channel.push_note(config.get('PUSHBULLET', 'TITLE'), landed_message) push = pb_channel.push_file(**map_data) - with open("screenshot.png", "rb") as pic: - map_data = pb.upload_file(pic, "Landed IMG2") - push = pb_channel.push_file(**map_data) + #Twitter if tweet_api != None: tweet_api.update_with_media("map.png", status = landed_message) takeoff_time = None landed_time = None time_since_tk = None + os.remove("map.png") #Set Variables to compare to next check last_feeding = feeding @@ -222,12 +247,12 @@ while True: last_on_ground = on_ground last_below_desired_ft = below_desired_ft - else: - print ("Rechecking OpenSky") - planeDataMSG = str(planeData) + elif failed: + print ("Failed to connect to data source rechecking in 15s") + if takeoff_time != None: elapsed_time = time.time() - takeoff_time - time_since_tk = time.strftime("Time Since Take off %H Hours : %M Mins : %S Secs", time.gmtime(elapsed_time)) + time_since_tk = time.strftime("Time Since Take off %H Hours : %M Mins : %S Secs", time.gmtime(elapsed_time)) print(time_since_tk) diff --git a/config.ini b/config.ini index 381e7ba..c06f2e7 100644 --- a/config.ini +++ b/config.ini @@ -1,19 +1,28 @@ -#V1 -[PLANE] -#Plane +#V2 +[DATA] +#Plane to track, based of ICAO or ICAO24 which is the unique transponder address of a plane. ICAO = planeicaohere +#Source to pull data from +#SHOULD BE ADSBX which is ADS-B Exchange or OPENS which is OpenSky +#By default configured with OpenSky which anyone can use without a login +#ADS-B Exchange has better data but is not avalible unless you feed their network or pay. +SOURCE = OPENS -#Place Opensky credentials here +#ADS-B Exchange https://www.adsbexchange.com/data/ +[ADSBX] +API_KEY = apikey + +#OpenSky https://opensky-network.org/apidoc/index.html [OPENSKY] USERNAME = None PASSWORD = None [GOOGLE] -#API KEYS - enable static map images API in GCP and get key +#API KEYS +#If static map disabled will load up tar1090 ads-b exchange and take screenshot instead. +STATICMAP_ENABLE = FALSE STATICMAPKEY = googleapikey - - [TWITTER] ENABLE = FALSE CONSUMER_KEY = ckhere @@ -23,6 +32,11 @@ ACCESS_TOKEN_SECRET = atshere [PUSHBULLET] ENABLE = FALSE -TITLE = "Title" -API_KEY = apikey -CHANNEL_TAG = channeltag \ No newline at end of file +TITLE = Title Of Pushbullet message +API_KEY = apikey +CHANNEL_TAG = channeltag + +[DISCORD] +ENABLE = TRUE +#WEBHOOK URL https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks +URL = webhookurlhere diff --git a/defADSBX.py b/defADSBX.py new file mode 100644 index 0000000..ff21d6b --- /dev/null +++ b/defADSBX.py @@ -0,0 +1,34 @@ +import requests +import json +import configparser +config = configparser.ConfigParser() +config.read('config.ini') +def pullADSBX(icao): + url = 'https://adsbexchange.com/api/aircraft/icao/' + icao + "/" + headers = { + 'api-auth': config.get('ADSBX', 'API_KEY') + } + failed = False + try: + response = requests.get(url, headers = headers) + data = response.text + data = json.loads(data) + except: + print("ADSBX Error") + failed = True + plane_Dict = None + if failed is False: + ac = data['ac'] + if ac != None: + ac_dict = ac[0] + plane_Dict = {'icao' : ac_dict['icao'], 'callsign' : ac_dict['call'], 'reg' : ac_dict['reg'], 'latitude' : float(ac_dict['lat']), 'longitude' : float(ac_dict['lon']), 'geo_alt_ft' : int(ac_dict['galt']), 'on_ground' : bool(int(ac_dict["gnd"]))} + if plane_Dict['on_ground']: + plane_Dict['geo_alt_ft'] = 0 + else: + plane_Dict = None + + return plane_Dict, failed + + + + diff --git a/defDiscord.py b/defDiscord.py new file mode 100644 index 0000000..d773aeb --- /dev/null +++ b/defDiscord.py @@ -0,0 +1,10 @@ +from discord_webhook import DiscordWebhook +import configparser +config = configparser.ConfigParser() +config.read('config.ini') +def sendDis(message): + webhook = DiscordWebhook(url=config.get('DISCORD', 'URL'), content=message, username="plane-notify") + + with open("map.png", "rb") as f: + webhook.add_file(file=f.read(), filename='map.png') + response = webhook.execute() \ No newline at end of file diff --git a/defOpenSky.py b/defOpenSky.py index db5f694..6031748 100644 --- a/defOpenSky.py +++ b/defOpenSky.py @@ -1,8 +1,37 @@ -def pullplane(TRACK_PLANE): +def pullOpenSky(TRACK_PLANE): import configparser config = configparser.ConfigParser() config.read('config.ini') from opensky_api import OpenSkyApi + planeData = None opens_api = OpenSkyApi(config.get('OPENSKY', 'USERNAME'), config.get('OPENSKY', 'PASSWORD')) - planeData = opens_api.get_states(time_secs=0, icao24=TRACK_PLANE.lower()) - return planeData \ No newline at end of file + failed = False + try: + planeData = opens_api.get_states(time_secs=0, icao24=TRACK_PLANE.lower()) + except: + print ("OpenSky Error") + failed = True + if failed is False and planeData != None: + plane_Dict = {} + geo_alt_m = None + for dataStates in planeData.states: + plane_Dict['icao'] = (dataStates.icao24).upper() + plane_Dict['callsign'] = (dataStates.callsign) + plane_Dict['longitude'] = (dataStates.longitude) + plane_Dict['latitude'] = (dataStates.latitude) + plane_Dict['on_ground'] = (dataStates.on_ground) + geo_alt_m = (dataStates.geo_altitude) + try: + if geo_alt_m != None: + plane_Dict['geo_alt_ft'] = geo_alt_m * 3.281 + elif plane_Dict['on_ground']: + plane_Dict['geo_alt_ft'] = 0 + except KeyError: + pass + if plane_Dict == {}: + plane_Dict = None + else: + plane_Dict = None + return plane_Dict, failed + + \ No newline at end of file diff --git a/defSS.py b/defSS.py index a9efd5c..0ae91a3 100644 --- a/defSS.py +++ b/defSS.py @@ -11,10 +11,10 @@ def getSS(icao): chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') chrome_options.add_argument('window-size=800,800') - # chrome_options.add_argument('--no-sandbox') # required when running as root user. otherwise you would get no sandbox errors. +# chrome_options.add_argument('--no-sandbox') # required when running as root user. otherwise you would get no sandbox errors. browser = webdriver.Chrome(options=chrome_options) - url = "https://globe.adsbexchange.com/?largeMode=2&hideButtons&hideSidebar&zoom=9&icao=" + icao + url = "https://globe.adsbexchange.com/?largeMode=2&hideButtons&hideSidebar&mapDim=0&zoom=9&icao=" + icao browser.get(url) - time.sleep(10) - browser.save_screenshot("screenshot.png") + time.sleep(30) + browser.save_screenshot("map.png") browser.quit() \ No newline at end of file From 304c45cf2180ecc489ce95fb7c6299a3a12c712a Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 15 Aug 2020 00:10:11 -0400 Subject: [PATCH 026/124] Rename OpenSky Bot as it also is ADSBX aswell --- OpenSky Bot.py => NotifyBot.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename OpenSky Bot.py => NotifyBot.py (100%) diff --git a/OpenSky Bot.py b/NotifyBot.py similarity index 100% rename from OpenSky Bot.py rename to NotifyBot.py From 8ca4df54c8e9e76861910d1c42cda350e5e11294 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 15 Aug 2020 12:22:16 -0400 Subject: [PATCH 027/124] Cleanup Whitespaces and remove json from NotifyBot --- NotifyBot.py | 49 ++++++++++++++++++++++++------------------------- defDiscord.py | 2 +- defMap.py | 28 ++++++++++++++-------------- defOpenSky.py | 8 +++----- defSS.py | 2 +- defTweet.py | 2 +- 6 files changed, 44 insertions(+), 47 deletions(-) diff --git a/NotifyBot.py b/NotifyBot.py index 081833d..ec4c048 100644 --- a/NotifyBot.py +++ b/NotifyBot.py @@ -1,20 +1,19 @@ #Github Updated - NotifyBot 11 #Import Modules -#Clear Terminal +#Clear Terminal import os os.system('cls' if os.name == 'nt' else 'clear') #Setup Geopy from geopy.geocoders import Nominatim geolocator = Nominatim(user_agent="OpenSkyBot", timeout=5) -import json import time -from colorama import Fore, Back, Style +from colorama import Fore, Back, Style import datetime from defOpenSky import pullOpenSky from defADSBX import pullADSBX -#Setup Config File +#Setup Config File import configparser config = configparser.ConfigParser() config.read('config.ini') @@ -30,15 +29,15 @@ if config.getboolean('DISCORD', 'ENABLE'): if config.getboolean('TWITTER', 'ENABLE'): from defTweet import tweepysetup tweet_api = tweepysetup() -else: - tweet_api = None +else: + tweet_api = None #Setup PushBullet if config.getboolean('PUSHBULLET', 'ENABLE'): from pushbullet import Pushbullet pb = Pushbullet(config['PUSHBULLET']['API_KEY']) pb_channel = pb.get_channel(config.get('PUSHBULLET', 'CHANNEL_TAG')) -else: - pb_channel = None +else: + pb_channel = None pb = None #Set Plane ICAO @@ -49,7 +48,7 @@ geo_alt_ft = None last_geo_alt_ft = None last_below_desired_ft = None feeding = None -last_feeding = None +last_feeding = None last_on_ground = None on_ground = None invalid_Location = None @@ -107,7 +106,7 @@ while True: print ("Longitude: ", longitude) print ("GEO Alitude Ft: ", geo_alt_ft) print(Style.RESET_ALL) - #Lookup Location of coordinates + #Lookup Location of coordinates if longitude != None and latitude != None: combined = f"{latitude}, {longitude}" try: @@ -116,8 +115,8 @@ while True: print ("Geopy API Error") print (Fore.YELLOW) # print ("Geopy debug: ", location.raw) - print(Style.RESET_ALL) - feeding = True + print(Style.RESET_ALL) + feeding = True else: print (Fore.RED + 'No Location') feeding = False @@ -136,13 +135,13 @@ while True: invalid_Location = True print ("Invalid Location: ", invalid_Location) - + if invalid_Location: print (Fore.RED) print (geoError) print ("Likely Over Water or Invalid Location") print(Style.RESET_ALL) - + #Convert Full address to sep variables only if Valid Location elif invalid_Location is False: @@ -153,7 +152,7 @@ while True: county = address.get('county', '') city = address.get('city', '') town = address.get('town', '') - hamlet = address.get('hamlet', '') + hamlet = address.get('hamlet', '') # print (Fore.YELLOW) # print ("Address Fields debug: ", address) # print(Style.RESET_ALL) @@ -167,7 +166,7 @@ while True: print ("Hamlet: ", hamlet) print ("County: ", county) print(Style.RESET_ALL) - + #Check if below desire ft if geo_alt_ft is None: below_desired_ft = False @@ -176,15 +175,15 @@ while True: #Check if tookoff tookoff = bool(invalid_Location is False and below_desired_ft and on_ground is False and ((last_feeding is False and feeding) or (last_on_ground))) print ("Tookoff Just Now:", tookoff) - + #Check if Landed landed = bool(last_below_desired_ft and invalid_Location is False and ((last_feeding and feeding is False and last_on_ground is False) or (on_ground and last_on_ground is False))) print ("Landed Just Now:", landed) - - #Chose city town county or hamlet for location as not all are always avalible. + + #Chose city town county or hamlet for location as not all are always avalible. if feeding and invalid_Location is False: - aera_hierarchy = city or town or county or hamlet + aera_hierarchy = city or town or county or hamlet #Takeoff Notifcation and Landed if tookoff: tookoff_message = ("Just took off from" + " " + aera_hierarchy + ", " + state + ", " + country_code) @@ -196,7 +195,7 @@ while True: getSS(icao) #Discord if config.getboolean('DISCORD', 'ENABLE'): - dis_message = icao + " " + tookoff_message + dis_message = icao + " " + tookoff_message sendDis(dis_message) #PushBullet if pb != None: @@ -211,7 +210,7 @@ while True: os.remove("map.png") - if landed: + if landed: landed_time_msg = "" if takeoff_time != None: landed_time = time.time() - takeoff_time @@ -221,7 +220,7 @@ while True: #Google Map or tar1090 screenshot if config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): getMap(aera_hierarchy + ", " + state + ", " + country_code) - else: + else: getSS(icao) #Discord if config.getboolean('DISCORD', 'ENABLE'): @@ -248,7 +247,7 @@ while True: last_below_desired_ft = below_desired_ft elif failed: - print ("Failed to connect to data source rechecking in 15s") + print ("Failed to connect to data source rechecking in 15s") if takeoff_time != None: elapsed_time = time.time() - takeoff_time @@ -256,7 +255,7 @@ while True: print(time_since_tk) - + elapsed_calc_time = time.time() - start_time print (Back.MAGENTA, "--------", running_Count, "------------------------Elapsed Time- ", elapsed_calc_time, "-------------------------------------", Style.RESET_ALL) diff --git a/defDiscord.py b/defDiscord.py index d773aeb..df99369 100644 --- a/defDiscord.py +++ b/defDiscord.py @@ -6,5 +6,5 @@ def sendDis(message): webhook = DiscordWebhook(url=config.get('DISCORD', 'URL'), content=message, username="plane-notify") with open("map.png", "rb") as f: - webhook.add_file(file=f.read(), filename='map.png') + webhook.add_file(file=f.read(), filename='map.png') response = webhook.execute() \ No newline at end of file diff --git a/defMap.py b/defMap.py index 2c85547..04490a8 100644 --- a/defMap.py +++ b/defMap.py @@ -1,5 +1,5 @@ def getMap(mapLocation): - import requests + import requests import configparser config = configparser.ConfigParser() config.read('config.ini') @@ -8,18 +8,18 @@ def getMap(mapLocation): center = str(mapLocation) zoom = 9 - + r = requests.get(url + "center=" + center + "&zoom=" + str(zoom) + "&size=800x800 &key=" + - api_key + "&sensor=false") - - # wb mode is stand for write binary mode - f = open('map.png', 'wb') - - # r.content gives content, - # in this case gives image - f.write(r.content) - - # close method of file object - # save and close the file - f.close() \ No newline at end of file + api_key + "&sensor=false") + + # wb mode is stand for write binary mode + f = open('map.png', 'wb') + + # r.content gives content, + # in this case gives image + f.write(r.content) + + # close method of file object + # save and close the file + f.close() \ No newline at end of file diff --git a/defOpenSky.py b/defOpenSky.py index 6031748..0cfe782 100644 --- a/defOpenSky.py +++ b/defOpenSky.py @@ -10,7 +10,7 @@ def pullOpenSky(TRACK_PLANE): planeData = opens_api.get_states(time_secs=0, icao24=TRACK_PLANE.lower()) except: print ("OpenSky Error") - failed = True + failed = True if failed is False and planeData != None: plane_Dict = {} geo_alt_m = None @@ -19,7 +19,7 @@ def pullOpenSky(TRACK_PLANE): plane_Dict['callsign'] = (dataStates.callsign) plane_Dict['longitude'] = (dataStates.longitude) plane_Dict['latitude'] = (dataStates.latitude) - plane_Dict['on_ground'] = (dataStates.on_ground) + plane_Dict['on_ground'] = (dataStates.on_ground) geo_alt_m = (dataStates.geo_altitude) try: if geo_alt_m != None: @@ -32,6 +32,4 @@ def pullOpenSky(TRACK_PLANE): plane_Dict = None else: plane_Dict = None - return plane_Dict, failed - - \ No newline at end of file + return plane_Dict, failed \ No newline at end of file diff --git a/defSS.py b/defSS.py index 0ae91a3..a05cc5f 100644 --- a/defSS.py +++ b/defSS.py @@ -11,7 +11,7 @@ def getSS(icao): chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') chrome_options.add_argument('window-size=800,800') -# chrome_options.add_argument('--no-sandbox') # required when running as root user. otherwise you would get no sandbox errors. + #chrome_options.add_argument('--no-sandbox') # required when running as root user. otherwise you would get no sandbox errors. browser = webdriver.Chrome(options=chrome_options) url = "https://globe.adsbexchange.com/?largeMode=2&hideButtons&hideSidebar&mapDim=0&zoom=9&icao=" + icao browser.get(url) diff --git a/defTweet.py b/defTweet.py index 6dfd677..6943d62 100644 --- a/defTweet.py +++ b/defTweet.py @@ -4,7 +4,7 @@ config = configparser.ConfigParser() config.read('config.ini') import tweepy def tweepysetup(): - #DOCU + #DOCU #https://realpython.com/twitter-bot-python-tweepy/ auth = tweepy.OAuthHandler(config.get('TWITTER', 'CONSUMER_KEY'), config.get('TWITTER', 'CONSUMER_SECRET')) auth.set_access_token(config.get('TWITTER', 'ACCESS_TOKEN'), config.get('TWITTER', 'ACCESS_TOKEN_SECRET')) From 03c06a439764411c0f705db5e4af4dbe07ea1fc2 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 15 Aug 2020 12:31:34 -0400 Subject: [PATCH 028/124] Minor changes to readme, remove whitespace --- README.md | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 336d812..045bb78 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ # plane-notify Nearing final first version. Notify If a Selected Plane has taken off or landed using Python with OpenSky API, outputs location of takeoff location of landing and takeoff by revese lookup of cordinates. -## Why I made it -Made it so I could track Elon Musk's Jet and share with others of his whereabouts follow on twitter @ElonJet https://twitter.com/ElonJet +## Why I made it +Made it so I could track Elon Musk's Jet and share with others of his whereabouts follow on twitter @ElonJet https://twitter.com/ElonJet ## How It works -- Takes data about every 15 seconds from OpenSky Network compares it to previous data with whats I've defined as a landing or takeoff event. -- A takeoff event event is the plane is not on ground, below 10k feet and ((previously no data and now getting data) or was previously on ground). +- Takes data about every 15 seconds from OpenSky Network or ADS-B Exchange and compares it to previous data with whats I've defined as a landing or takeoff event. +- A takeoff event event is the plane is not on ground, below 10k feet and ((previously no data and now getting data) or was previously on ground). - A landing event is previosly below 10k feet and (previously getting data, no longer getting data and previously not on ground) or (now on ground and previously not on ground). - Given the coordinates of the aircraft the coordinates are reverse looked up for a location name. (Geopy Nomination Geolocater) - At time of takeoff a takeoff time is set which is refrenced in landing event to calculate an approximate total flight time. @@ -19,7 +19,7 @@ a ### Install OpenSky API ```bash -apt install git +apt install git git clone https://github.com/openskynetwork/opensky-api.git pip install -e ~/opensky-api/python ``` @@ -42,31 +42,26 @@ apt install screen ``` apt install python3 ``` -### Download / Clone +### Download / Clone ``` git clone https://github.com/Jxck-S/plane-notify.git cd plane-notify ``` -### Configure defOpenSky, defTweet and defMap with API keys -- defOpenSky doesn't require an OpenSky API key but bennefits from one. -- defTweet can be disabled if removed from NotifyBot.py or give Twitter API keys to it. -- Pushbullet is setup in main NotifyBot.py -- defMap needs Google Static Map API keys. -- edit them with nano or vi +### Configure config file with keys and urls +- edit them with nano or vi on the running machine or on your pc and transfer the config to where you will be running the bot -### Enter and create new Screen Session -``` +### Enter and create new Screen Session +``` screen -R ``` -### Start Program +### Start Program ``` python3 NotifyBot.py ``` ### TODO -implement YAML file for config options implement airport name, done by closest airport #### Refrences - https://opensky-network.org/apidoc/ From c431327eff0d0f4a74c869f276853cdcf0defa6c Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 15 Aug 2020 12:40:10 -0400 Subject: [PATCH 029/124] Remark README --- README.md | 81 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 45 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index 045bb78..f4078ad 100644 --- a/README.md +++ b/README.md @@ -1,74 +1,83 @@ # plane-notify + Nearing final first version. Notify If a Selected Plane has taken off or landed using Python with OpenSky API, outputs location of takeoff location of landing and takeoff by revese lookup of cordinates. + ## Why I made it -Made it so I could track Elon Musk's Jet and share with others of his whereabouts follow on twitter @ElonJet https://twitter.com/ElonJet + +Made it so I could track Elon Musk's Jet and share with others of his whereabouts follow on twitter @ElonJet ## How It works -- Takes data about every 15 seconds from OpenSky Network or ADS-B Exchange and compares it to previous data with whats I've defined as a landing or takeoff event. -- A takeoff event event is the plane is not on ground, below 10k feet and ((previously no data and now getting data) or was previously on ground). -- A landing event is previosly below 10k feet and (previously getting data, no longer getting data and previously not on ground) or (now on ground and previously not on ground). -- Given the coordinates of the aircraft the coordinates are reverse looked up for a location name. (Geopy Nomination Geolocater) -- At time of takeoff a takeoff time is set which is refrenced in landing event to calculate an approximate total flight time. -- Static map image is created based off location name. (Google Static Maps API) -- If the landing event and takeoff events are true creates the output to Twitter and Pushbullet, uses the location name, map image and takeoff time if landing. (Tweepy and Pushbullet ) -a + +- Takes data about every 15 seconds from OpenSky Network or ADS-B Exchange and compares it to previous data with whats I've defined as a landing or takeoff event. +- A takeoff event event is the plane is not on ground, below 10k feet and ((previously no data and now getting data) or was previously on ground). +- A landing event is previosly below 10k feet and (previously getting data, no longer getting data and previously not on ground) or (now on ground and previously not on ground). +- Given the coordinates of the aircraft the coordinates are reverse looked up for a location name. (Geopy Nomination Geolocater) +- At time of takeoff a takeoff time is set which is refrenced in landing event to calculate an approximate total flight time. +- Static map image is created based off location name. (Google Static Maps API) +- If the landing event and takeoff events are true creates the output to Twitter and Pushbullet, uses the location name, map image and takeoff time if landing. (Tweepy and Pushbullet ) + a + ## Required PIP packages -- OpenSky API https://github.com/openskynetwork/opensky-api -- geopy https://github.com/geopy/geopy -- colorama https://github.com/tartley/colorama + +- OpenSky API +- geopy +- colorama ### Install OpenSky API + ```bash apt install git git clone https://github.com/openskynetwork/opensky-api.git pip install -e ~/opensky-api/python ``` + ### Install Colorama and geopy + ```bash pip install colorama pip install geopy ``` + ### Install Pushbullet and Tweepy optional output methods already implemented in code + ```bash pip install tweepy pip install pushbullet.py ``` + ### Install Screen to run in background -``` -apt install screen -``` + + apt install screen ### Make sure Python is installed -``` -apt install python3 -``` + + apt install python3 + ### Download / Clone -``` -git clone https://github.com/Jxck-S/plane-notify.git -cd plane-notify -``` + + git clone https://github.com/Jxck-S/plane-notify.git + cd plane-notify ### Configure config file with keys and urls -- edit them with nano or vi on the running machine or on your pc and transfer the config to where you will be running the bot +- edit them with nano or vi on the running machine or on your pc and transfer the config to where you will be running the bot ### Enter and create new Screen Session -``` -screen -R -``` + + screen -R ### Start Program -``` -python3 NotifyBot.py -``` + + python3 NotifyBot.py + ### TODO + implement airport name, done by closest airport + #### Refrences -- https://opensky-network.org/apidoc/ -- https://geopy.readthedocs.io/en/stable/ -- https://www.geeksforgeeks.org/python-get-google-map-image-specified-location-using-google-static-maps-api/ -- https://realpython.com/twitter-bot-python-tweepy/ -- https://github.com/rbrcsk/pushbullet.py - - +- +- +- +- +- From cc68c29bc0f63a86c5c7605b6f7bbee35971bebc Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 15 Aug 2020 12:50:54 -0400 Subject: [PATCH 030/124] Fix code fences in README --- README.md | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index f4078ad..30ae5b5 100644 --- a/README.md +++ b/README.md @@ -47,16 +47,22 @@ pip install pushbullet.py ### Install Screen to run in background - apt install screen +``` +apt install screen +``` ### Make sure Python is installed - apt install python3 +``` +apt install python3 +``` ### Download / Clone - git clone https://github.com/Jxck-S/plane-notify.git - cd plane-notify +``` +git clone https://github.com/Jxck-S/plane-notify.git +cd plane-notify +``` ### Configure config file with keys and urls @@ -64,11 +70,15 @@ pip install pushbullet.py ### Enter and create new Screen Session - screen -R +``` +screen -R +``` ### Start Program - python3 NotifyBot.py +``` +python3 NotifyBot.py +``` ### TODO From 770d6e9bbf5fcfb07fcda650fdc3332c3f72ef3e Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 15 Aug 2020 12:52:54 -0400 Subject: [PATCH 031/124] Fix README List --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 30ae5b5..596c444 100644 --- a/README.md +++ b/README.md @@ -9,13 +9,19 @@ Made it so I could track Elon Musk's Jet and share with others of his whereabout ## How It works - Takes data about every 15 seconds from OpenSky Network or ADS-B Exchange and compares it to previous data with whats I've defined as a landing or takeoff event. + - A takeoff event event is the plane is not on ground, below 10k feet and ((previously no data and now getting data) or was previously on ground). + - A landing event is previosly below 10k feet and (previously getting data, no longer getting data and previously not on ground) or (now on ground and previously not on ground). + - Given the coordinates of the aircraft the coordinates are reverse looked up for a location name. (Geopy Nomination Geolocater) + - At time of takeoff a takeoff time is set which is refrenced in landing event to calculate an approximate total flight time. + - Static map image is created based off location name. (Google Static Maps API) + - If the landing event and takeoff events are true creates the output to Twitter and Pushbullet, uses the location name, map image and takeoff time if landing. (Tweepy and Pushbullet ) - a + ## Required PIP packages From b8fd722f7c6bc28b40ee39c220fbc2bf6c0cc018 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 15 Aug 2020 12:55:51 -0400 Subject: [PATCH 032/124] Fix Extra line & Code fence lang. --- README.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 596c444..159a57e 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,6 @@ Made it so I could track Elon Musk's Jet and share with others of his whereabout - If the landing event and takeoff events are true creates the output to Twitter and Pushbullet, uses the location name, map image and takeoff time if landing. (Tweepy and Pushbullet ) - ## Required PIP packages - OpenSky API @@ -53,19 +52,19 @@ pip install pushbullet.py ### Install Screen to run in background -``` +```bash apt install screen ``` ### Make sure Python is installed -``` +```bash apt install python3 ``` ### Download / Clone -``` +```bash git clone https://github.com/Jxck-S/plane-notify.git cd plane-notify ``` @@ -76,13 +75,13 @@ cd plane-notify ### Enter and create new Screen Session -``` +```bash screen -R ``` ### Start Program -``` +```bash python3 NotifyBot.py ``` From 9e338ce45e20a2cb4f40d0de6e71ae198e5baaf0 Mon Sep 17 00:00:00 2001 From: The Codacy Badger Date: Sat, 15 Aug 2020 17:17:15 +0000 Subject: [PATCH 033/124] Add Codacy badge --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 159a57e..6ff18b3 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # plane-notify +[![Codacy Badge](https://api.codacy.com/project/badge/Grade/c4e1d839eec3468cadfe351d64dc1ac4)](https://app.codacy.com/manual/Jxck-S/plane-notify?utm_source=github.com&utm_medium=referral&utm_content=Jxck-S/plane-notify&utm_campaign=Badge_Grade_Settings) + Nearing final first version. Notify If a Selected Plane has taken off or landed using Python with OpenSky API, outputs location of takeoff location of landing and takeoff by revese lookup of cordinates. ## Why I made it From 86bac0a6e97ad1851c2b947be8264edfcd4a0801 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 15 Aug 2020 13:27:55 -0400 Subject: [PATCH 034/124] Add some badges --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6ff18b3..a01b8f8 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,14 @@ # plane-notify [![Codacy Badge](https://api.codacy.com/project/badge/Grade/c4e1d839eec3468cadfe351d64dc1ac4)](https://app.codacy.com/manual/Jxck-S/plane-notify?utm_source=github.com&utm_medium=referral&utm_content=Jxck-S/plane-notify&utm_campaign=Badge_Grade_Settings) +[![GPLv3 License](https://img.shields.io/badge/License-GPL%20v3-yellow.svg)](https://opensource.org/licenses/) + Nearing final first version. Notify If a Selected Plane has taken off or landed using Python with OpenSky API, outputs location of takeoff location of landing and takeoff by revese lookup of cordinates. ## Why I made it -Made it so I could track Elon Musk's Jet and share with others of his whereabouts follow on twitter @ElonJet +Made it so I could track Elon Musk's Jet and share with others of his whereabouts on Twitter. [![Twitter Follow](https://img.shields.io/twitter/follow/ElonJet.svg?style=social)](https://twitter.com/ElonJet) ## How It works From 72dc3c56a378cd49068b1656993aafd0070f0b07 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 15 Aug 2020 17:48:15 -0400 Subject: [PATCH 035/124] Remove datetime unused import --- NotifyBot.py | 1 - 1 file changed, 1 deletion(-) diff --git a/NotifyBot.py b/NotifyBot.py index ec4c048..8f1eb0c 100644 --- a/NotifyBot.py +++ b/NotifyBot.py @@ -9,7 +9,6 @@ geolocator = Nominatim(user_agent="OpenSkyBot", timeout=5) import time from colorama import Fore, Back, Style -import datetime from defOpenSky import pullOpenSky from defADSBX import pullADSBX From 7dfafaa19a870f07a64bfa69fbdda5b0b56cd343 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 15 Aug 2020 17:48:53 -0400 Subject: [PATCH 036/124] Update more README info since adding features --- README.md | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index a01b8f8..8a67169 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,7 @@ [![Codacy Badge](https://api.codacy.com/project/badge/Grade/c4e1d839eec3468cadfe351d64dc1ac4)](https://app.codacy.com/manual/Jxck-S/plane-notify?utm_source=github.com&utm_medium=referral&utm_content=Jxck-S/plane-notify&utm_campaign=Badge_Grade_Settings) [![GPLv3 License](https://img.shields.io/badge/License-GPL%20v3-yellow.svg)](https://opensource.org/licenses/) - -Nearing final first version. Notify If a Selected Plane has taken off or landed using Python with OpenSky API, outputs location of takeoff location of landing and takeoff by revese lookup of cordinates. +Notify If a Selected Plane has taken off or landed using Python with OpenSky or ADS-B Data, outputs location of takeoff location of landing and takeoff by revese lookup of cordinates. ## Why I made it @@ -22,14 +21,16 @@ Made it so I could track Elon Musk's Jet and share with others of his whereabout - At time of takeoff a takeoff time is set which is refrenced in landing event to calculate an approximate total flight time. -- Static map image is created based off location name. (Google Static Maps API) +- Static map image is created based off location name. (Google Static Maps API) or a screenshot of is created using Selenium/ChromeDriver The selected plane is locked on in the screenshot. -- If the landing event and takeoff events are true creates the output to Twitter and Pushbullet, uses the location name, map image and takeoff time if landing. (Tweepy and Pushbullet ) +- If the landing event and takeoff events are true creates the output to any of the following built in outputs(Twitter, Pushbullet, and Discord all of which can be setup and enabled in config.ini). Outputs the location name, map image and takeoff time if landing. (Tweepy and "Pushbullet.py" and Discord_webhooks) ## Required PIP packages -- OpenSky API +- OpenSky API (If using Opensky, which is default and anybody can use) + - geopy + - colorama ### Install OpenSky API @@ -47,13 +48,16 @@ pip install colorama pip install geopy ``` -### Install Pushbullet and Tweepy optional output methods already implemented in code +### Install Pushbullet, Tweepy, and Discord optional output methods already implemented in code ```bash pip install tweepy pip install pushbullet.py +pip install discord_webhooks ``` +Configure these methods of output in config.ini + ### Install Screen to run in background ```bash @@ -73,7 +77,7 @@ git clone https://github.com/Jxck-S/plane-notify.git cd plane-notify ``` -### Configure config file with keys and urls +### Configure config file with keys and urls (config.ini) - edit them with nano or vi on the running machine or on your pc and transfer the config to where you will be running the bot @@ -91,6 +95,8 @@ python3 NotifyBot.py ### TODO +move lookup location of coordinates only when landing or takeoff occurs so the Geopy/Nomination is called less + implement airport name, done by closest airport #### Refrences From 67b470788cfa0078b5d47cfb0827a9453d8ba2e4 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 15 Aug 2020 18:05:50 -0400 Subject: [PATCH 037/124] Fix up spelling / Understanding --- README.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 8a67169..6740529 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![Codacy Badge](https://api.codacy.com/project/badge/Grade/c4e1d839eec3468cadfe351d64dc1ac4)](https://app.codacy.com/manual/Jxck-S/plane-notify?utm_source=github.com&utm_medium=referral&utm_content=Jxck-S/plane-notify&utm_campaign=Badge_Grade_Settings) [![GPLv3 License](https://img.shields.io/badge/License-GPL%20v3-yellow.svg)](https://opensource.org/licenses/) -Notify If a Selected Plane has taken off or landed using Python with OpenSky or ADS-B Data, outputs location of takeoff location of landing and takeoff by revese lookup of cordinates. +Notify If a Selected Plane has taken off or landed using Python with OpenSky or ADS-B Data, outputs location of takeoff location of landing and takeoff by reverse lookup of coordinates. ## Why I made it @@ -11,23 +11,23 @@ Made it so I could track Elon Musk's Jet and share with others of his whereabout ## How It works -- Takes data about every 15 seconds from OpenSky Network or ADS-B Exchange and compares it to previous data with whats I've defined as a landing or takeoff event. +- Takes data about every 15 seconds from OpenSky Network or ADS-B Exchange and compares it to previous data with what I've defined as a landing or takeoff event. -- A takeoff event event is the plane is not on ground, below 10k feet and ((previously no data and now getting data) or was previously on ground). +- A takeoff event is the plane is not on the ground, below 10k feet and ((previously no data and now getting data) or was previously on the ground). -- A landing event is previosly below 10k feet and (previously getting data, no longer getting data and previously not on ground) or (now on ground and previously not on ground). +- A landing event is previously below 10k feet and (previously getting data, no longer getting data and previously not on the ground) or (now on the ground and previously not on the ground). -- Given the coordinates of the aircraft the coordinates are reverse looked up for a location name. (Geopy Nomination Geolocater) +- Given the coordinates of the aircraft the coordinates are reverse looked up for a location name. (GeoPY Nomination Geolocator) -- At time of takeoff a takeoff time is set which is refrenced in landing event to calculate an approximate total flight time. +- At the time of takeoff a takeoff time is set, which is referenced in the landing event to calculate approximate total flight time. -- Static map image is created based off location name. (Google Static Maps API) or a screenshot of is created using Selenium/ChromeDriver The selected plane is locked on in the screenshot. +- A Static map image is created based off location name. (Google Static Maps API) or a screenshot of is created using Selenium/ChromeDriver The selected plane is locked on in the screenshot. -- If the landing event and takeoff events are true creates the output to any of the following built in outputs(Twitter, Pushbullet, and Discord all of which can be setup and enabled in config.ini). Outputs the location name, map image and takeoff time if landing. (Tweepy and "Pushbullet.py" and Discord_webhooks) +- If the landing event and takeoff events are true, It will output to any of the following built-in output methods. (Twitter, Pushbullet, and Discord all of which can be setup and enabled in config.ini). Outputs the location name, map image and takeoff time if landing. (Tweepy and "Pushbullet.py" and Discord_webhooks) ## Required PIP packages -- OpenSky API (If using Opensky, which is default and anybody can use) +- OpenSky API (If using OpenSky, which is default and anybody can use) - geopy @@ -58,7 +58,7 @@ pip install discord_webhooks Configure these methods of output in config.ini -### Install Screen to run in background +### Install Screen to run in the background ```bash apt install screen @@ -77,7 +77,7 @@ git clone https://github.com/Jxck-S/plane-notify.git cd plane-notify ``` -### Configure config file with keys and urls (config.ini) +### Configure config file with keys and URLs (config.ini) - edit them with nano or vi on the running machine or on your pc and transfer the config to where you will be running the bot @@ -95,9 +95,9 @@ python3 NotifyBot.py ### TODO -move lookup location of coordinates only when landing or takeoff occurs so the Geopy/Nomination is called less +Move the lookup location of coordinates so that it only rungs when landing or takeoff occurs. So then Geopy/Nomination API is called less -implement airport name, done by closest airport +Implement airport name, done by closest airport #### Refrences From 989f62515580bdcab3cbc6d40097bafe2dd9a1e1 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Sat, 15 Aug 2020 18:12:52 -0400 Subject: [PATCH 038/124] Forgot Exchange --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6740529..0a45920 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![Codacy Badge](https://api.codacy.com/project/badge/Grade/c4e1d839eec3468cadfe351d64dc1ac4)](https://app.codacy.com/manual/Jxck-S/plane-notify?utm_source=github.com&utm_medium=referral&utm_content=Jxck-S/plane-notify&utm_campaign=Badge_Grade_Settings) [![GPLv3 License](https://img.shields.io/badge/License-GPL%20v3-yellow.svg)](https://opensource.org/licenses/) -Notify If a Selected Plane has taken off or landed using Python with OpenSky or ADS-B Data, outputs location of takeoff location of landing and takeoff by reverse lookup of coordinates. +Notify If a Selected Plane has taken off or landed using Python with OpenSky or ADS-B Exchange Data, outputs location of takeoff location of landing and takeoff by reverse lookup of coordinates. ## Why I made it From da6ca08c2629247d047b1cffcd5d3f0e77dc1bfe Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sun, 16 Aug 2020 12:46:24 -0400 Subject: [PATCH 039/124] Update variables instead of create with loop --- NotifyBot.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/NotifyBot.py b/NotifyBot.py index 8f1eb0c..acb5737 100644 --- a/NotifyBot.py +++ b/NotifyBot.py @@ -92,8 +92,7 @@ while True: if plane_Dict == None: feeding = False elif plane_Dict != None: - for key, value in plane_Dict.items(): - exec(key + '=value') + locals().update(plane_Dict) print (Fore.CYAN) if config.get('DATA', 'SOURCE') == "ADSBX": print("Registration: ", reg) From 5326fa8ae8bcf908647b289390d64d8daeb99d70 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sun, 16 Aug 2020 12:53:32 -0400 Subject: [PATCH 040/124] Safer way to clear terminal --- NotifyBot.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/NotifyBot.py b/NotifyBot.py index acb5737..73f531d 100644 --- a/NotifyBot.py +++ b/NotifyBot.py @@ -1,8 +1,10 @@ #Github Updated - NotifyBot 11 #Import Modules #Clear Terminal -import os -os.system('cls' if os.name == 'nt' else 'clear') +print("\033[H\033[J") + +#Ability to Remove old Map +import os #Setup Geopy from geopy.geocoders import Nominatim geolocator = Nominatim(user_agent="OpenSkyBot", timeout=5) From 4221e2b0df8029321016cc7f5f72b7cc8b13dbcf Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sun, 16 Aug 2020 22:18:36 -0400 Subject: [PATCH 041/124] Specify exception for ADSBX request --- defADSBX.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/defADSBX.py b/defADSBX.py index ff21d6b..101990c 100644 --- a/defADSBX.py +++ b/defADSBX.py @@ -13,8 +13,10 @@ def pullADSBX(icao): response = requests.get(url, headers = headers) data = response.text data = json.loads(data) - except: - print("ADSBX Error") + #print (json.dumps(data, indent=4)) + except (requests.HTTPError, requests.ConnectionError, requests.Timeout) as error_message: + print("ADSBX Connection Error") + print(error_message) failed = True plane_Dict = None if failed is False: From 9c441906d163da599cb07d76c1802af89c517583 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sun, 16 Aug 2020 22:27:29 -0400 Subject: [PATCH 042/124] Assign original reg, remove whitespace --- NotifyBot.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/NotifyBot.py b/NotifyBot.py index 73f531d..0b83d59 100644 --- a/NotifyBot.py +++ b/NotifyBot.py @@ -1,10 +1,10 @@ #Github Updated - NotifyBot 11 #Import Modules #Clear Terminal -print("\033[H\033[J") +print("\033[H\033[J") #Ability to Remove old Map -import os +import os #Setup Geopy from geopy.geocoders import Nominatim geolocator = Nominatim(user_agent="OpenSkyBot", timeout=5) @@ -59,6 +59,7 @@ geo_alt_m = None running_Count = 0 callsign = None takeoff_time = None +reg = None #Begin Looping program while True: running_Count += 1 From ae6517c65414e985d6577c73b8077880bc701344 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Mon, 17 Aug 2020 15:10:12 -0400 Subject: [PATCH 043/124] Get ride of TRACK_PLANE now ICAO, all CAPS --- NotifyBot.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/NotifyBot.py b/NotifyBot.py index 0b83d59..35b1927 100644 --- a/NotifyBot.py +++ b/NotifyBot.py @@ -42,8 +42,7 @@ else: pb = None #Set Plane ICAO -TRACK_PLANE = config.get('DATA', 'ICAO') -icao = TRACK_PLANE.upper() +icao = config.get('DATA', 'ICAO').upper() #Pre Set Non Reseting Variables geo_alt_ft = None last_geo_alt_ft = None @@ -75,12 +74,12 @@ while True: #Get API States for Plane plane_Dict = None if config.get('DATA', 'SOURCE') == "OPENS": - plane_Dict, failed = pullOpenSky(TRACK_PLANE) + plane_Dict, failed = pullOpenSky(icao) print (Fore.YELLOW) print ("OpenSky Sourced Data: ", plane_Dict) print(Style.RESET_ALL) elif config.get('DATA', 'SOURCE') == "ADSBX": - plane_Dict, failed = pullADSBX(TRACK_PLANE) + plane_Dict, failed = pullADSBX(icao) print (Fore.YELLOW) print ("ADSBX Sourced Data: ", plane_Dict) print(Style.RESET_ALL) From f287ccc496deb91c78087e38a9f98a2ac80a8227 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Mon, 17 Aug 2020 23:32:11 -0400 Subject: [PATCH 044/124] Add Discord message conf, & simplify enables --- NotifyBot.py | 19 ++++++------------- config.ini | 19 +++++++++++-------- defDiscord.py | 2 +- 3 files changed, 18 insertions(+), 22 deletions(-) diff --git a/NotifyBot.py b/NotifyBot.py index 35b1927..4501e6e 100644 --- a/NotifyBot.py +++ b/NotifyBot.py @@ -30,16 +30,11 @@ if config.getboolean('DISCORD', 'ENABLE'): if config.getboolean('TWITTER', 'ENABLE'): from defTweet import tweepysetup tweet_api = tweepysetup() -else: - tweet_api = None #Setup PushBullet if config.getboolean('PUSHBULLET', 'ENABLE'): from pushbullet import Pushbullet pb = Pushbullet(config['PUSHBULLET']['API_KEY']) pb_channel = pb.get_channel(config.get('PUSHBULLET', 'CHANNEL_TAG')) -else: - pb_channel = None - pb = None #Set Plane ICAO icao = config.get('DATA', 'ICAO').upper() @@ -54,7 +49,6 @@ on_ground = None invalid_Location = None longitude = None latitude = None -geo_alt_m = None running_Count = 0 callsign = None takeoff_time = None @@ -70,7 +64,6 @@ while True: longitude = None latitude = None on_ground = None - geo_alt_m = None #Get API States for Plane plane_Dict = None if config.get('DATA', 'SOURCE') == "OPENS": @@ -195,16 +188,16 @@ while True: getSS(icao) #Discord if config.getboolean('DISCORD', 'ENABLE'): - dis_message = icao + " " + tookoff_message + dis_message = config.get('DISCORD', 'TITLE') + " " + tookoff_message sendDis(dis_message) #PushBullet - if pb != None: + if config.getboolean('PUSHBULLET', 'ENABLE'): with open("map.png", "rb") as pic: map_data = pb.upload_file(pic, "Tookoff IMG") push = pb_channel.push_note(config.get('PUSHBULLET', 'TITLE'), tookoff_message) push = pb_channel.push_file(**map_data) #Twitter - if tweet_api != None: + if config.getboolean('TWITTER', 'ENABLE'): tweet_api.update_with_media("map.png", status = tookoff_message) takeoff_time = time.time() os.remove("map.png") @@ -224,16 +217,16 @@ while True: getSS(icao) #Discord if config.getboolean('DISCORD', 'ENABLE'): - dis_message = icao + " " + landed_message + dis_message = config.get('DISCORD', 'TITLE') + " " + landed_message sendDis(dis_message) #PushBullet - if pb != None: + if config.getboolean('PUSHBULLET', 'ENABLE'): with open("map.png", "rb") as pic: map_data = pb.upload_file(pic, "Landed IMG") push = pb_channel.push_note(config.get('PUSHBULLET', 'TITLE'), landed_message) push = pb_channel.push_file(**map_data) #Twitter - if tweet_api != None: + if config.getboolean('TWITTER', 'ENABLE'): tweet_api.update_with_media("map.png", status = landed_message) takeoff_time = None landed_time = None diff --git a/config.ini b/config.ini index c06f2e7..3e3b705 100644 --- a/config.ini +++ b/config.ini @@ -1,25 +1,26 @@ -#V2 [DATA] -#Plane to track, based of ICAO or ICAO24 which is the unique transponder address of a plane. +#Plane to track, based of ICAO or ICAO24 which is the unique transponder address of a plane. ICAO = planeicaohere -#Source to pull data from + +#Source to pull data from #SHOULD BE ADSBX which is ADS-B Exchange or OPENS which is OpenSky #By default configured with OpenSky which anyone can use without a login #ADS-B Exchange has better data but is not avalible unless you feed their network or pay. SOURCE = OPENS -#ADS-B Exchange https://www.adsbexchange.com/data/ +#ADS-B Exchange https://www.adsbexchange.com/data/ [ADSBX] API_KEY = apikey #OpenSky https://opensky-network.org/apidoc/index.html +#When using without your own login user and pass should be None [OPENSKY] USERNAME = None PASSWORD = None [GOOGLE] #API KEYS -#If static map disabled will load up tar1090 ads-b exchange and take screenshot instead. +#If static map disabled will load up tar1090 ads-b exchange and take screenshot instead. STATICMAP_ENABLE = FALSE STATICMAPKEY = googleapikey @@ -33,10 +34,12 @@ ACCESS_TOKEN_SECRET = atshere [PUSHBULLET] ENABLE = FALSE TITLE = Title Of Pushbullet message -API_KEY = apikey -CHANNEL_TAG = channeltag +API_KEY = apikey +CHANNEL_TAG = channeltag [DISCORD] ENABLE = TRUE #WEBHOOK URL https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks -URL = webhookurlhere +URL = webhookhere +Title = title in front of message +USERNAME = username of user in channel can be anything diff --git a/defDiscord.py b/defDiscord.py index df99369..3cfaa70 100644 --- a/defDiscord.py +++ b/defDiscord.py @@ -3,7 +3,7 @@ import configparser config = configparser.ConfigParser() config.read('config.ini') def sendDis(message): - webhook = DiscordWebhook(url=config.get('DISCORD', 'URL'), content=message, username="plane-notify") + webhook = DiscordWebhook(url=config.get('DISCORD', 'URL'), content=message, username=config.get('DISCORD', 'USERNAME')) with open("map.png", "rb") as f: webhook.add_file(file=f.read(), filename='map.png') From 3967e0d2c44912c915eb6cb46aa92e7459ab4d86 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Mon, 17 Aug 2020 23:59:52 -0400 Subject: [PATCH 045/124] Add Examples --- ExImages/DiscordEX.png | Bin 0 -> 122314 bytes ExImages/GMapEX.png | Bin 0 -> 50231 bytes ExImages/PushbulletEX.png | Bin 0 -> 35698 bytes ExImages/TwitterEX.png | Bin 0 -> 281359 bytes ExImages/tar1090EX.png | Bin 0 -> 463127 bytes README.md | 8 ++++++++ 6 files changed, 8 insertions(+) create mode 100644 ExImages/DiscordEX.png create mode 100644 ExImages/GMapEX.png create mode 100644 ExImages/PushbulletEX.png create mode 100644 ExImages/TwitterEX.png create mode 100644 ExImages/tar1090EX.png diff --git a/ExImages/DiscordEX.png b/ExImages/DiscordEX.png new file mode 100644 index 0000000000000000000000000000000000000000..ac304ef7ffee905d575dbff8cf731a0fe56c245e GIT binary patch literal 122314 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

aN(w@0}>)!qB)*-jL&O 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�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 literal 0 HcmV?d00001 diff --git a/ExImages/GMapEX.png b/ExImages/GMapEX.png new file mode 100644 index 0000000000000000000000000000000000000000..14d92ed301e077c896449697d5b2d3f55612b145 GIT binary patch literal 50231 zcmXt9byOAI*Pa`sbR*p*4bmlzG$+bc3y_sw+iK27Y`2)A0HoKk6u?Fn7d!FK$(t4p0!VK z3J?YkQ};X-8l3kfnLY-;0qyzawYEZ~a720(p9bJUvDtk!Q%`OXTVK`RTA_ zVjs-I`^uwhL8nx%6`BsFGnmq6Fj#-Q%H?1GYo)QgM7p({UhNnle4C?lDlvx?|93Ym z8qm^uTlm%3?7g^g!sEu?!qT`FU+^Z7qJkG{k<;_&Pwruu2j$DJY_6eSIdM zi57Vp_#8gt=45~2p4hcwh0r4fSZ#-|c!9tvj0Y58M6mtgW!YN&e{b}ZPn#pO?~kp4 zmgd$KZj6R39QE(Gv`&Bf_NO~}Vhd{}ukisIhl^oUBQ3PPirS;k@T9)7h?u+XRWg&q zbkcp{-oX{W+q(nE_#aP(>Ww>9bW#1jTVgaL3G&HnuRxjG9}xQE`+B;ok@GI#(15wy z;0;=P8??gprfx;FVPl*|tF5DHvBHR_Y6if%_FaFAklaHg$&$GS?mI30l{CJyg|3}b z0E-;{2S*@StUC)&W+CYXL5`v9Z8 zyLlsYb$CGv7%8I#wzRb=^6rcdT|0g__T>P^3#;~cFYY7OuY_6?O+ZdF7X5v%E$&(m ze&UmX`~A%>Z|!Qhs2!;vgdwXp#DJb!cn%Y=v~Hn9-r=U#*}Xt8KhmUhZaY zlz0z<(Rr-^wCR3n_#iKdx)-;kJWdaLfWkEbSF_JI8w&%#;vi`2z<#OyY#m0aj3ni` zbA()-5D;E9)r$%%Q&BpAdcmJW}UYPQEUyXu;S{vTMr+9`N6fD?<6xc}KSr=L2WAfhq9R-?q{S5l`6* z0dji4&GlC!5$)N_@jhFC7gGl)IO*c6F1*?;5qQAz^{aFk#Q;k!`Whwj;7S`oX`xyT z)SrVyA7!qAVT2K zmez_1aK`^v`6ZqoFeVZ12$TlubgR586uiFFJpf*-i+J$+=?)G^WXua|o`Vn~1+#!9 z6z808QFr8V$K65|Qe*Fb&CciKL7k+M=_sXZd{7<8LtYp0yrh%j0&*c-0EMB~+AZ3D zV*4`;?AB(CPLA$8XyflWw))7s>)J$cR#n_yq0?Qou*NEzb#VAlw=kPYO=qS;lyEwe zrLYjs>3RCYTXF+iTKBDK!yyeGTOrrFLS#eY!53TE>>U7Ml zZB-4ohZfBJfL+*kYQ1#typ!a0BZ>eJg)$hQ-V!U6FMqXP$}TA0r%1W@q=5a`>II0_ zvPt8HR%m_uDsSe;rB0Ad!`)Ya$P6|!(x|=<4csrnStgQ(5ANJnHtFu&YS$Y7;Ex6d z`AT{VzhB+6dq~dNVee`pnZkk*A3nYj4fWlN#RJib!{_V>+Fu`2uKYUt_EF&~^W&RG zoja7zSAvwQ(ikBR_w#+yvDKityCfMDnmU24Y|IbQ`>**v2qxOWlbw~yC$)*%D|8Hb z&jvF*N&xBg@zTG{zz+Xb9}vvb(+nLuc|VkBhlYmc{u}43;KJ31yRhMZJ?jSdryYlm_-966oa6gP5OmVI9*A@4rYkyjhjmDXp5>U-bc9lImU|&UB z3Pk(C=ZAMY<|<<$6ES|11O_e*T3g{@APoHDyFLmkm9E22`eOnA=HQ znWn}MumiOH3d%z6Ppd`;-L)AISS0efwiFw^VoIdzw*A184+=7p!knrMBBUSk$^A(Z z(T58vp79|Cr3ieK173D;RQIP4#vmCaV1Y;|o~(Bxz`K2L)x6SJ90zC)DYn z>yWpRIS7*(Av`VXl>umiIPd_X+_CfM7~r2%A!cU{`e(6Pi;$XVW*lQng$Ek6Ur@g)+m5 z=KTD%;4c6yH*+aBw{C3g%kKyvAb-zx3!r>AV0nlMBUVnrX_k4zD5?`c$_0W=(w(S& z)MNaZJT^8q%3|{A#FKd_MNsi>5g&|hZAIV`S-~*d#(Pysz{9W~4}uR%e3!BTKj@R; z0o~}+h5xxYh|ry;rGFpdP|TIf3{w#}t=r_e5@S9R({*F5PT7Z+4 zWOmXkW3dAnm)uW*`j2_%Pt~qNO(d5ex2k7p_QtsZ3*wbBW%sD7R9WTE#aw8bRs0GS z(HqH4j5F5XCsV%h@qcqtoUQE4Ew;Wel2<1VJI9epbiuf48Uq5dp~Ipba|zOjd?N4N z^AG$gP?*YyBYUhMar>9+48t=`l)c}QQxzHayOZR{Z@shP*i}DU)mr5THT9%uoqN9& zl>@SAp?j3@S_#x+v|L1Ac3)qG3Bz$;Ck!wxahc!0CC=ql3zo_&bCd&8N$kqMZQTB4 zRuX#aoj1ZhENt&CWsQzdoxCNM*J9Vlbwd}zq^S1yxH!3K$_D~gzBjbsx;Wonc_Fu_ zewyFwlksSF1fWWHf*2zddQgd%Dk%UxfcD<+Bh>{2aEEI0Y6H>kZBHft1Pwf`*$++E z65t<)fvi}OfKSyk>Q4p1D6l2eX@iR8FF*nP)R+%Ctth4G9R{#K*TAGl9Pi>a;<)f11VV~6oEzD1cO_a{P6Euyp2}rk2_R$YW zz6HX7i;5+N&(H`Bzvf`4R|rWAK)}gC+1u2QvT1hizrDw`v(Q}Lw5o-e){9Yy zi=YlF6ixiwf6y2CHsscpJ#A@5)>}jtj0)UBt3I?%SP%Q5evOp~9JLasgwT%qFkF#_ zn$6pUT1&2K_z8&Krem`;uAmlB9nW3bY83lc&5NH6IAyIL9;?-R_@<^n$zC2P1t&I3Txa_`~)Yv7NhEsaQ|;g zto|!*T&vJ+AK9BW?Z6fd;Vy;HiRT=WDr>KNZPmT~{O-g;L?y=RuKrL}nh?%oc=jKR zuzz|Ci+FuS+p6lQv>$ijl#Sl!WKdUyQ@8F(Ib3AKF8ibEM%*|lpb*~sh6sH_WV3!z6JfNpbT^pDGv^shGt3O+9cANR z#R1O?q5D+7aIlKNEX7*0UY<(S@vB@xB79F$$*D|*FO7ST9YL)7vUi`qw{t^hhw|jX z?Nsp6e-#q#Om>{Yygr<20#-k(sF5WY6)*m%>NdwyGuODPNixBqPB@7p%2)ocfPk#zBhD<<- zS9iG4yVwFecU4||7J+rv|0|wxxennidn34y9R;9{Tpu0^mBsTGbqyrow4>J%heOj@ zU7*LLE<7@!sBz&VFB)-5LoZqIkp4gxFYF^>|K3eOSTZ1rz*=#9n{65+Bxd;B*Lgh* zc)0$w8-!|Hq2=b`zKnWH7=-CnFW@(xXsj63;m>&&|fX zuJ)3+V};$5yp$rSSe*Q__g+f4Rv~|R2`qM8-+1-G&KC$fAjP&pIj}okrKHFDkZ9rA zA7@9Xn)u9B_prr0`s4%`Jg-(4Sft@D0#CTsa{i-0QlOvPVd@Cx{R7D;2k%?@$d)$C z27LO5RlnUt`3z{e%QS}~ewdYhIKXC1yb1VH=R$$spcs_lh&Dd{&4r*t)w5r%ix*kh z?hU8|aGFK@aYeoS?v4xUUQr3Dg`-94PwV|{hY9!%60l5m>8_ojILI<(jko4F)#PG7 zxpDOts6PM)p7sxkCx%;h`!DFO0y}*nr$r zF_tjk)YP|P*Yn-Avhc-Q?PGh#8fPgK#AfG5O{_k6Q+sP;ldl)qGh6+ALkG-)p{lC6 zk)BFJMlF66nD{)-SrEH=g{jdykXM_K=v9Qh^!{+&j*JPer=C##WkPTl1yO|0XS+r^ z*h?@OO9)1k=R=gh0BZhJiJx~YuK_U-Z7L?UyT!a}UlJnbt3z`CK4?cAHZ-#`ceQ$W zxWx>wHb5ATW;=E_>!92!#{dGVF+N&c@ztixRA%O4Oz%EPlc}lx^N^vBLAg4Oe#UT9 zX@mM$$w&}ZYUVJ>Ec)}p%5llFcpwv$yWueSBZ?@xNojw3L>h$H>8<-}!<4`eEz z^zXN1mwNkrQMBeD**`_e7MwR+W@mQdwZOF?nf&E?Uw$JO- zGeD2xR(sMvN;G~+b_M*C(^d_+d^HCF`~&)Wpp){qzfbWQ{*Z+Unin0A+qWM@;XL2~ zBL^VHU-Q4AxG3*aBHX$afHLKPcIFvNlU`nvENw>toYjr-`t87KflJ}Q~Y#rpk_%O*r=%TdjE;9oXp4l3yqJ;2R>WnPu6-SU7LHk`w(gtMe`oe9SgzF{$YWccn*4 z(K6w>hrcv^E%-42T431K=*~t(nO?)ikE3_1Ue~kzL2B@eEb)G$Ovff5mx_RYwdf2)XP;#{yxspLNsGEjc*K_h_;j5b?_(spfA4p_57d4}W}(Eaj_Ab^*>tpEh0 zr+oY?qTcWMYk%VpUwu;W!F_)(CyJ9S)*PhT$=vyL5I*)(7Lf7sR%K}`Tu%{w+vn|e zh08KZE{QIb%==6{h1W>gEqIPFM62|cENUWzXShY+G#rQ*%{><4TYHCIr_*(-MUwlb zgTwr41R$Y4-AI+G7W+}~H?->$b@{$&>76j{H*m;GO;5Y~385CiB z_9jU;9F#|-)0hhI#knNs3X!Coach^WDy=S8a*D5#kx z@|pxALtoDH3L8*}*4)6<;zc7a(HeZ|FPW-9zMj`0+}=zbnC(YF=IxMhJU#EBW7V?k zVS<)EiFVt}voX`3W?3Yt=j6KOa`tb4A%CKg7RC14b>beMP-eS(GH&5KmD74JCB;3Z z*r)HWgg0>_@70p_+%H*PrbOdhTs#A9d|vNYR+d%_6^}8Q9?BhP{|aVJ(zDd%k!V}_ zBK1$fB;q(xRA%K>VfddvOtR`Go+fC|fObbCz3Nv$90C^JgMHWU!{{Q=?H&d&hq=@- zN(Lri!R#yE?^?LVSP&gz$#6H+etL1^etD13K760^*dwDzt!x~OpekH zkEt1DRT^clIXUcO%qo+jONOd)krzp6cBt@}?BCi!jla*iPko_t3x^tNYd}CVVasx2 zd}mSI5r(2b2GUun?Ep{uO&3~2-{Wn*m;ZerMeE~19NbYvR9MKiFPV-BYcgPnIda;t zf_q3DIH0X;$ALZGt~?UGxz5-BhRIU#>r($}I=k{yqYVDyLdZZE)Axc8D^y_y8eo!- z`qI*>cdlEPG=q?`d+z!zH#Vc1y1dl}%a5qHtI#_5(SL?A*(^(*&6@ zmJ3DZ7&6ch?W7uJ;PH76w^&BCH_=1NPny(MjJh` zj2AtaGT2d!-$IRw2Hnlk+#|#U&h4eTrDnyL8IH5-!Ynh>T%J9JZz>|&qK*h(avAu7mG2E_VK+ML< z&EOR!ii!1QpI$oV#@{V2Wun_F6CxY~Y82)6oOzWAv(J>fiGqxX_DAtC)_YRW+2e`g z*w`M3tR>75%)f`IcUSzXRp3_=>a?orsa^6ndG)!H?z}uJ`nr4dGKNYfNuxp zDL&>TJdj@(82|+}7k%jUh)+8ap{e>;PQRFW(%R@`!SLL8D9JDDKjP@`@Ssoavw4Yh z#iAg})%3hA$RZVHo?$&8$F5xqg6DAM{``T=E8|=&wdf%@^kF}Kh*4qOy#*c@7%{cU zETT|Mt+nP7yCK0-4^l<=`azG{utYJsvAw|9N|0(i-%I+NQ4=9T%WbiPFe0GA8~r6Q z6hk9jqHJf=XwK*`gb2JN9+QsU#WUtG!M=n+;K;+AoVlM8W_ikLB$;ElD&BOs?lyJ4h z_wF7`=yz5a8R)^oc_+iYz!!c|FkwKDe4<~`3+EBn$QAa7zF>`8DvZIrcu zThp&o9V_ghDVfATy;@L=G1r@2Aw9xTHYKL2+ojO_4x~zXEDb78n2|5xd(1Dc=}&Vi z6}C&;-_D_2*vY!m(n^OsOkE}%o_}5&ysIEo*;1zw2VKG!ZWh4QE;G{+TRRnspqMIJ z{dAZB^k)+}=8~^8sdZkfdwv^+G^DO6LuIaZPg#u=;07%O>?hRb#0N}n_Fq=RGbAzs z=Il~JIIkO4s^6K}kvEv#Z5`=*1NHo^BZ0|UiNrN{3gstJx4_F99fmf@|+JS-&W-QnD4i&(zfWvJZg#sd2 zLB}ZBbR$n3>5}%D6MDS0^2iNTPwfsf*~HOzj2<51JU9THIJC3tq@bOR-oOdBqnG@* z1^a)lUjsSOg3nRtQs_Axa@D_Ci`hZ9fF*4R#KSY44Va2Mu>Gb*Q3rBK=7hTbJ$~#0 zaJtSP_^dmyLpl(ZI{HZ~@z49eS1*cDM2`YWb>}j$0*?JyORnb!GDcE1O?%tb##?p;*n2k65~R;k~7Ky-CP z`)b)+Md6NmA=0RkIFBt9sE_)Vs>{zi2&T6(kP&o$3m8?WL9TEHFI&2Te6cTCa`Riw zEfJ=_W)D{rayeB-KxFI#*es}MS{dHWb|GDAF<;nMU7is-KLh>31pM?X86H|tZ&pAB zu&s5@+0LBS`UIrAv(L)Hmuc;-W9F#i{(oHp4U)5$Wye0Sn-) z9UFdN53f&n`NIlh2tzbvjvp_`PQzq=wNRN2SpCDrbD9jXNvovAMDl#?kl(l^;UQ}M z_)X(zDGFy7X+;fptO0GWv?USpc}Ymg0^aq%NBb7~u4${P3>Pr2=l@d68vxrLR$F8> zOf$-5nBGLp3+7C#VWDGffOHaj``}+mG-Z|+k^Y@7I9m+u&=D5hT%FNPc8^xO|1vBJH7pV>DE;FYtCu73WgnwL?j{Ik|D zrTxWh93@)btEzWBG~UPn_2AU$3w^EE;RXj6T^l8cEqHcpN8Az1lM%i!Wn`FjJP zb-KhG$O1ED*;hV~&i{_7-fP~1CGTC!cmIWv{v~e`hv?96hNy}<`iEJNQ=_F=0=xvk z`HF)q?b3YKUSg%m;&!59rh_-Z&w3aiM9^28L z3{~Qz8PT2d_u&oz!nvhY8HUtw(ghf0{ao?%J6!lh)$<@_03$bhH(GDBwuk*j|ANd- z8z{(Jv;B;l)D}M4{BD9G_8X0A$Q>$dz;4+-0-1q0I!`%LOAy%gxt$hkZjz9|Fcrn* zR}|W;v3vVmFtCLZjv}da^W2dEpxW1JJuPea1fo>`s`G3Vmk?-6D79rFv%SR&l%=|B z;(|5XLYYBOU%zX=??x^R*aahe&Tx52r3XZF7%)nqo7|T1VpFv3y|?Cw3xg8~c9hn4 z)hqrC6bnU&_z!@+0;r=pYwG}~%1Q-Cv5!wxsov1uzdfKenn@%1+c#=!${+T;a6wgR z8O>k=Y8?*cma_oCguhz!PEULf z#&$0svEp9ug_Rxg|6G7?Src4JH@fLvxB4QajB(E!z$kz@VL;McnRm_P6Bg{R2Ao{- z8q1<_AD9Z`!V5RACYZ)tUx8Ojr|ck!q_@{?!M2P*{CiK=~93 zH8jA^0VOV=09i7kW2DHb4=lo@AwyTR7WlxkOa98jko4z43v+?1U#H5GF|%F4UylmX zB7SnIqqidGih=#_d)mJ|r_o=WkY$yDVi`@_G4Jrfj{<9#0&05`AEm%N5|5Lk{h~#9 z(gC4L;*=S~B4=S{JKmwgpv3leLAT?ln0D(tBB<;3uvqa9Cb$z+e3^;NL#rkvVsdg{ zTDHhuihmx&wB$_D&yw%6c57cQX`3RLPx+L5{5|un?#|)0-;k9P>|h*k_=dL8<$FI` z6s9WKSW)5^amCLV4frs-9Yl$-(v5rR&avUr<4B7TDO5b}mm>*0!9vLi;(BN=6bIL~ z59L=0zHb(s67u03Nq^JM0m*pNC1i*Hl&${tN+#o6#s#Ika3X{46;lTNDC#f%t$9NN z9)ccbn)>rN(FOo+OLj99zfjaA0^~7W{ZUFkEW_82hVzh9zj{V!kH(4vlD;yryKb9+ z#h|SPh(JOS9K{zWMiUEoiC^ z))P69IE2*Yv5)Jb6#}+&uDy3~b+88d@zB#0>^D9cc441{Hm*vez}*+4?DfaWLGC2=ql`d3G**hC1#PI4JjC`L+)MvG z+7Dbr%2awK)jKG{Koh$a1!jke^O*Dovn^l>_)P)Ue@cnf>{syV2RkX3nI`ZBqZ*}h z54RCi4*SH>;@VASy(ES2=x>6s4nMy*G0aQC$YUiu4*FWdnbN=2bMTGcDHA^f4Ub{m zVKwKSBNuF&7nV)+ZS)VykXd_%N94uc)!V#f$gbTk!sMl>&HR z-q&D_WcDlj+Q>mJ2Mt^h(Ss~Ni`zveL)Lp#82F--hnmzqG)=HAw^PXCyd3KijPptU zkiWgO+{JOt)?ejTwANiMJbR;R;)52P-pL0O_(j+=)$@lNX=?FBdVp-AXXG1$SgX4O z4j&vDK;@bRP1`+=kGb_rU}$+=JYHggLwqx9(gKClzZrnc6^_>?2kN$ZvclF2uzjO8!-Bmg-jZ_UHsj4~05bmoaB|p!kA4e?;|tuSLl9$tSK0VW(vOW zQ~vVnodW0Zpu|?XV0)?dqP-mO)_zM*w>RsJvBXHOu{kL~rmfrG{fb4d#eaz2N4dM3w2II6*h3{V#s**Bzbp)+Zmvh)l zuhF=%&42+JMtT^6$8!iD_GZvNF{aJv{3qJ0*mvTD?(rz~d_n?krq+vOepDeeHPPrs z^DLrU+y>4cM;dS4sxT!FT6zHo5)8`y0#X93?{#1nGSG$%5dSKdY3k?jNfe-26bf?+ zkum@<)&Z9tK>A}kxuw%Gsj_gene2x{zRGSxQg}}DsgrkLYcx#_I((c=ZBDFxxY-v6 zzM7aW@2NhfA*jxzZ6fVvp; z-ECDxqtb1LPp>0X5I6r=9Fu@U;G8G!)ufoX4U7_ZyL&sC;&Tm@3k^?}mxFO54GL|Fw;(;afVkCC5*W)fRL@DW;CL-f-(pm(HO4cA&>Y@#n%7_AGjXML@CkCaS6KY+L7fuH$vXo+UFLJ%~ zaSB|WTUA)C=wK+>E6WkHlzptYv?8LJxlf}RPLerN8q$&S*kn~LnqTYWuC91xJ)m$t zS~@xu=q(S_2*6}MGE{dpxH~>Ky{8i^RqDQug?>;!36zVwc5>#+q>MmnunCsqEa|3_ zNrUjODx;LAW&B@F&}}{!6+kx_6iWJC0t8eNMH@g1QiB}(U7cL*ET+Es@Ob5eU)i4+|Kiu&nF(YsSy2S-|y^&u39xiazN}AHusdrLpK-{{=wE7XKTNOEuChqgtAv ze@h1wC#oIBHGm?H1(_a$E4JT8ZUS-?$3+rO(}WRjua|!n6SyQn@w!cRGjq#o7X~Km zc}=#(8iZzW?z;K4EXTYejhBO}+sQSLn zm)M}>RSplUjTq}~x6nxNhn(ptde0oAI}!N4#?j!g>cL+!>DmTOUvgLm0SUcRfRXdW zFk;S?$Zz4UZ)x9|7ZyUw2T*YUlBbw&>1ChE3E6;mz_Z5y0OymO0Sswb6|!3xoF%D7LD@ zBI=EP8RucJ>81{oxqr|bCs#^&$bonm62v$)moR@CL&M|9@b?!0C#dT1-9>+(@Ou9+ zhg3(TK$J>fp{&mgfs7o5ZcVCH@WsguNd6d?T85zus6$w206vUUEj< z1r^{F85Xw43$w`6e+70-&^g)RQDS7x!KD@M`0;s<;zuL1DUS4K0cQTWY#d3iiuzqs zFPDv`+BuL_2qHgHF;F~^3s*kB&U5q`8}V9--VZwSux;7aTp<8o+J3ctvB0^R+pd?6b>e~x3_Js&l-@qL;tD3V8oTnCA|n>5CpP`46Q+syE2s*Ws5Xp z!JqyP860JX-$XAxh$RWiBW%Y7jQbjZO;yx3_?)Hns~Mo4mTiR!)CF5iW&xIe!R-mT ze{zj6OZ2YPPG$Mg;EZmJ+fa>hVECekK#NRFJbUte4DdpC5G82GbQsJ_3htNq+%36U zcJ_IwT3)?>Xzw)$b^@8CnN@*A8Y79OkKHcFN#t;;R8bVKTitUPkx$iA17so{RzH14 zWYZHm5!A62OCN+`vzI`IMvvA%Z*yNvLDD(g(m{gn2LK}y5SRpylc(rzTk_;ejwwv! zG3pLznfe~AySLd5Jo%2}JA~IOez79BrlYEIkYoBsG7i-7!HnBIi2k@B*F3l5>Bees z&k#Z9Gpn=F<5o_<=}A5B6lzUg8G;Cp?Q>VBI|^uim}Rs%;oGR0gp;6m?t0(q5Op25 z=YMi`{>(HVu)@pD2=K&~AG3yKraO3-Z(IM%I>N+;BY29+<54&*)PR_x@X?)L5-tS1 zDvZ&enTV(LFz_=_$E&}K;9ya$_0LekuF1{90Ci<$PVD!J670EH5{eR9UuUPir9{Y+ z%K6`DG(A~g-(K^KiG4yYdOxR=5BNbe&9e*~P@Y2WpR39zd2ylBL-J;r*wPH^*`<(% zJy3>l0$Tqtpv3A-T2;*#(;&yH{!RddA*Cae)J@z2ds2p9*B1D&BRL6|cy*(6hz%80 zE+tjtmwiiksnN-D*`VaA`EF!%3{7ogL`7}e$|;RWNy-E%CD_ETT?CWx=l1u^ zD<=aB;CWeHa(~I!5^j`gFTNaq(dP>W7)tXsVW|e5X|m*Z@zwo_LSz^OoIxzI!8KI$ zq9IqIiW)T((l+9}>`1dI|I>j93?-@b(Y)88tyDpSoD#J~gs;@SfahFo*eXA27bft1 zQJL`Wi&%TB@m9u%kHkb^lrIYMN zv?%L(IT?k8Vi`fIM`axSsRq<9hu4xuqcIu57z!Cxd;ZeuM>=i%m?jD5Q9?Oc5=p5r zV-rk}fMQW2VAwT@#wTU07z;iml%gYIHqF@^Ab#36KDzAX1;Ghvz`TL=@cBx$ z${lTWFgBfn_?ftG>u1kkq{Kq-SEaqFQZ^%ppts{R z?tT!n3$GdfY0th(1PZPHJGY89%@Q8}tz`x62|doWBP*JM26e@v1_T61viWNRiQtd? zsy8^L(EWCOaMJGgX9UN@y#Br%{#d-+bVThIa?_q-Hb;&{kp@2PG^kh;7JMY!@e-zKwKqbG*wV1uotw?zU zPf1Wm+a8uo|4)PRGpmqz6dKYY7-ow%4(6HhB@VxjPuoIHzPuzzeA0aQ0HC)8I~C_qKF~r zudUEcqOCwG>9q^8w zGbbK*Ng0K;8HVrS*BKo>bJnq_T!}D-C$19z$}_~t=J|-kilW7$oT}Nmt@CB9+CNC*>)NAH-9z_(E6kcqfv$ZV36dbLg*f|exY_ss+@_;sbeGTvrVP%6(i^SkV zi}thxOoH<$x%H2OOStk|mN#?LJ6dp2TST|cQ%wF!63_4))HO`eOVzJ?iEW~$_j>A) z_6bGh+P^$OiC`>Gi*wue4r7g-cUI56uEj_P+ce9}g~kC`b?2Efc?{5TRr5^kjtCzG zl)c$!!gOT;{<qJUI6| z0Rz(3@ywkW`Lg)RP+>c6JHLb2mv+hCHjRTu8MSb(c z9Or%YlQ8E5>j@#PH$-<3NYIYD712v~DaEwo#t zhDsmHL@d)tMVfz~4#$&$K6DU$WX1I-5YUYQhOt>=Q*1n>`(FVEPIH=P$Ho3On>3AB z@G_zag0`EG{AWKRDCAtm_^^2B+jM@pnEMLn;H>ZyR10+9ryc(aNlvDt$VrJu-M6qY z(5K{QIFzPh_URga3pj0zuY_;C1I1d*W2fny5Q)b$)J)v;1?XqwVU|$OnRW}^NKW|C z;rAhdU&%|v7nehj9n(~mZnY#S{zoP0Nn?<-R~hl0y3Jc>ZIZ`%IZ+-zDp0anQx8PY zHE+tvrcu(>xmFRK_V6VdP#!bGT~Y{C3mkh14o{?XST;!RV|Tp;JAGY3pi8^SIV8~7 zPt6DcJ^=?L4zec_pyBBLBG)If;sShgn!;GBIfM4>*3w81b;3Bgg-ESLH zgHkT>`!2Quu53x0g$1bGQepAr*EJa5oTI1|j>1<-j)I3E{YSX!ReL9|xS&q@qWAy~ zWkYuZCMuv2UpkuNIMm&4=9uvY*xyg1pah}E_gAvAZ6=NW3Txs_pLk)7W*K*B45^LK zY{3H}6Ppe871;Mz(yNKAYdRZo|LhSxp5Pd`2WB!iEp(Qli8rdR_L+_!O`vwD9}%^j76=^KsB# zA8g+mSPcD418j&T_?Y?6_c17uz?Y)@Si}g3XI{i2R5Gw?%?BTbXl*#6ltxRfj9@1N z&ddSpr$9yizpoc}7hkV0za|Hq_0a0@GKztepVw8>-)-6q)0h$?0(AHWJ$TSUy+@*r zDw~WO+2@AVPc~0-iG|r|ahji?_ZulAr^S)4eJ+5{LeXB+gjrp*&J)DKNOla_q>zaP zI#W&eKg(fR;=sBzA!ztlzZq#UWgG`VlqvD?Etiuict9cms{)SsQJwJ4!VNH_lMl5; zo+2?UmX(#$f1xqW%_sV?#pPwwT$e*xCWqjtnlW~X_R^bJ$WGkQ`ar{XU&~K?L4j9J z4p^rxd8h4OY}WxK0+RDR1mm%Q!1iYF6G-Ml72Eu|Yl$8ZCYd7s#QzfIL%kI15b4n_ z(=^o(5(DrSQ)*R+ClKblZM+-CR_nu zCT+fJh%c?>_$5!8)iWO$`M>UW!b!ju;Hn3$UPMYG*V$;wE$Cr3Lb|uYRTP>I;0UeJ!aa#DZKNEh6v_?;{51nMETABW~j{g{d7&1!l1vflQto6mN%GZ-20Y1 zF9MWVqY!(7B03fHoOI)!jQP}nU+K|sJO}y( zvUls)?GW>qmNU{NSm~^_=WXBTgW*aLG)bkjc0Z!tVQ^%eS*av4L$UNYzM52ZoX`p{ zrQI!jYE|szF`2rzV+QeJ*S@}lDuMJ#5l*Zt;`rYh4kJR2LkM5`hxc)Dn&74>Ut6}@ z5I~DgI9K`dmqX)GsxxC;c+77Dg76i zV$Cl=cq7tJdeV=5RjxbqCRIalLjN4-W4~$2sPD)5<|1!pSi(+oEYcqY$YI-`E-9-+ zNOg}lRLsIdKvs(3RV<}W{4iX84xG%9YUv7Oe7?Re^LM{~4-On1mD6;nroN)?p$7Ay z7oTn1-zdXMyFARi-gB?Xe|F!59Mm#6^(Zu|=D_mI6n+Iw&S9s76co#=NX3 z)m|gq4cW3fEh;lNKS{!7UjZ0D+o*d9C3SydO6A>5S!j2#nSULB4Ny_uXIqE@e@K zSW5sJo<#8Dd1luVW-_I#y&j2`^&e6C2~Wh<*9=`oOT#6GwXDEfU_&qq=ShJZ;;PfS^0t$GrJndtZ9=QZb z^EytXe={9O^A%p=0`UA6J*$GcRCDpcHVYLXrG}8gv>dkGw0R575fS^xRZ+ zqhpPxEpHVvFr?g}y=)w3){oKawJ}<vNObk_v4 z`FOC$=*2(>D&xQMYdr6(t!cewWU%Uy+5jp))`&UqUhEL(!*U@NoO2#Sh^83wMob#$ z0}3=do|m8(^n&bZVKtw@c;rwfya!q}o~<&Q5>plnPjkyJJhKJR)1xv0CnwU$v)m_Z z)aeAg7tP@NI*mds-Xl|8K~p=yg#vz^cEzdqoO6XdW{exFVdG}uLZ&k)GNz!}t7X(G zSS_b?V1Ob{I6QiM5I>yMbKP8){kqe(HLGbt8Dyi707tQ6^?9Xd+96445{5I~k*qgE z-BIjL2)xX~LUZ7Fld|&S8EwEUx&Y4$?@)ddiCGFHlrxO!_|^KmBrbgiz$-9R!(6eN#ZHblh_hy_QZ}7*+k+nVEte~ zKkDtxNd@r`d-Cf5z1oA$FjQiTVMrUO-^JF zWV!6K;}85!r@s>7Mm^G2fa;uP2@w0b^al??fUDnm&&i4ZN|%KDgs%L@cR?JRE?BnIuG_R2bx*%<{e(gITe2b# zW{CSUQ&S09tb%50*wST#L>qvd{6Ct`f-R1w3$Q&fxDD>^?rwty5AN<3oFG94cMq-! zF2PBFAcMPm0>PaG2=L-$`S#iU1J&KPs=BIgoqHNymvlJn7e^(fsOX;3fuiss^F&4g zWslFBc<4~=omf1y<=$NovBb&2WUp7PFdaPvRlg4+jO=k_2a@Q&=@f$DIMc1$1e@{PCPE60>Z-lT?6~zkGt}pMz_RbGN=C^Jz ziFYCJMgbgOvlGED1hAb>_$~bXUHi;04C|zz)uh}UfBqi0rsyWJqmIP_3+KxuL-!RU zQVA*Gm|r?q6(Nz>93dE>AmzAnTUyHXbr%)XYDfeJAy+sEkWf8!==LVRXMw~5Liul# zMyGERaH6;HYD<%NgdtxNM)Dg48HusSNSa`b(~jVo3ZY<&TF5Z=V@Ay7-S!T`+j9W^ z1`@wpTg%;ZJlNMQ?UvR+0lI@6pU>VxA4oV^tdntj0PXXJG;e$`Bje=2E{yz&LLH}FeqfaGr z=!3f9#+HYzBqE5WMO|uILjBm24ju6gE9%@@ALEnUeEuS4jX_gM<7s|O&k_HSqeW%= z`SMpqmQ>*Xc>(eh+b(S-imvb4qBZ&-o&+eZ;QJ!9(7D^K>$LuDezfU7kY#c$QN<_O z+JQ+@dZz3OI(fI4`%}~?4Qx2^JSP^%wZbS581hq*nvxOJTE|M%Uv<`YjsDM1m0A^a zHoFlgPY-Jz2kF|H88B*<`D9bJ@1wNr+FyLj{^_aFx9l4P zs<|TE^`IZyNjFn$-=L-^Z(@IeP79;YKL85)52>&lxrj_MK5)^NVE&3gQ#QX)tmMw( z_kSrEa;f%rIiH?qXOH6_5`M%dEnq z;syTu)WGyH2gxL6;Y2#}euvLXK`m>gpW){Xjajl~)R*sP*cPShjVC2kR&WQ#%W?42 zqm*ygF^?%?NK7_sR)0Zqcw2ac%==0itz%`qe8I>DivjocYLD`3k7sB)WqkN&OHc_h zkv=Zh(H}Q!=2ah8`sCvrTG*PgSU-VLX7ysjX^4(CLG|$pBL#@=xQABtCZ3sf3-?1j z*txwvbR$YDf3kCEUhV}!gf)`E!i5TEzc=L}r|HAM>qI21ZHZA?R-L(NbEDnZD5+JU zG@H-lPADn1Ea80c#}$i9&{pBM=-VW7gW>bGPZ;FK4{WQeRw&y}t-(+>8p)8r(({eq z&zTU{^>^xbH1<{hc?}h)H3-YBRul3(0?^c8wQL+gaN{!JMx_WWDeiQ+&69#}k|UY= z4mWWjo8o7dL0{Ldr6a`!PQWB13v*6ISW7}s(_SUd)qqv^62L*{v9U&7@r^(2X#O`A z4ibBkJ#o*Vn+`>h_^($Oc~!9w7b@Lf?vH6$vCW!A$Ka#m^`cnyUqAVq(u=e@ZJQFa zrV-tY`JU=F7Ci#pzAbV;_MRWtOwQjz?*!+zEj|jMEz3iOgj48(-xpmWU2W3Y@HnAX znBunZkmW7*T^M&57~;agVV}UJeou4QnPpj25#`Gd7nCY*WgU}t-@ikUBl>d=l zoE1sTad8+Sckj2lP;YaMC`E~(Waq7ja;YO_L;6$TusRXyTyUeM^TR~VsU$gXP=LwX z&%g0tB+`hFCzqEe)@RqwHDi=ZD6}Ac3n_ZQ%oY?4P)VDI485UsBc9%EbpqZLeicb+ z!+y84TL;h!gAYM&)NI5geg;SP()F7*5IX>SHN8=tL75 zp$G?lx#^i84nvnI=^y2Jjz#g_!#E?iDJj_o$-i7BKytggj~MK8OLQLZ?rpL2j=x5i zqs9$DUTp#L0t{TnVL?8;@WiQ#t&m7qd0b(#>w1eS5BN9k<`oQOCy4O%0DE#s)3Ewy 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Π<2?zP9F4KSPN53)KZcbf}QW|mr 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 ZKVwnO#OMXmXJ#@0fv2mV%Q~loCIFqVAN>FT literal 0 HcmV?d00001 diff --git a/ExImages/TwitterEX.png b/ExImages/TwitterEX.png new file mode 100644 index 0000000000000000000000000000000000000000..fb5d654f5a5386ec0fe3dc141448b42a8621abad GIT binary patch literal 281359 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 Uvkox7T%9k!Q7}TJ8Ciq3vRJ@ews_hG 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%0D+`C*e#!79- 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

Yx5|47g!NE^TEK~f5Zdy7|?dy$Z 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

erujl6K9fv;mQFS92>w^< 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 literal 0 HcmV?d00001 diff --git a/ExImages/tar1090EX.png b/ExImages/tar1090EX.png new file mode 100644 index 0000000000000000000000000000000000000000..a0f7a0b903a35dd0883defc3f9af8fe9fdea1efd GIT binary patch literal 463127 zcmV)_K!3l9P)Dq6vkEr<1cTCcVC+qIv+XYKRuI_!Sd z^Rw61+H!hcOSUY@L87QciWEhP6f*#l00ANqaR5x7>FH4MzVDo>?&;|?83f4w^|iq1 z>aK9Rs_tLsoc}+fSS%{E(875N&-38>{=B~@pr9)so}%wIKE)LR4EZPEYWaDsUxSXM zXh%$BFs{zPQ$?gjH&Uu|-uv3ZxyQ)ZII@K-(yIWa0thJ)1U{6iJy(}T=x z(?5ah*m(Edcj1x89*19?!~-At7$zr%@!+=}f@vmTJ1(#JefQss?|u7WtY5hrM@}8Z zhRs{i+uMcx`(8&XnZWIL-HPA%_20s;|A)`wd*68on=ZZ-*IaQm{_;zIhwE>+9;0L9 z7#|u~3FunQGGRMVmI(+^yR2wK#p`U#_aQt#{9ZL&H(Zyl*RIcTpbP^AC2(-U zg&Qa&bcu^n8se_gU|Ru%>mrC*IGb~!ivVZG3lOmwe9wpOJ6P43#Or_YSCA0c^r=r^ zc-L+W?b?lPKl>?+zkU!e{n4MG_sYvLapVp3U9|)2Z@U$b|K{hg`qp>Ch{v(v{`+80 zWbwl1{}7$qwjg)n6t4TN-$Z8pns8jB@fAS;Wtug|b zK)~}HxKQxnqRi{W^m0-9Lxm470%kxnUt

?99AxNn~RNck{;`$|BUHgwSr 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 Wv{}(A*bdTBk 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

+xbB>CE0z6i@|;^Bwx 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 OmMXWuG6U=wq00T_dWDN4G=7F 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

ZeE9yiI9^N0m(AODb(E#YU3SP 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%0A)_cc*@1x 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 0a45920..615713e 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,14 @@ Notify If a Selected Plane has taken off or landed using Python with OpenSky or ADS-B Exchange Data, outputs location of takeoff location of landing and takeoff by reverse lookup of coordinates. +### Discord Output Example + +![Discord Output Example](./ExImages/DiscordEX.png?raw=true) + +#### More examples in the ExImages folder + +[ExImages](./ExImages) + ## Why I made it Made it so I could track Elon Musk's Jet and share with others of his whereabouts on Twitter. [![Twitter Follow](https://img.shields.io/twitter/follow/ElonJet.svg?style=social)](https://twitter.com/ElonJet) From c10cbf8f4e7ffaf0805a6a9052f2ee24985e274f Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 22 Aug 2020 22:21:29 -0400 Subject: [PATCH 046/124] Fix/Handle "gnd" being returned as blank --- defADSBX.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/defADSBX.py b/defADSBX.py index 101990c..6ce98bf 100644 --- a/defADSBX.py +++ b/defADSBX.py @@ -23,9 +23,14 @@ def pullADSBX(icao): ac = data['ac'] if ac != None: ac_dict = ac[0] - plane_Dict = {'icao' : ac_dict['icao'], 'callsign' : ac_dict['call'], 'reg' : ac_dict['reg'], 'latitude' : float(ac_dict['lat']), 'longitude' : float(ac_dict['lon']), 'geo_alt_ft' : int(ac_dict['galt']), 'on_ground' : bool(int(ac_dict["gnd"]))} - if plane_Dict['on_ground']: - plane_Dict['geo_alt_ft'] = 0 + if ac_dict["gnd"] == 0 or 1: + plane_Dict = {'icao' : ac_dict['icao'], 'callsign' : ac_dict['call'], 'reg' : ac_dict['reg'], 'latitude' : float(ac_dict['lat']), 'longitude' : float(ac_dict['lon']), 'geo_alt_ft' : int(ac_dict['galt']), 'on_ground' : bool(int(ac_dict["gnd"]))} + if plane_Dict['on_ground']: + plane_Dict['geo_alt_ft'] = 0 + else: + plane_Dict = None + failed = True + print("Got data but on_ground is invalid!") else: plane_Dict = None From c190e94ca9368866a749fcbbf66c191a7c151cb1 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Tue, 1 Sep 2020 15:14:35 -0400 Subject: [PATCH 047/124] Fix weird data issue, prevents from failing. --- defADSBX.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/defADSBX.py b/defADSBX.py index 6ce98bf..50f5758 100644 --- a/defADSBX.py +++ b/defADSBX.py @@ -19,18 +19,24 @@ def pullADSBX(icao): print(error_message) failed = True plane_Dict = None + except json.decoder.JSONDecodeError as error_message: + print("Error with JSON") + print(error_message) + failed = True + plane_Dict = None if failed is False: ac = data['ac'] if ac != None: ac_dict = ac[0] - if ac_dict["gnd"] == 0 or 1: + try: plane_Dict = {'icao' : ac_dict['icao'], 'callsign' : ac_dict['call'], 'reg' : ac_dict['reg'], 'latitude' : float(ac_dict['lat']), 'longitude' : float(ac_dict['lon']), 'geo_alt_ft' : int(ac_dict['galt']), 'on_ground' : bool(int(ac_dict["gnd"]))} if plane_Dict['on_ground']: plane_Dict['geo_alt_ft'] = 0 - else: + except ValueError as e: plane_Dict = None failed = True - print("Got data but on_ground is invalid!") + print("Got data but some data is invalid!") + print(e) else: plane_Dict = None From cac1428aa08e8c128cc424973752dca519a39faa Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Tue, 1 Sep 2020 15:23:40 -0400 Subject: [PATCH 048/124] Working on Multi plane version --- pullAllADSBX.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 pullAllADSBX.py diff --git a/pullAllADSBX.py b/pullAllADSBX.py new file mode 100644 index 0000000..04a6889 --- /dev/null +++ b/pullAllADSBX.py @@ -0,0 +1,29 @@ +import requests +import configparser +import json +main_config = configparser.ConfigParser() +main_config.read('config.ini') +url = "https://adsbexchange.com/api/aircraft/json/" +headers = { + 'api-auth': main_config.get('ADSBX', 'API_KEY'), + 'Content-Encoding': 'gzip' +} + +response = requests.get(url, headers = headers) +data = response.text +data = json.loads(data) + +#Test Parse +for plane in data['ac']: + if plane['icao'] == "4074B8": + print(plane) +#print(json.dumps(data, indent=2)) +print("done") +#Initate Each Plane Object from their configs +import os +for filename in os.listdir(os. getcwd()): + if filename.endswith(".ini") and filename != "mainconf.ini": + plane_config = configparser.ConfigParser() + plane_config.read(filename) + print(filename) + print(plane_config.get('ADSBX', 'API_KEY')) From 4b3ffeab8e5f9c27243fddbce48e75b01dfef393 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Tue, 1 Sep 2020 16:16:54 -0400 Subject: [PATCH 049/124] Basic ADSBX single icao vs entire globe json conf --- mainconf.ini | 18 ++++++++++++++++++ pullAllADSBX.py | 45 ++++++++++++++++++++++++++++++--------------- 2 files changed, 48 insertions(+), 15 deletions(-) create mode 100644 mainconf.ini diff --git a/mainconf.ini b/mainconf.ini new file mode 100644 index 0000000..c9d8797 --- /dev/null +++ b/mainconf.ini @@ -0,0 +1,18 @@ +[DATA] +#Source to pull data from +#SHOULD BE ADSBX which is ADS-B Exchange or OPENS which is OpenSky +#By default configured with OpenSky which anyone can use without a login +#ADS-B Exchange has better data but is not avalible unless you feed their network or pay. +SOURCE = OPENS + + +#ADS-B Exchange https://www.adsbexchange.com/data/ +[ADSBX] +API_KEY = apikey + +#OpenSky https://opensky-network.org/apidoc/index.html +#When using without your own login user and pass should be None +[OPENSKY] +USERNAME = None +PASSWORD = None + diff --git a/pullAllADSBX.py b/pullAllADSBX.py index 04a6889..88a7dd6 100644 --- a/pullAllADSBX.py +++ b/pullAllADSBX.py @@ -2,27 +2,42 @@ import requests import configparser import json main_config = configparser.ConfigParser() -main_config.read('config.ini') -url = "https://adsbexchange.com/api/aircraft/json/" -headers = { - 'api-auth': main_config.get('ADSBX', 'API_KEY'), - 'Content-Encoding': 'gzip' -} +main_config.read('mainconf.ini') +import os +#Set ADSBX URL Based off amount of Conf files +if main_config.get('DATA', 'SOURCE') == "ADSBX": + for filename in os.listdir(os. getcwd()): + if filename.endswith(".ini") and filename != "mainconf.ini": + plane_config = configparser.ConfigParser() + plane_config.read(filename) + plane_config.get('DATA', 'ICAO') + icao_list = [] + icao_list.append(plane_config.get('DATA', 'ICAO')) + if len(icao_list) > 1: + url = "https://adsbexchange.com/api/aircraft/json/" + elif len(icao_list) == 1: + url = "https://adsbexchange.com/api/aircraft/icao/" + icao_list[0].upper() + "/" -response = requests.get(url, headers = headers) -data = response.text -data = json.loads(data) + headers = { + 'api-auth': main_config.get('ADSBX', 'API_KEY'), + 'Content-Encoding': 'gzip' + } +if main_config.get('DATA', 'SOURCE') == "OPENS": -#Test Parse -for plane in data['ac']: - if plane['icao'] == "4074B8": +while True: + if main_config.get('DATA', 'SOURCE') == "ADSBX": + response = requests.get(url, headers = headers) + data = response.text + data = json.loads(data) + for plane in data['ac']: + if plane['icao'] == "4074B8": print(plane) #print(json.dumps(data, indent=2)) print("done") #Initate Each Plane Object from their configs -import os -for filename in os.listdir(os. getcwd()): - if filename.endswith(".ini") and filename != "mainconf.ini": + + + plane_config = configparser.ConfigParser() plane_config.read(filename) print(filename) From 04379e540aa05282dd3cbf0b78112eef610d1ee4 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Tue, 1 Sep 2020 19:35:19 -0400 Subject: [PATCH 050/124] Setting up more for class etc --- planeClass.py | 259 ++++++++++++++++++++++++++++++++++++++++++++++++ pullAllADSBX.py | 33 +++--- 2 files changed, 274 insertions(+), 18 deletions(-) create mode 100644 planeClass.py diff --git a/planeClass.py b/planeClass.py new file mode 100644 index 0000000..a03836e --- /dev/null +++ b/planeClass.py @@ -0,0 +1,259 @@ +class Plane: + def __init__(self, icao, conf_file): + self.icao = icao.upper() + self.conf_file = conf_file + self.geo_alt_ft = None + self.last_geo_alt_ft = None + self.last_below_desired_ft = None + self.feeding = None + self.last_feeding = None + self.last_on_ground = None + self.on_ground = None + self.invalid_Location = None + self.longitude = None + self.latitude = None + self.running_Count = 0 + self.callsign = None + self.takeoff_time = None + self.reg = None + def getICAO(self): + return self.icao + def run(self, plane_Dict): + #Import Modules + #Clear Terminal + print("\033[H\033[J") + + #Ability to Remove old Map + import os + #Setup Geopy + from geopy.geocoders import Nominatim + geolocator = Nominatim(user_agent="OpenSkyBot", timeout=5) + + import time + from colorama import Fore, Back, Style + from defOpenSky import pullOpenSky + from defADSBX import pullADSBX + + #Setup Config File + import configparser + config = configparser.ConfigParser() + config.read(self.conf_file) + + if config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): + from defMap import getMap + else: + from defSS import getSS + + if config.getboolean('DISCORD', 'ENABLE'): + from defDiscord import sendDis + #Setup Tweepy + if config.getboolean('TWITTER', 'ENABLE'): + from defTweet import tweepysetup + tweet_api = tweepysetup() + #Setup PushBullet + if config.getboolean('PUSHBULLET', 'ENABLE'): + from pushbullet import Pushbullet + pb = Pushbullet(config['PUSHBULLET']['API_KEY']) + pb_channel = pb.get_channel(config.get('PUSHBULLET', 'CHANNEL_TAG')) + + #Set Plane ICAO + icao = config.get('DATA', 'ICAO').upper() + #Pre Set Non Reseting Variables + + running_Count +=1 + start_time = time.time() + print (Back.MAGENTA, "--------", running_Count, "-------------------------------------------------------------", Style.RESET_ALL) + #Reset Variables + self.below_desired_ft = None + self.geo_alt_ft = None + self.longitude = None + self.latitude = None + self.on_ground = None + #Get API States for Plane + self.plane_Dict = None + if config.get('DATA', 'SOURCE') == "OPENS": + plane_Dict, failed = pullOpenSky(icao) + print (Fore.YELLOW) + print ("OpenSky Sourced Data: ", plane_Dict) + print(Style.RESET_ALL) + elif config.get('DATA', 'SOURCE') == "ADSBX": + plane_Dict, failed = pullADSBX(icao) + print (Fore.YELLOW) + print ("ADSBX Sourced Data: ", plane_Dict) + print(Style.RESET_ALL) + + print (Fore.CYAN) + print ("Failed:", failed) + print ("ICAO:", icao) + print(Style.RESET_ALL) + + #Pull Variables from plane_Dict + if failed is False: + if plane_Dict == None: + feeding = False + elif plane_Dict != None: + locals().update(plane_Dict) + print (Fore.CYAN) + if config.get('DATA', 'SOURCE') == "ADSBX": + print("Registration: ", reg) + else: + print("Registration: ", "Only shows when using ADSBX!") + print ("Callsign: ", callsign) + print ("On Ground: ", on_ground) + print ("Latitude: ", latitude) + print ("Longitude: ", longitude) + print ("GEO Alitude Ft: ", geo_alt_ft) + print(Style.RESET_ALL) + #Lookup Location of coordinates + if longitude != None and latitude != None: + combined = f"{latitude}, {longitude}" + try: + location = geolocator.reverse(combined) + except: + print ("Geopy API Error") + print (Fore.YELLOW) + # print ("Geopy debug: ", location.raw) + print(Style.RESET_ALL) + feeding = True + else: + print (Fore.RED + 'No Location') + feeding = False + print(Style.RESET_ALL) + + + + #Figure if valid location, valid being geopy finds a location + if feeding: + try: + geoError = location.raw['error'] + except KeyError: + invalid_Location = False + geoError = None + else: + invalid_Location = True + + print ("Invalid Location: ", invalid_Location) + + if invalid_Location: + print (Fore.RED) + print (geoError) + print ("Likely Over Water or Invalid Location") + print(Style.RESET_ALL) + + + #Convert Full address to sep variables only if Valid Location + elif invalid_Location is False: + address = location.raw['address'] + country = address.get('country', '') + country_code = address.get('country_code', '').upper() + state = address.get('state', '') + county = address.get('county', '') + city = address.get('city', '') + town = address.get('town', '') + hamlet = address.get('hamlet', '') + # print (Fore.YELLOW) + # print ("Address Fields debug: ", address) + # print(Style.RESET_ALL) + print (Fore.GREEN) + print("Entire Address: ", location.address) + print ("Country Code: ", country_code) + print ("Country: ", country) + print ("State: ", state) + print ("City: ", city) + print ("Town: ", town) + print ("Hamlet: ", hamlet) + print ("County: ", county) + print(Style.RESET_ALL) + + #Check if below desire ft + if geo_alt_ft is None: + below_desired_ft = False + elif geo_alt_ft < 10000: + below_desired_ft = True + #Check if tookoff + tookoff = bool(invalid_Location is False and below_desired_ft and on_ground is False and ((last_feeding is False and feeding) or (last_on_ground))) + print ("Tookoff Just Now:", tookoff) + + + #Check if Landed + landed = bool(last_below_desired_ft and invalid_Location is False and ((last_feeding and feeding is False and last_on_ground is False) or (on_ground and last_on_ground is False))) + print ("Landed Just Now:", landed) + + #Chose city town county or hamlet for location as not all are always avalible. + if feeding and invalid_Location is False: + aera_hierarchy = city or town or county or hamlet + #Takeoff Notifcation and Landed + if tookoff: + tookoff_message = ("Just took off from" + " " + aera_hierarchy + ", " + state + ", " + country_code) + print (tookoff_message) + #Google Map or tar1090 screenshot + if config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): + getMap(aera_hierarchy + ", " + state + ", " + country_code) + else: + getSS(icao) + #Discord + if config.getboolean('DISCORD', 'ENABLE'): + dis_message = config.get('DISCORD', 'TITLE') + " " + tookoff_message + sendDis(dis_message) + #PushBullet + if config.getboolean('PUSHBULLET', 'ENABLE'): + with open("map.png", "rb") as pic: + map_data = pb.upload_file(pic, "Tookoff IMG") + push = pb_channel.push_note(config.get('PUSHBULLET', 'TITLE'), tookoff_message) + push = pb_channel.push_file(**map_data) + #Twitter + if config.getboolean('TWITTER', 'ENABLE'): + tweet_api.update_with_media("map.png", status = tookoff_message) + takeoff_time = time.time() + os.remove("map.png") + + + if landed: + landed_time_msg = "" + if takeoff_time != None: + landed_time = time.time() - takeoff_time + landed_time_msg = time.strftime("Apx. flt. time %H Hours : %M Mins ", time.gmtime(landed_time)) + landed_message = ("Landed just now in" + " " + aera_hierarchy + ", " + state + ", " + country_code + ". " + landed_time_msg) + print (landed_message) + #Google Map or tar1090 screenshot + if config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): + getMap(aera_hierarchy + ", " + state + ", " + country_code) + else: + getSS(icao) + #Discord + if config.getboolean('DISCORD', 'ENABLE'): + dis_message = config.get('DISCORD', 'TITLE') + " " + landed_message + sendDis(dis_message) + #PushBullet + if config.getboolean('PUSHBULLET', 'ENABLE'): + with open("map.png", "rb") as pic: + map_data = pb.upload_file(pic, "Landed IMG") + push = pb_channel.push_note(config.get('PUSHBULLET', 'TITLE'), landed_message) + push = pb_channel.push_file(**map_data) + #Twitter + if config.getboolean('TWITTER', 'ENABLE'): + tweet_api.update_with_media("map.png", status = landed_message) + takeoff_time = None + landed_time = None + time_since_tk = None + os.remove("map.png") + + #Set Variables to compare to next check + last_feeding = feeding + last_geo_alt_ft = geo_alt_ft + last_on_ground = on_ground + last_below_desired_ft = below_desired_ft + + elif failed: + print ("Failed to connect to data source rechecking in 15s") + + if takeoff_time != None: + elapsed_time = time.time() - takeoff_time + time_since_tk = time.strftime("Time Since Take off %H Hours : %M Mins : %S Secs", time.gmtime(elapsed_time)) + print(time_since_tk) + + + + elapsed_calc_time = time.time() - start_time + + print (Back.MAGENTA, "--------", running_Count, "------------------------Elapsed Time- ", elapsed_calc_time, "-------------------------------------", Style.RESET_ALL) diff --git a/pullAllADSBX.py b/pullAllADSBX.py index 88a7dd6..d8367a4 100644 --- a/pullAllADSBX.py +++ b/pullAllADSBX.py @@ -1,44 +1,41 @@ import requests import configparser import json +import time +from planeClass import Plane main_config = configparser.ConfigParser() main_config.read('mainconf.ini') import os #Set ADSBX URL Based off amount of Conf files if main_config.get('DATA', 'SOURCE') == "ADSBX": + planes = {} for filename in os.listdir(os. getcwd()): if filename.endswith(".ini") and filename != "mainconf.ini": plane_config = configparser.ConfigParser() plane_config.read(filename) - plane_config.get('DATA', 'ICAO') - icao_list = [] - icao_list.append(plane_config.get('DATA', 'ICAO')) - if len(icao_list) > 1: + planes[plane_config.get('DATA', 'ICAO').upper()] = Plane(plane_config.get('DATA', 'ICAO'), filename) + if len(planes) > 1: url = "https://adsbexchange.com/api/aircraft/json/" - elif len(icao_list) == 1: - url = "https://adsbexchange.com/api/aircraft/icao/" + icao_list[0].upper() + "/" + elif len(planes) == 1: + url = "https://adsbexchange.com/api/aircraft/icao/" + next(iter(planes.values())).upper() + "/" headers = { 'api-auth': main_config.get('ADSBX', 'API_KEY'), 'Content-Encoding': 'gzip' } if main_config.get('DATA', 'SOURCE') == "OPENS": - + raise NotImplementedError while True: if main_config.get('DATA', 'SOURCE') == "ADSBX": response = requests.get(url, headers = headers) data = response.text data = json.loads(data) - for plane in data['ac']: - if plane['icao'] == "4074B8": - print(plane) -#print(json.dumps(data, indent=2)) -print("done") -#Initate Each Plane Object from their configs + for planeData in data: + for obj in planes: + if planeData['icao'] == obj.getICAO: + obj.run(planeData) + else: + obj.run(None) - - plane_config = configparser.ConfigParser() - plane_config.read(filename) - print(filename) - print(plane_config.get('ADSBX', 'API_KEY')) + time.sleep(15) From aeede2633d22cde907404c3e3499d66951b85468 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Fri, 11 Sep 2020 21:15:51 -0400 Subject: [PATCH 051/124] Inital Multi Version untested --- NotifyBot.py | 258 ----------------------------------------- NotifyBotMulti.py | 60 ++++++++++ config.ini | 45 -------- defDiscord.py | 4 +- defSS.py | 3 +- mainconf.ini | 3 +- plane1.ini | 23 ++++ planeClass.py | 286 ++++++++++++++++++++++++---------------------- pullAllADSBX.py | 41 ------- 9 files changed, 236 insertions(+), 487 deletions(-) delete mode 100644 NotifyBot.py create mode 100644 NotifyBotMulti.py delete mode 100644 config.ini create mode 100644 plane1.ini delete mode 100644 pullAllADSBX.py diff --git a/NotifyBot.py b/NotifyBot.py deleted file mode 100644 index 4501e6e..0000000 --- a/NotifyBot.py +++ /dev/null @@ -1,258 +0,0 @@ -#Github Updated - NotifyBot 11 -#Import Modules -#Clear Terminal -print("\033[H\033[J") - -#Ability to Remove old Map -import os -#Setup Geopy -from geopy.geocoders import Nominatim -geolocator = Nominatim(user_agent="OpenSkyBot", timeout=5) - -import time -from colorama import Fore, Back, Style -from defOpenSky import pullOpenSky -from defADSBX import pullADSBX - -#Setup Config File -import configparser -config = configparser.ConfigParser() -config.read('config.ini') - -if config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): - from defMap import getMap -else: - from defSS import getSS - -if config.getboolean('DISCORD', 'ENABLE'): - from defDiscord import sendDis -#Setup Tweepy -if config.getboolean('TWITTER', 'ENABLE'): - from defTweet import tweepysetup - tweet_api = tweepysetup() -#Setup PushBullet -if config.getboolean('PUSHBULLET', 'ENABLE'): - from pushbullet import Pushbullet - pb = Pushbullet(config['PUSHBULLET']['API_KEY']) - pb_channel = pb.get_channel(config.get('PUSHBULLET', 'CHANNEL_TAG')) - -#Set Plane ICAO -icao = config.get('DATA', 'ICAO').upper() -#Pre Set Non Reseting Variables -geo_alt_ft = None -last_geo_alt_ft = None -last_below_desired_ft = None -feeding = None -last_feeding = None -last_on_ground = None -on_ground = None -invalid_Location = None -longitude = None -latitude = None -running_Count = 0 -callsign = None -takeoff_time = None -reg = None -#Begin Looping program -while True: - running_Count += 1 - start_time = time.time() - print (Back.MAGENTA, "--------", running_Count, "-------------------------------------------------------------", Style.RESET_ALL) -#Reset Variables - below_desired_ft = None - geo_alt_ft = None - longitude = None - latitude = None - on_ground = None -#Get API States for Plane - plane_Dict = None - if config.get('DATA', 'SOURCE') == "OPENS": - plane_Dict, failed = pullOpenSky(icao) - print (Fore.YELLOW) - print ("OpenSky Sourced Data: ", plane_Dict) - print(Style.RESET_ALL) - elif config.get('DATA', 'SOURCE') == "ADSBX": - plane_Dict, failed = pullADSBX(icao) - print (Fore.YELLOW) - print ("ADSBX Sourced Data: ", plane_Dict) - print(Style.RESET_ALL) - - print (Fore.CYAN) - print ("Failed:", failed) - print ("ICAO:", icao) - print(Style.RESET_ALL) - -#Pull Variables from plane_Dict - if failed is False: - if plane_Dict == None: - feeding = False - elif plane_Dict != None: - locals().update(plane_Dict) - print (Fore.CYAN) - if config.get('DATA', 'SOURCE') == "ADSBX": - print("Registration: ", reg) - else: - print("Registration: ", "Only shows when using ADSBX!") - print ("Callsign: ", callsign) - print ("On Ground: ", on_ground) - print ("Latitude: ", latitude) - print ("Longitude: ", longitude) - print ("GEO Alitude Ft: ", geo_alt_ft) - print(Style.RESET_ALL) - #Lookup Location of coordinates - if longitude != None and latitude != None: - combined = f"{latitude}, {longitude}" - try: - location = geolocator.reverse(combined) - except: - print ("Geopy API Error") - print (Fore.YELLOW) - # print ("Geopy debug: ", location.raw) - print(Style.RESET_ALL) - feeding = True - else: - print (Fore.RED + 'No Location') - feeding = False - print(Style.RESET_ALL) - - - - #Figure if valid location, valid being geopy finds a location - if feeding: - try: - geoError = location.raw['error'] - except KeyError: - invalid_Location = False - geoError = None - else: - invalid_Location = True - - print ("Invalid Location: ", invalid_Location) - - if invalid_Location: - print (Fore.RED) - print (geoError) - print ("Likely Over Water or Invalid Location") - print(Style.RESET_ALL) - - - #Convert Full address to sep variables only if Valid Location - elif invalid_Location is False: - address = location.raw['address'] - country = address.get('country', '') - country_code = address.get('country_code', '').upper() - state = address.get('state', '') - county = address.get('county', '') - city = address.get('city', '') - town = address.get('town', '') - hamlet = address.get('hamlet', '') - # print (Fore.YELLOW) - # print ("Address Fields debug: ", address) - # print(Style.RESET_ALL) - print (Fore.GREEN) - print("Entire Address: ", location.address) - print ("Country Code: ", country_code) - print ("Country: ", country) - print ("State: ", state) - print ("City: ", city) - print ("Town: ", town) - print ("Hamlet: ", hamlet) - print ("County: ", county) - print(Style.RESET_ALL) - - #Check if below desire ft - if geo_alt_ft is None: - below_desired_ft = False - elif geo_alt_ft < 10000: - below_desired_ft = True -#Check if tookoff - tookoff = bool(invalid_Location is False and below_desired_ft and on_ground is False and ((last_feeding is False and feeding) or (last_on_ground))) - print ("Tookoff Just Now:", tookoff) - - -#Check if Landed - landed = bool(last_below_desired_ft and invalid_Location is False and ((last_feeding and feeding is False and last_on_ground is False) or (on_ground and last_on_ground is False))) - print ("Landed Just Now:", landed) - - #Chose city town county or hamlet for location as not all are always avalible. - if feeding and invalid_Location is False: - aera_hierarchy = city or town or county or hamlet - #Takeoff Notifcation and Landed - if tookoff: - tookoff_message = ("Just took off from" + " " + aera_hierarchy + ", " + state + ", " + country_code) - print (tookoff_message) - #Google Map or tar1090 screenshot - if config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): - getMap(aera_hierarchy + ", " + state + ", " + country_code) - else: - getSS(icao) - #Discord - if config.getboolean('DISCORD', 'ENABLE'): - dis_message = config.get('DISCORD', 'TITLE') + " " + tookoff_message - sendDis(dis_message) - #PushBullet - if config.getboolean('PUSHBULLET', 'ENABLE'): - with open("map.png", "rb") as pic: - map_data = pb.upload_file(pic, "Tookoff IMG") - push = pb_channel.push_note(config.get('PUSHBULLET', 'TITLE'), tookoff_message) - push = pb_channel.push_file(**map_data) - #Twitter - if config.getboolean('TWITTER', 'ENABLE'): - tweet_api.update_with_media("map.png", status = tookoff_message) - takeoff_time = time.time() - os.remove("map.png") - - - if landed: - landed_time_msg = "" - if takeoff_time != None: - landed_time = time.time() - takeoff_time - landed_time_msg = time.strftime("Apx. flt. time %H Hours : %M Mins ", time.gmtime(landed_time)) - landed_message = ("Landed just now in" + " " + aera_hierarchy + ", " + state + ", " + country_code + ". " + landed_time_msg) - print (landed_message) - #Google Map or tar1090 screenshot - if config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): - getMap(aera_hierarchy + ", " + state + ", " + country_code) - else: - getSS(icao) - #Discord - if config.getboolean('DISCORD', 'ENABLE'): - dis_message = config.get('DISCORD', 'TITLE') + " " + landed_message - sendDis(dis_message) - #PushBullet - if config.getboolean('PUSHBULLET', 'ENABLE'): - with open("map.png", "rb") as pic: - map_data = pb.upload_file(pic, "Landed IMG") - push = pb_channel.push_note(config.get('PUSHBULLET', 'TITLE'), landed_message) - push = pb_channel.push_file(**map_data) - #Twitter - if config.getboolean('TWITTER', 'ENABLE'): - tweet_api.update_with_media("map.png", status = landed_message) - takeoff_time = None - landed_time = None - time_since_tk = None - os.remove("map.png") - -#Set Variables to compare to next check - last_feeding = feeding - last_geo_alt_ft = geo_alt_ft - last_on_ground = on_ground - last_below_desired_ft = below_desired_ft - - elif failed: - print ("Failed to connect to data source rechecking in 15s") - - if takeoff_time != None: - elapsed_time = time.time() - takeoff_time - time_since_tk = time.strftime("Time Since Take off %H Hours : %M Mins : %S Secs", time.gmtime(elapsed_time)) - print(time_since_tk) - - - - elapsed_calc_time = time.time() - start_time - - print (Back.MAGENTA, "--------", running_Count, "------------------------Elapsed Time- ", elapsed_calc_time, "-------------------------------------", Style.RESET_ALL) - print ("") - time.sleep(15) - - diff --git a/NotifyBotMulti.py b/NotifyBotMulti.py new file mode 100644 index 0000000..2ba15f7 --- /dev/null +++ b/NotifyBotMulti.py @@ -0,0 +1,60 @@ +import requests +import configparser +import json +import time +from planeClass import Plane +main_config = configparser.ConfigParser() +main_config.read('mainconf.ini') +import os +#Set ADSBX URL Based off amount of Conf files +if main_config.get('DATA', 'SOURCE') == "ADSBX": + planes = {} + for filename in os.listdir(os. getcwd()): + if filename.endswith(".ini") and filename != "mainconf.ini": + plane_config = configparser.ConfigParser() + plane_config.read(filename) + planes[plane_config.get('DATA', 'ICAO').upper()] = Plane(plane_config.get('DATA', 'ICAO'), filename) + if len(planes) > 1: + url = "https://adsbexchange.com/api/aircraft/json/" + elif len(planes) == 1: + url = "https://adsbexchange.com/api/aircraft/icao/" + str(list(planes.keys())[0]) + "/" + + headers = { + 'api-auth': main_config.get('ADSBX', 'API_KEY'), + 'Content-Encoding': 'gzip' + } +elif main_config.get('DATA', 'SOURCE') == "OPENS": + raise NotImplementedError +while True: + if main_config.get('DATA', 'SOURCE') == "ADSBX": + try: + response = requests.get(url, headers = headers) + data = response.text + data = json.loads(data) + failed = False + except (requests.HTTPError, requests.ConnectionError, requests.Timeout) as error_message: + print("ADSBX Connection Error") + print(error_message) + failed = True + except json.decoder.JSONDecodeError as error_message: + print("Error with JSON") + print(error_message) + failed = True + + if failed == False: + print(data) + if data['ac'] != None: + for planeData in data['ac']: + for key, obj in planes.items(): + if planeData['icao'] == key: + print(planeData['icao']) + print(planeData) + obj.run(planeData) + else: + obj.run(None) + else: + for obj in planes.values(): + obj.run(None) + + + time.sleep(15) diff --git a/config.ini b/config.ini deleted file mode 100644 index 3e3b705..0000000 --- a/config.ini +++ /dev/null @@ -1,45 +0,0 @@ -[DATA] -#Plane to track, based of ICAO or ICAO24 which is the unique transponder address of a plane. -ICAO = planeicaohere - -#Source to pull data from -#SHOULD BE ADSBX which is ADS-B Exchange or OPENS which is OpenSky -#By default configured with OpenSky which anyone can use without a login -#ADS-B Exchange has better data but is not avalible unless you feed their network or pay. -SOURCE = OPENS - -#ADS-B Exchange https://www.adsbexchange.com/data/ -[ADSBX] -API_KEY = apikey - -#OpenSky https://opensky-network.org/apidoc/index.html -#When using without your own login user and pass should be None -[OPENSKY] -USERNAME = None -PASSWORD = None - -[GOOGLE] -#API KEYS -#If static map disabled will load up tar1090 ads-b exchange and take screenshot instead. -STATICMAP_ENABLE = FALSE -STATICMAPKEY = googleapikey - -[TWITTER] -ENABLE = FALSE -CONSUMER_KEY = ckhere -CONSUMER_SECRET = cshere -ACCESS_TOKEN = athere -ACCESS_TOKEN_SECRET = atshere - -[PUSHBULLET] -ENABLE = FALSE -TITLE = Title Of Pushbullet message -API_KEY = apikey -CHANNEL_TAG = channeltag - -[DISCORD] -ENABLE = TRUE -#WEBHOOK URL https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks -URL = webhookhere -Title = title in front of message -USERNAME = username of user in channel can be anything diff --git a/defDiscord.py b/defDiscord.py index 3cfaa70..ef2fcf8 100644 --- a/defDiscord.py +++ b/defDiscord.py @@ -2,9 +2,9 @@ from discord_webhook import DiscordWebhook import configparser config = configparser.ConfigParser() config.read('config.ini') -def sendDis(message): +def sendDis(message, map_file_name): webhook = DiscordWebhook(url=config.get('DISCORD', 'URL'), content=message, username=config.get('DISCORD', 'USERNAME')) - with open("map.png", "rb") as f: + with open(map_file_name, "rb") as f: webhook.add_file(file=f.read(), filename='map.png') response = webhook.execute() \ No newline at end of file diff --git a/defSS.py b/defSS.py index a05cc5f..189e4dc 100644 --- a/defSS.py +++ b/defSS.py @@ -16,5 +16,6 @@ def getSS(icao): url = "https://globe.adsbexchange.com/?largeMode=2&hideButtons&hideSidebar&mapDim=0&zoom=9&icao=" + icao browser.get(url) time.sleep(30) - browser.save_screenshot("map.png") + file_name = icao + "_map.png" + browser.save_screenshot(file_name) browser.quit() \ No newline at end of file diff --git a/mainconf.ini b/mainconf.ini index c9d8797..16dd160 100644 --- a/mainconf.ini +++ b/mainconf.ini @@ -3,8 +3,7 @@ #SHOULD BE ADSBX which is ADS-B Exchange or OPENS which is OpenSky #By default configured with OpenSky which anyone can use without a login #ADS-B Exchange has better data but is not avalible unless you feed their network or pay. -SOURCE = OPENS - +SOURCE = ADSBX #ADS-B Exchange https://www.adsbexchange.com/data/ [ADSBX] diff --git a/plane1.ini b/plane1.ini new file mode 100644 index 0000000..30f0641 --- /dev/null +++ b/plane1.ini @@ -0,0 +1,23 @@ +[DATA] +#Plane to track, based of ICAO or ICAO24 which is the unique transponder address of a plane. +ICAO = icao + +[TWITTER] +ENABLE = FALSE +CONSUMER_KEY = ckhere +CONSUMER_SECRET = cshere +ACCESS_TOKEN = athere +ACCESS_TOKEN_SECRET = atshere + +[PUSHBULLET] +ENABLE = FALSE +TITLE = Title Of Pushbullet message +API_KEY = apikey +CHANNEL_TAG = channeltag + +[DISCORD] +ENABLE = TRUE +#WEBHOOK URL https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks +URL = webhookurl +Title = title +USERNAME = plane-notify diff --git a/planeClass.py b/planeClass.py index a03836e..7e96342 100644 --- a/planeClass.py +++ b/planeClass.py @@ -16,53 +16,51 @@ class Plane: self.callsign = None self.takeoff_time = None self.reg = None + self.map_file_name = icao.upper() + "_map.png" def getICAO(self): return self.icao - def run(self, plane_Dict): + def run(self, ac_dict): + #Import Modules #Clear Terminal - print("\033[H\033[J") + #print("\033[H\033[J") #Ability to Remove old Map import os #Setup Geopy from geopy.geocoders import Nominatim - geolocator = Nominatim(user_agent="OpenSkyBot", timeout=5) - + geolocator = Nominatim(user_agent="NotifyBot", timeout=5) import time from colorama import Fore, Back, Style - from defOpenSky import pullOpenSky - from defADSBX import pullADSBX - #Setup Config File import configparser - config = configparser.ConfigParser() - config.read(self.conf_file) + self.config = configparser.ConfigParser() + self.config.read(self.conf_file) + main_config = configparser.ConfigParser() + main_config.read('mainconf.ini') - if config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): + if self.config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): from defMap import getMap else: from defSS import getSS - if config.getboolean('DISCORD', 'ENABLE'): + if self.config.getboolean('DISCORD', 'ENABLE'): from defDiscord import sendDis #Setup Tweepy - if config.getboolean('TWITTER', 'ENABLE'): + if self.config.getboolean('TWITTER', 'ENABLE'): from defTweet import tweepysetup - tweet_api = tweepysetup() + self.tweet_api = tweepysetup() #Setup PushBullet - if config.getboolean('PUSHBULLET', 'ENABLE'): + if self.config.getboolean('PUSHBULLET', 'ENABLE'): from pushbullet import Pushbullet - pb = Pushbullet(config['PUSHBULLET']['API_KEY']) - pb_channel = pb.get_channel(config.get('PUSHBULLET', 'CHANNEL_TAG')) + self.pb = Pushbullet(self.config['PUSHBULLET']['API_KEY']) + self.pb_channel = pb.get_channel(self.config.get('PUSHBULLET', 'CHANNEL_TAG')) - #Set Plane ICAO - icao = config.get('DATA', 'ICAO').upper() #Pre Set Non Reseting Variables - running_Count +=1 - start_time = time.time() - print (Back.MAGENTA, "--------", running_Count, "-------------------------------------------------------------", Style.RESET_ALL) + self.running_Count +=1 + self.start_time = time.time() + print (Back.MAGENTA, "--------", self.running_Count, "----------------------------- ICAO:", self.icao, "--------------------------", Style.RESET_ALL) #Reset Variables self.below_desired_ft = None self.geo_alt_ft = None @@ -71,189 +69,201 @@ class Plane: self.on_ground = None #Get API States for Plane self.plane_Dict = None - if config.get('DATA', 'SOURCE') == "OPENS": - plane_Dict, failed = pullOpenSky(icao) - print (Fore.YELLOW) - print ("OpenSky Sourced Data: ", plane_Dict) - print(Style.RESET_ALL) - elif config.get('DATA', 'SOURCE') == "ADSBX": - plane_Dict, failed = pullADSBX(icao) - print (Fore.YELLOW) - print ("ADSBX Sourced Data: ", plane_Dict) - print(Style.RESET_ALL) + if main_config.get('DATA', 'SOURCE') == "OPENS": + raise NotImplementedError + #plane_Dict, failed = pullOpenSky(icao) + #print (Fore.YELLOW) + #print ("OpenSky Sourced Data: ", plane_Dict) + #print(Style.RESET_ALL) + elif main_config.get('DATA', 'SOURCE') == "ADSBX": + self.val_error = False + if ac_dict != None: + try: + self.plane_Dict = {'icao' : ac_dict['icao'], 'callsign' : ac_dict['call'], 'reg' : ac_dict['reg'], 'latitude' : float(ac_dict['lat']), 'longitude' : float(ac_dict['lon']), 'geo_alt_ft' : int(ac_dict['galt']), 'on_ground' : bool(int(ac_dict["gnd"]))} + if self.plane_Dict['on_ground']: + self.plane_Dict['geo_alt_ft'] = 0 + except ValueError as e: + self.plane_Dict = None + self.val_error = True + print("Got data but some data is invalid!") + print(e) + else: + self.plane_Dict = None + print (Fore.YELLOW) + print ("ADSBX Sourced Data: ", self.plane_Dict) + print(Style.RESET_ALL) print (Fore.CYAN) - print ("Failed:", failed) - print ("ICAO:", icao) + print ("ICAO:", self.icao) print(Style.RESET_ALL) #Pull Variables from plane_Dict - if failed is False: - if plane_Dict == None: - feeding = False - elif plane_Dict != None: - locals().update(plane_Dict) + if self.val_error is False: + if self.plane_Dict == None: + self.feeding = False + elif self.plane_Dict != None: + self.__dict__.update(self.plane_Dict) print (Fore.CYAN) - if config.get('DATA', 'SOURCE') == "ADSBX": - print("Registration: ", reg) + if main_config.get('DATA', 'SOURCE') == "ADSBX": + print("Registration: ", self.reg) else: print("Registration: ", "Only shows when using ADSBX!") - print ("Callsign: ", callsign) - print ("On Ground: ", on_ground) - print ("Latitude: ", latitude) - print ("Longitude: ", longitude) - print ("GEO Alitude Ft: ", geo_alt_ft) + print ("Callsign: ", self.callsign) + print ("On Ground: ", self.on_ground) + print ("Latitude: ", self.latitude) + print ("Longitude: ", self.longitude) + print ("GEO Alitude Ft: ", self.geo_alt_ft) print(Style.RESET_ALL) #Lookup Location of coordinates - if longitude != None and latitude != None: - combined = f"{latitude}, {longitude}" + if self.longitude != None and self.latitude != None: + self.combined = f"{self.latitude}, {self.longitude}" try: - location = geolocator.reverse(combined) - except: - print ("Geopy API Error") + self.location = geolocator.reverse(self.combined) + except BaseException as e: + print ("Geopy API Error", e) print (Fore.YELLOW) # print ("Geopy debug: ", location.raw) print(Style.RESET_ALL) - feeding = True + self.feeding = True else: print (Fore.RED + 'No Location') - feeding = False + self.feeding = False print(Style.RESET_ALL) #Figure if valid location, valid being geopy finds a location - if feeding: + if self.feeding: try: - geoError = location.raw['error'] + self.geoError = self.location.raw['error'] except KeyError: - invalid_Location = False - geoError = None + self.invalid_Location = False + self.geoError = None else: - invalid_Location = True + self.invalid_Location = True - print ("Invalid Location: ", invalid_Location) + print ("Invalid Location: ", self.invalid_Location) - if invalid_Location: + if self.invalid_Location: print (Fore.RED) - print (geoError) + print (self.geoError) print ("Likely Over Water or Invalid Location") print(Style.RESET_ALL) #Convert Full address to sep variables only if Valid Location - elif invalid_Location is False: - address = location.raw['address'] - country = address.get('country', '') - country_code = address.get('country_code', '').upper() - state = address.get('state', '') - county = address.get('county', '') - city = address.get('city', '') - town = address.get('town', '') - hamlet = address.get('hamlet', '') + elif self.invalid_Location is False: + self.address = self.location.raw['address'] + self.country = self.address.get('country', '') + self.country_code = self.address.get('country_code', '').upper() + self.state = self.address.get('state', '') + self.county = self.address.get('county', '') + self.city = self.address.get('city', '') + self.town = self.address.get('town', '') + self.hamlet = self.address.get('hamlet', '') # print (Fore.YELLOW) - # print ("Address Fields debug: ", address) + # print ("Address Fields debug: ", self.address) # print(Style.RESET_ALL) print (Fore.GREEN) - print("Entire Address: ", location.address) - print ("Country Code: ", country_code) - print ("Country: ", country) - print ("State: ", state) - print ("City: ", city) - print ("Town: ", town) - print ("Hamlet: ", hamlet) - print ("County: ", county) + print("Entire Address: ", self.location.address) + print ("Country Code: ", self.country_code) + print ("Country: ", self.country) + print ("State: ", self.state) + print ("City: ", self.city) + print ("Town: ", self.town) + print ("Hamlet: ", self.hamlet) + print ("County: ", self.county) print(Style.RESET_ALL) #Check if below desire ft - if geo_alt_ft is None: - below_desired_ft = False - elif geo_alt_ft < 10000: - below_desired_ft = True + if self.geo_alt_ft is None: + self.below_desired_ft = False + elif self.geo_alt_ft < 10000: + self.below_desired_ft = True #Check if tookoff - tookoff = bool(invalid_Location is False and below_desired_ft and on_ground is False and ((last_feeding is False and feeding) or (last_on_ground))) - print ("Tookoff Just Now:", tookoff) + self.tookoff = bool(self.invalid_Location is False and self.below_desired_ft and self.on_ground is False and ((self.last_feeding is False and self.feeding) or (self.last_on_ground))) + print ("Tookoff Just Now:", self.tookoff) #Check if Landed - landed = bool(last_below_desired_ft and invalid_Location is False and ((last_feeding and feeding is False and last_on_ground is False) or (on_ground and last_on_ground is False))) - print ("Landed Just Now:", landed) + self.landed = bool(self.last_below_desired_ft and self.invalid_Location is False and ((self.last_feeding and self.feeding is False and self.last_on_ground is False) or (self.on_ground and self.last_on_ground is False))) + print ("Landed Just Now:", self.landed) #Chose city town county or hamlet for location as not all are always avalible. - if feeding and invalid_Location is False: - aera_hierarchy = city or town or county or hamlet + if self.feeding and self.invalid_Location is False: + self.aera_hierarchy = self.city or self.town or self.county or self.hamlet #Takeoff Notifcation and Landed - if tookoff: - tookoff_message = ("Just took off from" + " " + aera_hierarchy + ", " + state + ", " + country_code) + if self.tookoff: + tookoff_message = ("Just took off from" + " " + self.aera_hierarchy + ", " + self.state + ", " + self.country_code) print (tookoff_message) #Google Map or tar1090 screenshot - if config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): - getMap(aera_hierarchy + ", " + state + ", " + country_code) + if self.config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): + getMap(self.aera_hierarchy + ", " + self.state + ", " + self.country_code) else: - getSS(icao) + getSS(self.icao) #Discord - if config.getboolean('DISCORD', 'ENABLE'): - dis_message = config.get('DISCORD', 'TITLE') + " " + tookoff_message - sendDis(dis_message) + if self.config.getboolean('DISCORD', 'ENABLE'): + self.dis_message = self.config.get('DISCORD', 'TITLE') + " " + self.tookoff_message + sendDis(dis_message, self.map_file_name) #PushBullet - if config.getboolean('PUSHBULLET', 'ENABLE'): - with open("map.png", "rb") as pic: + if self.config.getboolean('PUSHBULLET', 'ENABLE'): + with open(self.map_file_name, "rb") as pic: map_data = pb.upload_file(pic, "Tookoff IMG") - push = pb_channel.push_note(config.get('PUSHBULLET', 'TITLE'), tookoff_message) - push = pb_channel.push_file(**map_data) + push = self.pb_channel.push_note(self.config.get('PUSHBULLET', 'TITLE'), self.tookoff_message) + push = self.pb_channel.push_file(**map_data) #Twitter - if config.getboolean('TWITTER', 'ENABLE'): - tweet_api.update_with_media("map.png", status = tookoff_message) - takeoff_time = time.time() - os.remove("map.png") + if self.config.getboolean('TWITTER', 'ENABLE'): + self.tweet_api.update_with_media(self.map_file_name, status = self.tookoff_message) + self.takeoff_time = time.time() + os.remove(self.map_file_name) - if landed: - landed_time_msg = "" - if takeoff_time != None: - landed_time = time.time() - takeoff_time - landed_time_msg = time.strftime("Apx. flt. time %H Hours : %M Mins ", time.gmtime(landed_time)) - landed_message = ("Landed just now in" + " " + aera_hierarchy + ", " + state + ", " + country_code + ". " + landed_time_msg) + if self.landed: + self.landed_time_msg = "" + if self.takeoff_time != None: + self.landed_time = time.time() - self.takeoff_time + self.landed_time_msg = time.strftime("Apx. flt. time %H Hours : %M Mins ", self.time.gmtime(landed_time)) + self.landed_message = ("Landed just now in" + " " + self.aera_hierarchy + ", " + self.state + ", " + self.country_code + ". " + self.landed_time_msg) print (landed_message) #Google Map or tar1090 screenshot - if config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): - getMap(aera_hierarchy + ", " + state + ", " + country_code) + if self.config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): + getMap(self.aera_hierarchy + ", " + self.state + ", " + self.country_code) else: - getSS(icao) + getSS(self.icao) #Discord - if config.getboolean('DISCORD', 'ENABLE'): - dis_message = config.get('DISCORD', 'TITLE') + " " + landed_message - sendDis(dis_message) + if self.config.getboolean('DISCORD', 'ENABLE'): + self.dis_message = self.config.get('DISCORD', 'TITLE') + " " + self.landed_message + sendDis(self.dis_message, self.map_file_name) #PushBullet - if config.getboolean('PUSHBULLET', 'ENABLE'): - with open("map.png", "rb") as pic: + if self.config.getboolean('PUSHBULLET', 'ENABLE'): + with open(self.map_file_name, "rb") as pic: map_data = pb.upload_file(pic, "Landed IMG") - push = pb_channel.push_note(config.get('PUSHBULLET', 'TITLE'), landed_message) - push = pb_channel.push_file(**map_data) + push = self.pb_channel.push_note(self.config.get('PUSHBULLET', 'TITLE'), self.landed_message) + push = self.pb_channel.push_file(**map_data) #Twitter - if config.getboolean('TWITTER', 'ENABLE'): - tweet_api.update_with_media("map.png", status = landed_message) - takeoff_time = None - landed_time = None - time_since_tk = None - os.remove("map.png") + if self.config.getboolean('TWITTER', 'ENABLE'): + self.tweet_api.update_with_media(self.map_file_name, status = self.landed_message) + self.takeoff_time = None + self.landed_time = None + self.time_since_tk = None + os.remove(self.map_file_name) #Set Variables to compare to next check - last_feeding = feeding - last_geo_alt_ft = geo_alt_ft - last_on_ground = on_ground - last_below_desired_ft = below_desired_ft + self.last_feeding = self.feeding + self.last_geo_alt_ft = self.geo_alt_ft + self.last_on_ground = self.on_ground + self.last_below_desired_ft = self.below_desired_ft - elif failed: - print ("Failed to connect to data source rechecking in 15s") + elif self.val_error: + print ("Failed to Parse Will Recheck this Plane After new data") - if takeoff_time != None: - elapsed_time = time.time() - takeoff_time - time_since_tk = time.strftime("Time Since Take off %H Hours : %M Mins : %S Secs", time.gmtime(elapsed_time)) - print(time_since_tk) + if self.takeoff_time != None: + self.elapsed_time = self.time.time() - self.takeoff_time + self.time_since_tk = self.time.strftime("Time Since Take off %H Hours : %M Mins : %S Secs", time.gmtime(self.elapsed_time)) + print(self.time_since_tk) - elapsed_calc_time = time.time() - start_time + self.elapsed_calc_time = time.time() - self.start_time - print (Back.MAGENTA, "--------", running_Count, "------------------------Elapsed Time- ", elapsed_calc_time, "-------------------------------------", Style.RESET_ALL) + print (Back.MAGENTA, "--------", self.running_Count, "------------------------Elapsed Time- ", self.elapsed_calc_time, "-------------------------------------", Style.RESET_ALL) diff --git a/pullAllADSBX.py b/pullAllADSBX.py deleted file mode 100644 index d8367a4..0000000 --- a/pullAllADSBX.py +++ /dev/null @@ -1,41 +0,0 @@ -import requests -import configparser -import json -import time -from planeClass import Plane -main_config = configparser.ConfigParser() -main_config.read('mainconf.ini') -import os -#Set ADSBX URL Based off amount of Conf files -if main_config.get('DATA', 'SOURCE') == "ADSBX": - planes = {} - for filename in os.listdir(os. getcwd()): - if filename.endswith(".ini") and filename != "mainconf.ini": - plane_config = configparser.ConfigParser() - plane_config.read(filename) - planes[plane_config.get('DATA', 'ICAO').upper()] = Plane(plane_config.get('DATA', 'ICAO'), filename) - if len(planes) > 1: - url = "https://adsbexchange.com/api/aircraft/json/" - elif len(planes) == 1: - url = "https://adsbexchange.com/api/aircraft/icao/" + next(iter(planes.values())).upper() + "/" - - headers = { - 'api-auth': main_config.get('ADSBX', 'API_KEY'), - 'Content-Encoding': 'gzip' - } -if main_config.get('DATA', 'SOURCE') == "OPENS": - raise NotImplementedError -while True: - if main_config.get('DATA', 'SOURCE') == "ADSBX": - response = requests.get(url, headers = headers) - data = response.text - data = json.loads(data) - for planeData in data: - for obj in planes: - if planeData['icao'] == obj.getICAO: - obj.run(planeData) - else: - obj.run(None) - - - time.sleep(15) From 83b1e71c54c5e3335c24a0d59f4941cb49ce36cd Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Mon, 14 Sep 2020 10:56:06 -0400 Subject: [PATCH 052/124] Making fixes to get OOP version running --- NotifyBotMulti.py | 26 +++++++++++++++++--------- defDiscord.py | 11 ++++++----- defTweet.py | 11 ++++++----- plane1.ini | 6 ++++++ planeClass.py | 24 ++++++++++-------------- 5 files changed, 45 insertions(+), 33 deletions(-) diff --git a/NotifyBotMulti.py b/NotifyBotMulti.py index 2ba15f7..a76501e 100644 --- a/NotifyBotMulti.py +++ b/NotifyBotMulti.py @@ -2,6 +2,7 @@ import requests import configparser import json import time +from colorama import Fore, Back, Style from planeClass import Plane main_config = configparser.ConfigParser() main_config.read('mainconf.ini') @@ -25,7 +26,11 @@ if main_config.get('DATA', 'SOURCE') == "ADSBX": } elif main_config.get('DATA', 'SOURCE') == "OPENS": raise NotImplementedError +running_Count = 0 while True: + running_Count +=1 + start_time = time.time() + print (Back.GREEN, Fore.BLACK, "--------", running_Count, "-------------------------------------------------------", Style.RESET_ALL) if main_config.get('DATA', 'SOURCE') == "ADSBX": try: response = requests.get(url, headers = headers) @@ -38,23 +43,26 @@ while True: failed = True except json.decoder.JSONDecodeError as error_message: print("Error with JSON") + print (json.dumps(data, indent = 2)) print(error_message) failed = True if failed == False: - print(data) if data['ac'] != None: - for planeData in data['ac']: - for key, obj in planes.items(): + for key, obj in planes.items(): + has_data = False + for planeData in data['ac']: if planeData['icao'] == key: - print(planeData['icao']) - print(planeData) obj.run(planeData) - else: - obj.run(None) + has_data = True + break + if has_data is False: + obj.run(None) else: for obj in planes.values(): obj.run(None) + elapsed_calc_time = time.time() - start_time + print (Back.GREEN, Fore.BLACK, "--------", running_Count, "------------------------Elapsed Time-", elapsed_calc_time, " -------------------------------------", Style.RESET_ALL) + print(Back.RED, "Sleep 30", Style.RESET_ALL) + time.sleep(30) - - time.sleep(15) diff --git a/defDiscord.py b/defDiscord.py index ef2fcf8..2ef33ce 100644 --- a/defDiscord.py +++ b/defDiscord.py @@ -1,8 +1,9 @@ -from discord_webhook import DiscordWebhook -import configparser -config = configparser.ConfigParser() -config.read('config.ini') -def sendDis(message, map_file_name): + +def sendDis(message, map_file_name, conf_file): + from discord_webhook import DiscordWebhook + import configparser + config = configparser.ConfigParser() + config.read(conf_file) webhook = DiscordWebhook(url=config.get('DISCORD', 'URL'), content=message, username=config.get('DISCORD', 'USERNAME')) with open(map_file_name, "rb") as f: diff --git a/defTweet.py b/defTweet.py index 6943d62..057a999 100644 --- a/defTweet.py +++ b/defTweet.py @@ -1,9 +1,10 @@ # Authenticate to Twitter -import configparser -config = configparser.ConfigParser() -config.read('config.ini') -import tweepy -def tweepysetup(): + +def tweepysetup(conf_file): + import configparser + config = configparser.ConfigParser() + config.read(conf_file) + import tweepy #DOCU #https://realpython.com/twitter-bot-python-tweepy/ auth = tweepy.OAuthHandler(config.get('TWITTER', 'CONSUMER_KEY'), config.get('TWITTER', 'CONSUMER_SECRET')) diff --git a/plane1.ini b/plane1.ini index 30f0641..3dcf095 100644 --- a/plane1.ini +++ b/plane1.ini @@ -9,6 +9,12 @@ CONSUMER_SECRET = cshere ACCESS_TOKEN = athere ACCESS_TOKEN_SECRET = atshere +[GOOGLE] +#API KEYS +#If static map disabled will load up tar1090 ads-b exchange and take screenshot instead. +STATICMAP_ENABLE = FALSE +STATICMAPKEY = googleapikey + [PUSHBULLET] ENABLE = FALSE TITLE = Title Of Pushbullet message diff --git a/planeClass.py b/planeClass.py index 7e96342..84f56c4 100644 --- a/planeClass.py +++ b/planeClass.py @@ -12,7 +12,6 @@ class Plane: self.invalid_Location = None self.longitude = None self.latitude = None - self.running_Count = 0 self.callsign = None self.takeoff_time = None self.reg = None @@ -49,18 +48,16 @@ class Plane: #Setup Tweepy if self.config.getboolean('TWITTER', 'ENABLE'): from defTweet import tweepysetup - self.tweet_api = tweepysetup() + self.tweet_api = tweepysetup(self.conf_file) #Setup PushBullet if self.config.getboolean('PUSHBULLET', 'ENABLE'): from pushbullet import Pushbullet self.pb = Pushbullet(self.config['PUSHBULLET']['API_KEY']) - self.pb_channel = pb.get_channel(self.config.get('PUSHBULLET', 'CHANNEL_TAG')) + self.pb_channel = self.pb.get_channel(self.config.get('PUSHBULLET', 'CHANNEL_TAG')) #Pre Set Non Reseting Variables - self.running_Count +=1 - self.start_time = time.time() - print (Back.MAGENTA, "--------", self.running_Count, "----------------------------- ICAO:", self.icao, "--------------------------", Style.RESET_ALL) + print (Back.MAGENTA, "---------", self.conf_file, "---------------------------- ICAO:", self.icao, "--------------------------", Style.RESET_ALL) #Reset Variables self.below_desired_ft = None self.geo_alt_ft = None @@ -194,8 +191,8 @@ class Plane: self.aera_hierarchy = self.city or self.town or self.county or self.hamlet #Takeoff Notifcation and Landed if self.tookoff: - tookoff_message = ("Just took off from" + " " + self.aera_hierarchy + ", " + self.state + ", " + self.country_code) - print (tookoff_message) + self.tookoff_message = ("Just took off from" + " " + self.aera_hierarchy + ", " + self.state + ", " + self.country_code) + print (self.tookoff_message) #Google Map or tar1090 screenshot if self.config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): getMap(self.aera_hierarchy + ", " + self.state + ", " + self.country_code) @@ -204,7 +201,7 @@ class Plane: #Discord if self.config.getboolean('DISCORD', 'ENABLE'): self.dis_message = self.config.get('DISCORD', 'TITLE') + " " + self.tookoff_message - sendDis(dis_message, self.map_file_name) + sendDis(self.dis_message, self.map_file_name, self.conf_file) #PushBullet if self.config.getboolean('PUSHBULLET', 'ENABLE'): with open(self.map_file_name, "rb") as pic: @@ -224,7 +221,7 @@ class Plane: self.landed_time = time.time() - self.takeoff_time self.landed_time_msg = time.strftime("Apx. flt. time %H Hours : %M Mins ", self.time.gmtime(landed_time)) self.landed_message = ("Landed just now in" + " " + self.aera_hierarchy + ", " + self.state + ", " + self.country_code + ". " + self.landed_time_msg) - print (landed_message) + print (self.landed_message) #Google Map or tar1090 screenshot if self.config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): getMap(self.aera_hierarchy + ", " + self.state + ", " + self.country_code) @@ -233,7 +230,7 @@ class Plane: #Discord if self.config.getboolean('DISCORD', 'ENABLE'): self.dis_message = self.config.get('DISCORD', 'TITLE') + " " + self.landed_message - sendDis(self.dis_message, self.map_file_name) + sendDis(self.dis_message, self.map_file_name, self.conf_file) #PushBullet if self.config.getboolean('PUSHBULLET', 'ENABLE'): with open(self.map_file_name, "rb") as pic: @@ -258,12 +255,11 @@ class Plane: print ("Failed to Parse Will Recheck this Plane After new data") if self.takeoff_time != None: - self.elapsed_time = self.time.time() - self.takeoff_time + self.elapsed_time = time.time() - self.takeoff_time self.time_since_tk = self.time.strftime("Time Since Take off %H Hours : %M Mins : %S Secs", time.gmtime(self.elapsed_time)) print(self.time_since_tk) - self.elapsed_calc_time = time.time() - self.start_time - print (Back.MAGENTA, "--------", self.running_Count, "------------------------Elapsed Time- ", self.elapsed_calc_time, "-------------------------------------", Style.RESET_ALL) + print (Back.MAGENTA, "---------------------------------------------------------------------------", Style.RESET_ALL) From ae19c7b6b8962708f0f2e47234e23cb8fecfcd2e Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 19 Sep 2020 17:32:33 -0400 Subject: [PATCH 053/124] Move ADSBX pull to function --- NotifyBotMulti.py | 27 +++---------------- defADSBX.py | 67 +++++++++++++++++++---------------------------- plane1.ini | 2 +- planeClass.py | 2 -- 4 files changed, 31 insertions(+), 67 deletions(-) diff --git a/NotifyBotMulti.py b/NotifyBotMulti.py index a76501e..3289f8b 100644 --- a/NotifyBotMulti.py +++ b/NotifyBotMulti.py @@ -2,12 +2,13 @@ import requests import configparser import json import time +from defADSBX import pullADSBX from colorama import Fore, Back, Style from planeClass import Plane main_config = configparser.ConfigParser() main_config.read('mainconf.ini') import os -#Set ADSBX URL Based off amount of Conf files +#Setup Plane Objects off of Plane configs if main_config.get('DATA', 'SOURCE') == "ADSBX": planes = {} for filename in os.listdir(os. getcwd()): @@ -15,15 +16,7 @@ if main_config.get('DATA', 'SOURCE') == "ADSBX": plane_config = configparser.ConfigParser() plane_config.read(filename) planes[plane_config.get('DATA', 'ICAO').upper()] = Plane(plane_config.get('DATA', 'ICAO'), filename) - if len(planes) > 1: - url = "https://adsbexchange.com/api/aircraft/json/" - elif len(planes) == 1: - url = "https://adsbexchange.com/api/aircraft/icao/" + str(list(planes.keys())[0]) + "/" - headers = { - 'api-auth': main_config.get('ADSBX', 'API_KEY'), - 'Content-Encoding': 'gzip' - } elif main_config.get('DATA', 'SOURCE') == "OPENS": raise NotImplementedError running_Count = 0 @@ -32,21 +25,7 @@ while True: start_time = time.time() print (Back.GREEN, Fore.BLACK, "--------", running_Count, "-------------------------------------------------------", Style.RESET_ALL) if main_config.get('DATA', 'SOURCE') == "ADSBX": - try: - response = requests.get(url, headers = headers) - data = response.text - data = json.loads(data) - failed = False - except (requests.HTTPError, requests.ConnectionError, requests.Timeout) as error_message: - print("ADSBX Connection Error") - print(error_message) - failed = True - except json.decoder.JSONDecodeError as error_message: - print("Error with JSON") - print (json.dumps(data, indent = 2)) - print(error_message) - failed = True - + data, failed = pullADSBX(planes) if failed == False: if data['ac'] != None: for key, obj in planes.items(): diff --git a/defADSBX.py b/defADSBX.py index 50f5758..90d38cf 100644 --- a/defADSBX.py +++ b/defADSBX.py @@ -1,47 +1,34 @@ import requests import json import configparser -config = configparser.ConfigParser() -config.read('config.ini') -def pullADSBX(icao): - url = 'https://adsbexchange.com/api/aircraft/icao/' + icao + "/" - headers = { - 'api-auth': config.get('ADSBX', 'API_KEY') - } - failed = False - try: - response = requests.get(url, headers = headers) - data = response.text - data = json.loads(data) - #print (json.dumps(data, indent=4)) - except (requests.HTTPError, requests.ConnectionError, requests.Timeout) as error_message: - print("ADSBX Connection Error") - print(error_message) - failed = True - plane_Dict = None - except json.decoder.JSONDecodeError as error_message: - print("Error with JSON") - print(error_message) - failed = True - plane_Dict = None - if failed is False: - ac = data['ac'] - if ac != None: - ac_dict = ac[0] - try: - plane_Dict = {'icao' : ac_dict['icao'], 'callsign' : ac_dict['call'], 'reg' : ac_dict['reg'], 'latitude' : float(ac_dict['lat']), 'longitude' : float(ac_dict['lon']), 'geo_alt_ft' : int(ac_dict['galt']), 'on_ground' : bool(int(ac_dict["gnd"]))} - if plane_Dict['on_ground']: - plane_Dict['geo_alt_ft'] = 0 - except ValueError as e: - plane_Dict = None +main_config = configparser.ConfigParser() +main_config.read('mainconf.ini') +def pullADSBX(planes): + if len(planes) > 1: + url = "https://adsbexchange.com/api/aircraft/json/" + elif len(planes) == 1: + url = "https://adsbexchange.com/api/aircraft/icao/" + str(list(planes.keys())[0]) + "/" + + headers = { + 'api-auth': main_config.get('ADSBX', 'API_KEY'), + 'Content-Encoding': 'gzip' + } + try: + response = requests.get(url, headers = headers) + data = response.text + data = json.loads(data) + failed = False + except (requests.HTTPError, requests.ConnectionError, requests.Timeout) as error_message: + print("ADSBX Connection Error") + print(error_message) failed = True - print("Got data but some data is invalid!") - print(e) - else: - plane_Dict = None - - return plane_Dict, failed - + except json.decoder.JSONDecodeError as error_message: + print("Error with JSON") + print (json.dumps(data, indent = 2)) + print(error_message) + failed = True + print("Failed:", failed) + return data, failed diff --git a/plane1.ini b/plane1.ini index 3dcf095..fd374dc 100644 --- a/plane1.ini +++ b/plane1.ini @@ -22,7 +22,7 @@ API_KEY = apikey CHANNEL_TAG = channeltag [DISCORD] -ENABLE = TRUE +ENABLE = FALSE #WEBHOOK URL https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks URL = webhookurl Title = title diff --git a/planeClass.py b/planeClass.py index 84f56c4..445afe6 100644 --- a/planeClass.py +++ b/planeClass.py @@ -103,8 +103,6 @@ class Plane: print (Fore.CYAN) if main_config.get('DATA', 'SOURCE') == "ADSBX": print("Registration: ", self.reg) - else: - print("Registration: ", "Only shows when using ADSBX!") print ("Callsign: ", self.callsign) print ("On Ground: ", self.on_ground) print ("Latitude: ", self.latitude) From e23ade76beac7eabbd92e003084285298835fffa Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 19 Sep 2020 17:45:05 -0400 Subject: [PATCH 054/124] Add ADSBX data info, HTTP Code, CTIME --- defADSBX.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/defADSBX.py b/defADSBX.py index 90d38cf..374952f 100644 --- a/defADSBX.py +++ b/defADSBX.py @@ -1,6 +1,8 @@ import requests import json import configparser +import time +from datetime import datetime main_config = configparser.ConfigParser() main_config.read('mainconf.ini') def pullADSBX(planes): @@ -17,6 +19,7 @@ def pullADSBX(planes): response = requests.get(url, headers = headers) data = response.text data = json.loads(data) + print ("HTTP Status Code:", response.status_code) failed = False except (requests.HTTPError, requests.ConnectionError, requests.Timeout) as error_message: print("ADSBX Connection Error") @@ -27,8 +30,10 @@ def pullADSBX(planes): print (json.dumps(data, indent = 2)) print(error_message) failed = True - print("Failed:", failed) + if failed is False: + data_ctime = data['ctime'] / 1000.0 + print("UTC of Data:",datetime.utcfromtimestamp(data_ctime)) + print("Current UTC:", datetime.utcnow()) return data, failed - From 9b5edaa9a3b96ff381963247c411b611695cb33c Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 19 Sep 2020 20:00:46 -0400 Subject: [PATCH 055/124] Updating to more eff. location lookup only after events --- planeClass.py | 92 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 58 insertions(+), 34 deletions(-) diff --git a/planeClass.py b/planeClass.py index 445afe6..b93494e 100644 --- a/planeClass.py +++ b/planeClass.py @@ -16,6 +16,8 @@ class Plane: self.takeoff_time = None self.reg = None self.map_file_name = icao.upper() + "_map.png" + self.last_latitude = None + self.last_longitude = None def getICAO(self): return self.icao def run(self, ac_dict): @@ -64,6 +66,7 @@ class Plane: self.longitude = None self.latitude = None self.on_ground = None + self.has_location = None #Get API States for Plane self.plane_Dict = None if main_config.get('DATA', 'SOURCE') == "OPENS": @@ -109,26 +112,50 @@ class Plane: print ("Longitude: ", self.longitude) print ("GEO Alitude Ft: ", self.geo_alt_ft) print(Style.RESET_ALL) - #Lookup Location of coordinates - if self.longitude != None and self.latitude != None: - self.combined = f"{self.latitude}, {self.longitude}" - try: - self.location = geolocator.reverse(self.combined) - except BaseException as e: - print ("Geopy API Error", e) - print (Fore.YELLOW) - # print ("Geopy debug: ", location.raw) - print(Style.RESET_ALL) - self.feeding = True + + + #Check if below desire ft + if self.geo_alt_ft is None: + self.below_desired_ft = False + elif self.geo_alt_ft < 10000: + self.below_desired_ft = True + #Check if tookoff + self.tookoff = bool(self.below_desired_ft and self.on_ground is False and ((self.last_feeding is False and self.feeding) or (self.last_on_ground))) + print ("Tookoff Just Now:", self.tookoff) + + + #Check if Landed + self.landed = bool(self.last_below_desired_ft and ((self.last_feeding and self.feeding is False and self.last_on_ground is False) or (self.on_ground and self.last_on_ground is False))) + print ("Landed Just Now:", self.landed) + + #Lookup Location of coordinates + if self.landed or self.tookoff: + if self.landed and self.last_longitude != None and self.last_latitude != None: + self.combined = f"{self.last_latitude}, {self.last_longitude}" + self.has_coords = True + elif self.tookoff and self.longitude != None and self.latitude != None: + self.combined = f"{self.latitude} , {self.longitude}" + self.has_coords = True else: print (Fore.RED + 'No Location') - self.feeding = False + self.has_location = False + self.invalid_Location = True + self.has_coords = False print(Style.RESET_ALL) + if self.has_coords: + try: + self.location = geolocator.reverse(self.combined) + except: + print ("Geopy API Error") + else: + # print (Fore.YELLOW, "Geopy debug: ", location.raw, Style.RESET_ALL) + self.has_location = True + #Figure if valid location, valid being geopy finds a location - if self.feeding: + if self.has_location: try: self.geoError = self.location.raw['error'] except KeyError: @@ -169,27 +196,19 @@ class Plane: print ("Hamlet: ", self.hamlet) print ("County: ", self.county) print(Style.RESET_ALL) - - #Check if below desire ft - if self.geo_alt_ft is None: - self.below_desired_ft = False - elif self.geo_alt_ft < 10000: - self.below_desired_ft = True - #Check if tookoff - self.tookoff = bool(self.invalid_Location is False and self.below_desired_ft and self.on_ground is False and ((self.last_feeding is False and self.feeding) or (self.last_on_ground))) - print ("Tookoff Just Now:", self.tookoff) - - - #Check if Landed - self.landed = bool(self.last_below_desired_ft and self.invalid_Location is False and ((self.last_feeding and self.feeding is False and self.last_on_ground is False) or (self.on_ground and self.last_on_ground is False))) - print ("Landed Just Now:", self.landed) - #Chose city town county or hamlet for location as not all are always avalible. - if self.feeding and self.invalid_Location is False: + if self.invalid_Location is False: self.aera_hierarchy = self.city or self.town or self.county or self.hamlet + #Set Discord Title + if self.config.getboolean('DISCORD', 'ENABLE'): + self.dis_title = self.icao if self.config.get('DISCORD', 'TITLE') == "icao" else self.callsign if self.config.get('DISCORD', 'TITLE') == "callsign" else self.config.get('DISCORD', 'TITLE') + #Takeoff Notifcation and Landed if self.tookoff: - self.tookoff_message = ("Just took off from" + " " + self.aera_hierarchy + ", " + self.state + ", " + self.country_code) + if self.invalid_Location is False: + self.tookoff_message = ("Just took off from" + " " + self.aera_hierarchy + ", " + self.state + ", " + self.country_code) + else: + self.tookoff_message = ("Just took off") print (self.tookoff_message) #Google Map or tar1090 screenshot if self.config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): @@ -198,7 +217,7 @@ class Plane: getSS(self.icao) #Discord if self.config.getboolean('DISCORD', 'ENABLE'): - self.dis_message = self.config.get('DISCORD', 'TITLE') + " " + self.tookoff_message + self.dis_message = self.dis_title + " " + self.tookoff_message sendDis(self.dis_message, self.map_file_name, self.conf_file) #PushBullet if self.config.getboolean('PUSHBULLET', 'ENABLE'): @@ -218,7 +237,10 @@ class Plane: if self.takeoff_time != None: self.landed_time = time.time() - self.takeoff_time self.landed_time_msg = time.strftime("Apx. flt. time %H Hours : %M Mins ", self.time.gmtime(landed_time)) - self.landed_message = ("Landed just now in" + " " + self.aera_hierarchy + ", " + self.state + ", " + self.country_code + ". " + self.landed_time_msg) + if self.invalid_Location is False: + self.landed_message = ("Landed just now in" + " " + self.aera_hierarchy + ", " + self.state + ", " + self.country_code + ". " + self.landed_time_msg) + else: + self.landed_message = ("Landed just now" , self.landed_time_msg) print (self.landed_message) #Google Map or tar1090 screenshot if self.config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): @@ -227,7 +249,7 @@ class Plane: getSS(self.icao) #Discord if self.config.getboolean('DISCORD', 'ENABLE'): - self.dis_message = self.config.get('DISCORD', 'TITLE') + " " + self.landed_message + self.dis_message = self.dis_title + " " + self.landed_message sendDis(self.dis_message, self.map_file_name, self.conf_file) #PushBullet if self.config.getboolean('PUSHBULLET', 'ENABLE'): @@ -248,13 +270,15 @@ class Plane: self.last_geo_alt_ft = self.geo_alt_ft self.last_on_ground = self.on_ground self.last_below_desired_ft = self.below_desired_ft + self.last_longitude = self.longitude + self.last_latitude = self.latitude elif self.val_error: print ("Failed to Parse Will Recheck this Plane After new data") if self.takeoff_time != None: self.elapsed_time = time.time() - self.takeoff_time - self.time_since_tk = self.time.strftime("Time Since Take off %H Hours : %M Mins : %S Secs", time.gmtime(self.elapsed_time)) + self.time_since_tk = time.strftime("Time Since Take off %H Hours : %M Mins : %S Secs", time.gmtime(self.elapsed_time)) print(self.time_since_tk) From 59f67411faf130beaee4c1361069f3307fd5acf9 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 19 Sep 2020 20:01:43 -0400 Subject: [PATCH 056/124] Fix ctime and add auth warning --- defADSBX.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/defADSBX.py b/defADSBX.py index 374952f..9b03e87 100644 --- a/defADSBX.py +++ b/defADSBX.py @@ -31,9 +31,15 @@ def pullADSBX(planes): print(error_message) failed = True if failed is False: - data_ctime = data['ctime'] / 1000.0 + data_ctime = float(data['ctime']) / 1000.0 print("UTC of Data:",datetime.utcfromtimestamp(data_ctime)) print("Current UTC:", datetime.utcnow()) + try: + if data['msg'] == 'You need a key. Get a feeder or use pay API. https://rapidapi.com/adsbx/api/adsbexchange-com1': + print("Bad auth", data['msg']) + failed = True + except KeyError: + pass return data, failed From 78e306e2f87d2dbb8235988de1965962d4cd26c8 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sun, 20 Sep 2020 14:02:16 -0400 Subject: [PATCH 057/124] Updating readme with single branch readme --- Refrences.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 Refrences.md diff --git a/Refrences.md b/Refrences.md new file mode 100644 index 0000000..82e01ac --- /dev/null +++ b/Refrences.md @@ -0,0 +1,41 @@ +# Reference Links + +## ADSB Exchange + +- +- + +## OpenSky + +- + +## GeoPy - Location Name Lookup + +- + +## Google Static Maps + +- + +## Twitter Tutorial + +- + +## Pushbullet + +- + +## Discord Webhooks + +- +- + +## Selenium - ChromeDriver, Screenshot ADSBX + +- +- +- +- +- +- +- From 91cb3ffa4aa93f6b523c10ef1cb45ba3ce80d08d Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sun, 20 Sep 2020 14:03:20 -0400 Subject: [PATCH 058/124] Updating README to match single branch --- README.md | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 615713e..b44730a 100644 --- a/README.md +++ b/README.md @@ -103,14 +103,7 @@ python3 NotifyBot.py ### TODO -Move the lookup location of coordinates so that it only rungs when landing or takeoff occurs. So then Geopy/Nomination API is called less +- Possibly implement airport name, done by closest airport +- General Cleanup -Implement airport name, done by closest airport - -#### Refrences - -- -- -- -- -- +### [ More Refrences / Documentation](Refrences.md) From 4e38f0cd9f74eaf368d4a7ac3b21958286b5b06c Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Mon, 21 Sep 2020 19:04:11 -0400 Subject: [PATCH 059/124] Fix Pushbullet and set feeding to True on data --- planeClass.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/planeClass.py b/planeClass.py index b93494e..cc72fe5 100644 --- a/planeClass.py +++ b/planeClass.py @@ -102,6 +102,7 @@ class Plane: if self.plane_Dict == None: self.feeding = False elif self.plane_Dict != None: + self.feeding = True self.__dict__.update(self.plane_Dict) print (Fore.CYAN) if main_config.get('DATA', 'SOURCE') == "ADSBX": @@ -222,7 +223,7 @@ class Plane: #PushBullet if self.config.getboolean('PUSHBULLET', 'ENABLE'): with open(self.map_file_name, "rb") as pic: - map_data = pb.upload_file(pic, "Tookoff IMG") + map_data = self.pb.upload_file(pic, "Tookoff IMG") push = self.pb_channel.push_note(self.config.get('PUSHBULLET', 'TITLE'), self.tookoff_message) push = self.pb_channel.push_file(**map_data) #Twitter @@ -236,7 +237,7 @@ class Plane: self.landed_time_msg = "" if self.takeoff_time != None: self.landed_time = time.time() - self.takeoff_time - self.landed_time_msg = time.strftime("Apx. flt. time %H Hours : %M Mins ", self.time.gmtime(landed_time)) + self.landed_time_msg = time.strftime("Apx. flt. time %H Hours : %M Mins ", time.gmtime(self.landed_time)) if self.invalid_Location is False: self.landed_message = ("Landed just now in" + " " + self.aera_hierarchy + ", " + self.state + ", " + self.country_code + ". " + self.landed_time_msg) else: @@ -254,7 +255,7 @@ class Plane: #PushBullet if self.config.getboolean('PUSHBULLET', 'ENABLE'): with open(self.map_file_name, "rb") as pic: - map_data = pb.upload_file(pic, "Landed IMG") + map_data = self.pb.upload_file(pic, "Landed IMG") push = self.pb_channel.push_note(self.config.get('PUSHBULLET', 'TITLE'), self.landed_message) push = self.pb_channel.push_file(**map_data) #Twitter From 4cba3706dadbc8cddfd7dfec41d7a1cc04e6cb0e Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 26 Sep 2020 20:24:28 -0400 Subject: [PATCH 060/124] Add time to console, reset count at new day --- NotifyBotMulti.py | 15 +++++++++++++-- mainconf.ini | 4 ++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/NotifyBotMulti.py b/NotifyBotMulti.py index 3289f8b..00534c5 100644 --- a/NotifyBotMulti.py +++ b/NotifyBotMulti.py @@ -5,6 +5,8 @@ import time from defADSBX import pullADSBX from colorama import Fore, Back, Style from planeClass import Plane +from datetime import datetime +import pytz main_config = configparser.ConfigParser() main_config.read('mainconf.ini') import os @@ -20,10 +22,18 @@ if main_config.get('DATA', 'SOURCE') == "ADSBX": elif main_config.get('DATA', 'SOURCE') == "OPENS": raise NotImplementedError running_Count = 0 +try: + tz = pytz.timezone(main_config.get('DATA', 'TZ')) +except pytz.exceptions.UnknownTimeZoneError: + tz = pytz.UTC + while True: + datetime_tz = datetime.now(tz) + if datetime_tz.hour == 0 and datetime_tz.minute == 0: + running_Count = 0 running_Count +=1 start_time = time.time() - print (Back.GREEN, Fore.BLACK, "--------", running_Count, "-------------------------------------------------------", Style.RESET_ALL) + print (Back.GREEN, Fore.BLACK, "--------", running_Count, "--------", datetime_tz.strftime("%I:%M:%S %p"), "-------------------------------------------------------", Style.RESET_ALL) if main_config.get('DATA', 'SOURCE') == "ADSBX": data, failed = pullADSBX(planes) if failed == False: @@ -41,7 +51,8 @@ while True: for obj in planes.values(): obj.run(None) elapsed_calc_time = time.time() - start_time - print (Back.GREEN, Fore.BLACK, "--------", running_Count, "------------------------Elapsed Time-", elapsed_calc_time, " -------------------------------------", Style.RESET_ALL) + datetime_tz = datetime.now(tz) + print (Back.GREEN, Fore.BLACK, "--------", running_Count, "--------", datetime_tz.strftime("%I:%M:%S %p"), "------------------------Elapsed Time-", elapsed_calc_time, " -------------------------------------", Style.RESET_ALL) print(Back.RED, "Sleep 30", Style.RESET_ALL) time.sleep(30) diff --git a/mainconf.ini b/mainconf.ini index 16dd160..4adde27 100644 --- a/mainconf.ini +++ b/mainconf.ini @@ -5,6 +5,10 @@ #ADS-B Exchange has better data but is not avalible unless you feed their network or pay. SOURCE = ADSBX +#Timezone if you want your own time to show in the console, if invalid will be set to UTC. +#List of TZs names https://en.wikipedia.org/wiki/List_of_tz_database_time_zones +TZ = UTC + #ADS-B Exchange https://www.adsbexchange.com/data/ [ADSBX] API_KEY = apikey From ad27dea150bcf54b3203c12bddebbb03c69ca17b Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 26 Sep 2020 21:29:06 -0400 Subject: [PATCH 061/124] Update Readme, Multiple Planes, forgot chromedriver --- README.md | 66 +++++++++++++++++++++++++++++++++------------------- Refrences.md | 5 ++++ 2 files changed, 47 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index b44730a..4a19d16 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,10 @@ Notify If a Selected Plane has taken off or landed using Python with OpenSky or ADS-B Exchange Data, outputs location of takeoff location of landing and takeoff by reverse lookup of coordinates. +### Branches + +Their are two branches of this program single is the original only supports one plane works with OpenSky and ADSBX. Multi branch is the new version supports multiple planes currently only works with ADSBX, will eventually implement OpenSky. Your current viewing multi. + ### Discord Output Example ![Discord Output Example](./ExImages/DiscordEX.png?raw=true) @@ -33,20 +37,12 @@ Made it so I could track Elon Musk's Jet and share with others of his whereabout - If the landing event and takeoff events are true, It will output to any of the following built-in output methods. (Twitter, Pushbullet, and Discord all of which can be setup and enabled in config.ini). Outputs the location name, map image and takeoff time if landing. (Tweepy and "Pushbullet.py" and Discord_webhooks) -## Required PIP packages - -- OpenSky API (If using OpenSky, which is default and anybody can use) - -- geopy - -- colorama - -### Install OpenSky API +### Make sure Python/PIP is installed ```bash -apt install git -git clone https://github.com/openskynetwork/opensky-api.git -pip install -e ~/opensky-api/python +apt update +apt install python3 +apt install python3-pip ``` ### Install Colorama and geopy @@ -56,7 +52,29 @@ pip install colorama pip install geopy ``` -### Install Pushbullet, Tweepy, and Discord optional output methods already implemented in code +### Install Selenium / ChromeDriver or setup Google Static Maps + +Selenium/ChromeDriver is used to take a screenshot of the plane on globe.adsbexchange.com. Or use Google Static Maps, which can cost money if over used(No tutorial use https://developers.google.com/maps/documentation/maps-static/get-api-key to get to a key). + +#### 1. Chromium + +``` +sudo apt-get install chromium +``` + +#### 2. ChromeDriver + +``` +sudo apt-get install chromium-driver +``` + +#### 3. Selenium + +``` +pip install -U selenium +``` + +### Install Pushbullet, Tweepy, and Discord optional output methods already implemented in code, only install the ones you want to use. ```bash pip install tweepy @@ -64,7 +82,7 @@ pip install pushbullet.py pip install discord_webhooks ``` -Configure these methods of output in config.ini +These output methods once installed can be configured in planes config you create, using the example plane1.ini ### Install Screen to run in the background @@ -72,23 +90,22 @@ Configure these methods of output in config.ini apt install screen ``` -### Make sure Python is installed - -```bash -apt install python3 -``` - ### Download / Clone ```bash -git clone https://github.com/Jxck-S/plane-notify.git +apt install git +git clone -b multi --single-branch https://github.com/Jxck-S/plane-notify.git cd plane-notify ``` -### Configure config file with keys and URLs (config.ini) +### Configure main config file with keys and URLs (mainconf.ini) - edit them with nano or vi on the running machine or on your pc and transfer the config to where you will be running the bot +### Configure individual planes + +#### an example file is given (plane1.ini) Plane config files should be in the programs directory, the program looks for any file with a .ini exstenstion. + ### Enter and create new Screen Session ```bash @@ -98,12 +115,13 @@ screen -R ### Start Program ```bash -python3 NotifyBot.py +python3 NotifyBotMulti.py ``` ### TODO - Possibly implement airport name, done by closest airport -- General Cleanup +- General Cleanup +- Move all configs to own folder ### [ More Refrences / Documentation](Refrences.md) diff --git a/Refrences.md b/Refrences.md index 82e01ac..0083b56 100644 --- a/Refrences.md +++ b/Refrences.md @@ -12,6 +12,11 @@ ## GeoPy - Location Name Lookup - +- + +## Colorama + +- ## Google Static Maps From 860b6f606f0e5c516b1d933c6c2a96bf0cfb7539 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Mon, 28 Sep 2020 21:22:46 -0400 Subject: [PATCH 062/124] Get color working on Windows based terminals --- NotifyBotMulti.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/NotifyBotMulti.py b/NotifyBotMulti.py index 00534c5..c14ac20 100644 --- a/NotifyBotMulti.py +++ b/NotifyBotMulti.py @@ -3,7 +3,8 @@ import configparser import json import time from defADSBX import pullADSBX -from colorama import Fore, Back, Style +from colorama import init, Fore, Back, Style +init(convert=True) from planeClass import Plane from datetime import datetime import pytz From 15c8ba703cfc00e9ba85ac5d1380cf9af213ade3 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Mon, 28 Sep 2020 21:23:11 -0400 Subject: [PATCH 063/124] Add ptyz --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4a19d16..3df1103 100644 --- a/README.md +++ b/README.md @@ -45,11 +45,12 @@ apt install python3 apt install python3-pip ``` -### Install Colorama and geopy +### Install Colorama, geopy, ptyz ```bash pip install colorama pip install geopy +pip3 install ptyz ``` ### Install Selenium / ChromeDriver or setup Google Static Maps From e2a9bdefec18ef10b7cbf7fd595b11020aeb11eb Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Thu, 1 Oct 2020 21:48:27 -0400 Subject: [PATCH 064/124] Allows for retry when Incomplete HTTP reads --- defADSBX.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/defADSBX.py b/defADSBX.py index 9b03e87..e9c6d83 100644 --- a/defADSBX.py +++ b/defADSBX.py @@ -3,6 +3,7 @@ import json import configparser import time from datetime import datetime +from http.client import IncompleteRead main_config = configparser.ConfigParser() main_config.read('mainconf.ini') def pullADSBX(planes): @@ -21,7 +22,7 @@ def pullADSBX(planes): data = json.loads(data) print ("HTTP Status Code:", response.status_code) failed = False - except (requests.HTTPError, requests.ConnectionError, requests.Timeout) as error_message: + except (requests.HTTPError, requests.ConnectionError, requests.Timeout, IncompleteRead) as error_message: print("ADSBX Connection Error") print(error_message) failed = True From 9fc909f24587bd7a4bf4a0d91ca604447647ac1f Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sun, 4 Oct 2020 19:36:39 -0400 Subject: [PATCH 065/124] Move HTTP code out of try --- defADSBX.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/defADSBX.py b/defADSBX.py index e9c6d83..1581ecf 100644 --- a/defADSBX.py +++ b/defADSBX.py @@ -20,7 +20,6 @@ def pullADSBX(planes): response = requests.get(url, headers = headers) data = response.text data = json.loads(data) - print ("HTTP Status Code:", response.status_code) failed = False except (requests.HTTPError, requests.ConnectionError, requests.Timeout, IncompleteRead) as error_message: print("ADSBX Connection Error") @@ -31,6 +30,7 @@ def pullADSBX(planes): print (json.dumps(data, indent = 2)) print(error_message) failed = True + print ("HTTP Status Code:", response.status_code) if failed is False: data_ctime = float(data['ctime']) / 1000.0 print("UTC of Data:",datetime.utcfromtimestamp(data_ctime)) From 38fadf09d04df6bd7bf2aebd2831bb13c13abdcd Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sun, 4 Oct 2020 19:37:25 -0400 Subject: [PATCH 066/124] Remove leading zeros on flight time --- planeClass.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/planeClass.py b/planeClass.py index cc72fe5..fd4affc 100644 --- a/planeClass.py +++ b/planeClass.py @@ -40,6 +40,9 @@ class Plane: main_config = configparser.ConfigParser() main_config.read('mainconf.ini') + #Platform for determining OS for strftime + import platform + if self.config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): from defMap import getMap else: @@ -237,7 +240,10 @@ class Plane: self.landed_time_msg = "" if self.takeoff_time != None: self.landed_time = time.time() - self.takeoff_time - self.landed_time_msg = time.strftime("Apx. flt. time %H Hours : %M Mins ", time.gmtime(self.landed_time)) + if platform.system() == "Linux": + self.landed_time_msg = time.strftime("Apx. flt. time %-H Hours : %-M Mins ", time.gmtime(self.landed_time)) + elif platform.system() == "Windows": + self.landed_time_msg = time.strftime("Apx. flt. time %#H Hours : %#M Mins ", time.gmtime(self.landed_time)) if self.invalid_Location is False: self.landed_message = ("Landed just now in" + " " + self.aera_hierarchy + ", " + self.state + ", " + self.country_code + ". " + self.landed_time_msg) else: From 01022e5e7b13d64761134068d9d9aa64b677d9f1 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Mon, 5 Oct 2020 08:11:09 -0400 Subject: [PATCH 067/124] Implement OpenSky --- NotifyBotMulti.py | 32 +++++++++++++++++++++++--------- defOpenSky.py | 32 +++++++------------------------- planeClass.py | 41 ++++++++++++++++++++++++++++------------- 3 files changed, 58 insertions(+), 47 deletions(-) diff --git a/NotifyBotMulti.py b/NotifyBotMulti.py index c14ac20..ed9638c 100644 --- a/NotifyBotMulti.py +++ b/NotifyBotMulti.py @@ -3,6 +3,7 @@ import configparser import json import time from defADSBX import pullADSBX +from defOpenSky import pullOpenSky from colorama import init, Fore, Back, Style init(convert=True) from planeClass import Plane @@ -12,16 +13,13 @@ main_config = configparser.ConfigParser() main_config.read('mainconf.ini') import os #Setup Plane Objects off of Plane configs -if main_config.get('DATA', 'SOURCE') == "ADSBX": - planes = {} - for filename in os.listdir(os. getcwd()): - if filename.endswith(".ini") and filename != "mainconf.ini": - plane_config = configparser.ConfigParser() - plane_config.read(filename) - planes[plane_config.get('DATA', 'ICAO').upper()] = Plane(plane_config.get('DATA', 'ICAO'), filename) +planes = {} +for filename in os.listdir(os. getcwd()): + if filename.endswith(".ini") and filename != "mainconf.ini": + plane_config = configparser.ConfigParser() + plane_config.read(filename) + planes[plane_config.get('DATA', 'ICAO').upper()] = Plane(plane_config.get('DATA', 'ICAO'), filename) -elif main_config.get('DATA', 'SOURCE') == "OPENS": - raise NotImplementedError running_Count = 0 try: tz = pytz.timezone(main_config.get('DATA', 'TZ')) @@ -51,6 +49,22 @@ while True: else: for obj in planes.values(): obj.run(None) + elif main_config.get('DATA', 'SOURCE') == "OPENS": + planeData, failed = pullOpenSky(planes) + if failed == False: + if planeData.states != []: + for key, obj in planes.items(): + has_data = False + for dataState in planeData.states: + if (dataState.icao24).upper() == key: + obj.run(dataState) + has_data = True + break + if has_data is False: + obj.run(None) + else: + for obj in planes.values(): + obj.run(None) elapsed_calc_time = time.time() - start_time datetime_tz = datetime.now(tz) print (Back.GREEN, Fore.BLACK, "--------", running_Count, "--------", datetime_tz.strftime("%I:%M:%S %p"), "------------------------Elapsed Time-", elapsed_calc_time, " -------------------------------------", Style.RESET_ALL) diff --git a/defOpenSky.py b/defOpenSky.py index 0cfe782..df7b528 100644 --- a/defOpenSky.py +++ b/defOpenSky.py @@ -1,35 +1,17 @@ -def pullOpenSky(TRACK_PLANE): +def pullOpenSky(planes): import configparser config = configparser.ConfigParser() - config.read('config.ini') + config.read('mainconf.ini') from opensky_api import OpenSkyApi planeData = None opens_api = OpenSkyApi(config.get('OPENSKY', 'USERNAME'), config.get('OPENSKY', 'PASSWORD')) failed = False + icao_array = [] + for key, obj in planes.items(): + icao_array.append(key.lower()) try: - planeData = opens_api.get_states(time_secs=0, icao24=TRACK_PLANE.lower()) + planeData = opens_api.get_states(time_secs=0, icao24=icao_array) except: print ("OpenSky Error") failed = True - if failed is False and planeData != None: - plane_Dict = {} - geo_alt_m = None - for dataStates in planeData.states: - plane_Dict['icao'] = (dataStates.icao24).upper() - plane_Dict['callsign'] = (dataStates.callsign) - plane_Dict['longitude'] = (dataStates.longitude) - plane_Dict['latitude'] = (dataStates.latitude) - plane_Dict['on_ground'] = (dataStates.on_ground) - geo_alt_m = (dataStates.geo_altitude) - try: - if geo_alt_m != None: - plane_Dict['geo_alt_ft'] = geo_alt_m * 3.281 - elif plane_Dict['on_ground']: - plane_Dict['geo_alt_ft'] = 0 - except KeyError: - pass - if plane_Dict == {}: - plane_Dict = None - else: - plane_Dict = None - return plane_Dict, failed \ No newline at end of file + return planeData, failed \ No newline at end of file diff --git a/planeClass.py b/planeClass.py index fd4affc..83e2576 100644 --- a/planeClass.py +++ b/planeClass.py @@ -70,14 +70,29 @@ class Plane: self.latitude = None self.on_ground = None self.has_location = None - #Get API States for Plane + #Get States from ADSBX or OPENS Vector self.plane_Dict = None if main_config.get('DATA', 'SOURCE') == "OPENS": - raise NotImplementedError - #plane_Dict, failed = pullOpenSky(icao) - #print (Fore.YELLOW) - #print ("OpenSky Sourced Data: ", plane_Dict) - #print(Style.RESET_ALL) + self.val_error = False + if ac_dict != None: + try: + self.plane_Dict ={'icao' : ac_dict.icao24, 'callsign' : ac_dict.callsign, 'latitude' : ac_dict.latitude, 'longitude' : ac_dict.longitude, 'on_ground' : bool(ac_dict.on_ground)} + if ac_dict.geo_altitude != None: + self.plane_Dict['geo_alt_ft'] = float(ac_dict.geo_altitude) * 3.281 + elif self.plane_Dict['on_ground']: + self.plane_Dict['geo_alt_ft'] = 0 + except ValueError as e: + self.plane_Dict = None + self.val_error = True + print("Got data but some data is invalid!") + print(e) + else: + self.plane_Dict = None + + print (Fore.YELLOW) + print ("OpenSky Sourced Data: ", self.plane_Dict) + print(Style.RESET_ALL) + elif main_config.get('DATA', 'SOURCE') == "ADSBX": self.val_error = False if ac_dict != None: @@ -93,14 +108,14 @@ class Plane: else: self.plane_Dict = None - print (Fore.YELLOW) - print ("ADSBX Sourced Data: ", self.plane_Dict) - print(Style.RESET_ALL) - print (Fore.CYAN) - print ("ICAO:", self.icao) - print(Style.RESET_ALL) + print (Fore.YELLOW) + print ("ADSBX Sourced Data: ", self.plane_Dict) + print(Style.RESET_ALL) + print (Fore.CYAN) + print ("ICAO:", self.icao) + print(Style.RESET_ALL) + - #Pull Variables from plane_Dict if self.val_error is False: if self.plane_Dict == None: self.feeding = False From 5e9b9e5a767924174e042e867d0f255cc66dd115 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Mon, 5 Oct 2020 16:09:24 +0000 Subject: [PATCH 068/124] Colorama cross platform --- NotifyBotMulti.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/NotifyBotMulti.py b/NotifyBotMulti.py index ed9638c..f0e662e 100644 --- a/NotifyBotMulti.py +++ b/NotifyBotMulti.py @@ -4,8 +4,11 @@ import json import time from defADSBX import pullADSBX from defOpenSky import pullOpenSky -from colorama import init, Fore, Back, Style -init(convert=True) +from colorama import Fore, Back, Style +import platform +if platform.system() == "Windows": + from colorama import init + init(convert=True) from planeClass import Plane from datetime import datetime import pytz From 6fe6de885769067171b77a87f7d89b398dbffaec Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Mon, 5 Oct 2020 16:28:23 +0000 Subject: [PATCH 069/124] Add data recheck on feeding status change. --- planeClass.py | 302 +++++++++++++++++++++++++++----------------------- 1 file changed, 161 insertions(+), 141 deletions(-) diff --git a/planeClass.py b/planeClass.py index 83e2576..383b2a7 100644 --- a/planeClass.py +++ b/planeClass.py @@ -18,6 +18,8 @@ class Plane: self.map_file_name = icao.upper() + "_map.png" self.last_latitude = None self.last_longitude = None + self.recheck_needed = None + self.last_recheck_needed = None def getICAO(self): return self.icao def run(self, ac_dict): @@ -60,8 +62,6 @@ class Plane: self.pb = Pushbullet(self.config['PUSHBULLET']['API_KEY']) self.pb_channel = self.pb.get_channel(self.config.get('PUSHBULLET', 'CHANNEL_TAG')) - #Pre Set Non Reseting Variables - print (Back.MAGENTA, "---------", self.conf_file, "---------------------------- ICAO:", self.icao, "--------------------------", Style.RESET_ALL) #Reset Variables self.below_desired_ft = None @@ -131,169 +131,189 @@ class Plane: print ("Longitude: ", self.longitude) print ("GEO Alitude Ft: ", self.geo_alt_ft) print(Style.RESET_ALL) + #Set Check for inconsistancy in data + if not self.last_recheck_needed: + #Recheck needed if feeding state changes + if self.feeding != self.last_feeding: + self.recheck_needed = True + print("Recheck needed, feeding status changed") + elif self.last_recheck_needed: + self.recheck_needed = False + #Run a Check compares new data to last flagged(check) data + if self.last_recheck_needed: + if self.recheck_feeding == self.feeding: + print("Data Feeding change Consistent") + elif self.recheck_feeding != self.feeding: + print("Data Feeding change was Inconsistent last data ignored") + + self.recheck_feeding = self.feeding + self.last_recheck_needed = self.recheck_needed + + if self.recheck_needed is False: + #Check if below desire ft if self.geo_alt_ft is None: self.below_desired_ft = False elif self.geo_alt_ft < 10000: self.below_desired_ft = True - #Check if tookoff - self.tookoff = bool(self.below_desired_ft and self.on_ground is False and ((self.last_feeding is False and self.feeding) or (self.last_on_ground))) - print ("Tookoff Just Now:", self.tookoff) + #Check if tookoff + self.tookoff = bool(self.below_desired_ft and self.on_ground is False and ((self.last_feeding is False and self.feeding) or (self.last_on_ground))) + print ("Tookoff Just Now:", self.tookoff) - #Check if Landed - self.landed = bool(self.last_below_desired_ft and ((self.last_feeding and self.feeding is False and self.last_on_ground is False) or (self.on_ground and self.last_on_ground is False))) - print ("Landed Just Now:", self.landed) + #Check if Landed + self.landed = bool(self.last_below_desired_ft and ((self.last_feeding and self.feeding is False and self.last_on_ground is False) or (self.on_ground and self.last_on_ground is False))) + print ("Landed Just Now:", self.landed) - #Lookup Location of coordinates - if self.landed or self.tookoff: - if self.landed and self.last_longitude != None and self.last_latitude != None: - self.combined = f"{self.last_latitude}, {self.last_longitude}" - self.has_coords = True - elif self.tookoff and self.longitude != None and self.latitude != None: - self.combined = f"{self.latitude} , {self.longitude}" - self.has_coords = True - else: - print (Fore.RED + 'No Location') - self.has_location = False - self.invalid_Location = True - self.has_coords = False - print(Style.RESET_ALL) - if self.has_coords: - try: - self.location = geolocator.reverse(self.combined) - except: - print ("Geopy API Error") + #Lookup Location of coordinates + if self.landed or self.tookoff: + if self.landed and self.last_longitude != None and self.last_latitude != None: + self.combined = f"{self.last_latitude}, {self.last_longitude}" + self.has_coords = True + elif self.tookoff and self.longitude != None and self.latitude != None: + self.combined = f"{self.latitude} , {self.longitude}" + self.has_coords = True else: - # print (Fore.YELLOW, "Geopy debug: ", location.raw, Style.RESET_ALL) - self.has_location = True + print (Fore.RED + 'No Location') + self.has_location = False + self.invalid_Location = True + self.has_coords = False + print(Style.RESET_ALL) + if self.has_coords: + try: + self.location = geolocator.reverse(self.combined) + except: + print ("Geopy API Error") + else: + # print (Fore.YELLOW, "Geopy debug: ", location.raw, Style.RESET_ALL) + self.has_location = True - #Figure if valid location, valid being geopy finds a location - if self.has_location: - try: - self.geoError = self.location.raw['error'] - except KeyError: - self.invalid_Location = False - self.geoError = None - else: - self.invalid_Location = True + #Figure if valid location, valid being geopy finds a location + if self.has_location: + try: + self.geoError = self.location.raw['error'] + except KeyError: + self.invalid_Location = False + self.geoError = None + else: + self.invalid_Location = True - print ("Invalid Location: ", self.invalid_Location) + print ("Invalid Location: ", self.invalid_Location) - if self.invalid_Location: - print (Fore.RED) - print (self.geoError) - print ("Likely Over Water or Invalid Location") - print(Style.RESET_ALL) + if self.invalid_Location: + print (Fore.RED) + print (self.geoError) + print ("Likely Over Water or Invalid Location") + print(Style.RESET_ALL) - #Convert Full address to sep variables only if Valid Location - elif self.invalid_Location is False: - self.address = self.location.raw['address'] - self.country = self.address.get('country', '') - self.country_code = self.address.get('country_code', '').upper() - self.state = self.address.get('state', '') - self.county = self.address.get('county', '') - self.city = self.address.get('city', '') - self.town = self.address.get('town', '') - self.hamlet = self.address.get('hamlet', '') - # print (Fore.YELLOW) - # print ("Address Fields debug: ", self.address) - # print(Style.RESET_ALL) - print (Fore.GREEN) - print("Entire Address: ", self.location.address) - print ("Country Code: ", self.country_code) - print ("Country: ", self.country) - print ("State: ", self.state) - print ("City: ", self.city) - print ("Town: ", self.town) - print ("Hamlet: ", self.hamlet) - print ("County: ", self.county) - print(Style.RESET_ALL) - #Chose city town county or hamlet for location as not all are always avalible. - if self.invalid_Location is False: - self.aera_hierarchy = self.city or self.town or self.county or self.hamlet - #Set Discord Title - if self.config.getboolean('DISCORD', 'ENABLE'): - self.dis_title = self.icao if self.config.get('DISCORD', 'TITLE') == "icao" else self.callsign if self.config.get('DISCORD', 'TITLE') == "callsign" else self.config.get('DISCORD', 'TITLE') - - #Takeoff Notifcation and Landed - if self.tookoff: + #Convert Full address to sep variables only if Valid Location + elif self.invalid_Location is False: + self.address = self.location.raw['address'] + self.country = self.address.get('country', '') + self.country_code = self.address.get('country_code', '').upper() + self.state = self.address.get('state', '') + self.county = self.address.get('county', '') + self.city = self.address.get('city', '') + self.town = self.address.get('town', '') + self.hamlet = self.address.get('hamlet', '') + # print (Fore.YELLOW) + # print ("Address Fields debug: ", self.address) + # print(Style.RESET_ALL) + print (Fore.GREEN) + print("Entire Address: ", self.location.address) + print ("Country Code: ", self.country_code) + print ("Country: ", self.country) + print ("State: ", self.state) + print ("City: ", self.city) + print ("Town: ", self.town) + print ("Hamlet: ", self.hamlet) + print ("County: ", self.county) + print(Style.RESET_ALL) + #Chose city town county or hamlet for location as not all are always avalible. if self.invalid_Location is False: - self.tookoff_message = ("Just took off from" + " " + self.aera_hierarchy + ", " + self.state + ", " + self.country_code) - else: - self.tookoff_message = ("Just took off") - print (self.tookoff_message) - #Google Map or tar1090 screenshot - if self.config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): - getMap(self.aera_hierarchy + ", " + self.state + ", " + self.country_code) - else: - getSS(self.icao) - #Discord + self.aera_hierarchy = self.city or self.town or self.county or self.hamlet + #Set Discord Title if self.config.getboolean('DISCORD', 'ENABLE'): - self.dis_message = self.dis_title + " " + self.tookoff_message - sendDis(self.dis_message, self.map_file_name, self.conf_file) - #PushBullet - if self.config.getboolean('PUSHBULLET', 'ENABLE'): - with open(self.map_file_name, "rb") as pic: - map_data = self.pb.upload_file(pic, "Tookoff IMG") - push = self.pb_channel.push_note(self.config.get('PUSHBULLET', 'TITLE'), self.tookoff_message) - push = self.pb_channel.push_file(**map_data) - #Twitter - if self.config.getboolean('TWITTER', 'ENABLE'): - self.tweet_api.update_with_media(self.map_file_name, status = self.tookoff_message) - self.takeoff_time = time.time() - os.remove(self.map_file_name) + self.dis_title = self.icao if self.config.get('DISCORD', 'TITLE') == "icao" else self.callsign if self.config.get('DISCORD', 'TITLE') == "callsign" else self.config.get('DISCORD', 'TITLE') + + #Takeoff Notifcation and Landed + if self.tookoff: + if self.invalid_Location is False: + self.tookoff_message = ("Just took off from" + " " + self.aera_hierarchy + ", " + self.state + ", " + self.country_code) + else: + self.tookoff_message = ("Just took off") + print (self.tookoff_message) + #Google Map or tar1090 screenshot + if self.config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): + getMap(self.aera_hierarchy + ", " + self.state + ", " + self.country_code) + else: + getSS(self.icao) + #Discord + if self.config.getboolean('DISCORD', 'ENABLE'): + self.dis_message = self.dis_title + " " + self.tookoff_message + sendDis(self.dis_message, self.map_file_name, self.conf_file) + #PushBullet + if self.config.getboolean('PUSHBULLET', 'ENABLE'): + with open(self.map_file_name, "rb") as pic: + map_data = self.pb.upload_file(pic, "Tookoff IMG") + push = self.pb_channel.push_note(self.config.get('PUSHBULLET', 'TITLE'), self.tookoff_message) + push = self.pb_channel.push_file(**map_data) + #Twitter + if self.config.getboolean('TWITTER', 'ENABLE'): + self.tweet_api.update_with_media(self.map_file_name, status = self.tookoff_message) + self.takeoff_time = time.time() + os.remove(self.map_file_name) - if self.landed: - self.landed_time_msg = "" - if self.takeoff_time != None: - self.landed_time = time.time() - self.takeoff_time - if platform.system() == "Linux": - self.landed_time_msg = time.strftime("Apx. flt. time %-H Hours : %-M Mins ", time.gmtime(self.landed_time)) - elif platform.system() == "Windows": - self.landed_time_msg = time.strftime("Apx. flt. time %#H Hours : %#M Mins ", time.gmtime(self.landed_time)) - if self.invalid_Location is False: - self.landed_message = ("Landed just now in" + " " + self.aera_hierarchy + ", " + self.state + ", " + self.country_code + ". " + self.landed_time_msg) - else: - self.landed_message = ("Landed just now" , self.landed_time_msg) - print (self.landed_message) - #Google Map or tar1090 screenshot - if self.config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): - getMap(self.aera_hierarchy + ", " + self.state + ", " + self.country_code) - else: - getSS(self.icao) - #Discord - if self.config.getboolean('DISCORD', 'ENABLE'): - self.dis_message = self.dis_title + " " + self.landed_message - sendDis(self.dis_message, self.map_file_name, self.conf_file) - #PushBullet - if self.config.getboolean('PUSHBULLET', 'ENABLE'): - with open(self.map_file_name, "rb") as pic: - map_data = self.pb.upload_file(pic, "Landed IMG") - push = self.pb_channel.push_note(self.config.get('PUSHBULLET', 'TITLE'), self.landed_message) - push = self.pb_channel.push_file(**map_data) - #Twitter - if self.config.getboolean('TWITTER', 'ENABLE'): - self.tweet_api.update_with_media(self.map_file_name, status = self.landed_message) - self.takeoff_time = None - self.landed_time = None - self.time_since_tk = None - os.remove(self.map_file_name) + if self.landed: + self.landed_time_msg = "" + if self.takeoff_time != None: + self.landed_time = time.time() - self.takeoff_time + if platform.system() == "Linux": + self.landed_time_msg = time.strftime("Apx. flt. time %-H Hours : %-M Mins ", time.gmtime(self.landed_time)) + elif platform.system() == "Windows": + self.landed_time_msg = time.strftime("Apx. flt. time %#H Hours : %#M Mins ", time.gmtime(self.landed_time)) + if self.invalid_Location is False: + self.landed_message = ("Landed just now in" + " " + self.aera_hierarchy + ", " + self.state + ", " + self.country_code + ". " + self.landed_time_msg) + else: + self.landed_message = ("Landed just now" , self.landed_time_msg) + print (self.landed_message) + #Google Map or tar1090 screenshot + if self.config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): + getMap(self.aera_hierarchy + ", " + self.state + ", " + self.country_code) + else: + getSS(self.icao) + #Discord + if self.config.getboolean('DISCORD', 'ENABLE'): + self.dis_message = self.dis_title + " " + self.landed_message + sendDis(self.dis_message, self.map_file_name, self.conf_file) + #PushBullet + if self.config.getboolean('PUSHBULLET', 'ENABLE'): + with open(self.map_file_name, "rb") as pic: + map_data = self.pb.upload_file(pic, "Landed IMG") + push = self.pb_channel.push_note(self.config.get('PUSHBULLET', 'TITLE'), self.landed_message) + push = self.pb_channel.push_file(**map_data) + #Twitter + if self.config.getboolean('TWITTER', 'ENABLE'): + self.tweet_api.update_with_media(self.map_file_name, status = self.landed_message) + self.takeoff_time = None + self.landed_time = None + self.time_since_tk = None + os.remove(self.map_file_name) - #Set Variables to compare to next check - self.last_feeding = self.feeding - self.last_geo_alt_ft = self.geo_alt_ft - self.last_on_ground = self.on_ground - self.last_below_desired_ft = self.below_desired_ft - self.last_longitude = self.longitude - self.last_latitude = self.latitude + #Set Variables to compare to next check + self.last_feeding = self.feeding + self.last_geo_alt_ft = self.geo_alt_ft + self.last_on_ground = self.on_ground + self.last_below_desired_ft = self.below_desired_ft + self.last_longitude = self.longitude + self.last_latitude = self.latitude elif self.val_error: print ("Failed to Parse Will Recheck this Plane After new data") From 7c40dd1a620cb37815567955a43f6ef4c5772c29 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Mon, 5 Oct 2020 12:34:22 -0400 Subject: [PATCH 070/124] Change to modern headless tag --- defSS.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/defSS.py b/defSS.py index 189e4dc..5ae6fb8 100644 --- a/defSS.py +++ b/defSS.py @@ -9,7 +9,7 @@ from selenium import webdriver import time def getSS(icao): chrome_options = webdriver.ChromeOptions() - chrome_options.add_argument('--headless') + chrome_options.headless = True chrome_options.add_argument('window-size=800,800') #chrome_options.add_argument('--no-sandbox') # required when running as root user. otherwise you would get no sandbox errors. browser = webdriver.Chrome(options=chrome_options) From 7182433462545ff528b42eaeadd6fe06b27a78ec Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Wed, 7 Oct 2020 02:47:54 +0000 Subject: [PATCH 071/124] Fix anonymous OpenSky API access --- defOpenSky.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/defOpenSky.py b/defOpenSky.py index df7b528..0d40bd7 100644 --- a/defOpenSky.py +++ b/defOpenSky.py @@ -1,10 +1,10 @@ def pullOpenSky(planes): import configparser - config = configparser.ConfigParser() - config.read('mainconf.ini') + main_config = configparser.ConfigParser() + main_config.read('mainconf.ini') from opensky_api import OpenSkyApi planeData = None - opens_api = OpenSkyApi(config.get('OPENSKY', 'USERNAME'), config.get('OPENSKY', 'PASSWORD')) + opens_api = OpenSkyApi(username= None if main_config.get('OPENSKY', 'USERNAME').upper() == "NONE" else main_config.get('OPENSKY', 'USERNAME'), password= None if main_config.get('OPENSKY', 'PASSWORD').upper() == "NONE" else main_config.get('OPENSKY', 'PASSWORD').upper()) failed = False icao_array = [] for key, obj in planes.items(): From 9bdf301a77b77f330a968865e863e10f4d45ca34 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Wed, 7 Oct 2020 03:26:44 +0000 Subject: [PATCH 072/124] Update README, move Pseudo --- PseudoCode.md | 15 +++++++++++++++ README.md | 38 ++++++++++---------------------------- 2 files changed, 25 insertions(+), 28 deletions(-) create mode 100644 PseudoCode.md diff --git a/PseudoCode.md b/PseudoCode.md new file mode 100644 index 0000000..33c573d --- /dev/null +++ b/PseudoCode.md @@ -0,0 +1,15 @@ +### How It works + +- Takes data about every ~30 seconds from OpenSky Network or ADS-B Exchange and compares it to previous data with what I've defined as a landing or takeoff event. + +- A takeoff event is the plane is not on the ground, below 10k feet and ((previously no data and now getting data) or was previously on the ground). + +- A landing event is previously below 10k feet and (previously getting data, no longer getting data and previously not on the ground) or (now on the ground and previously not on the ground). + +- Given the coordinates of the aircraft the coordinates are reverse looked up for a location name. (GeoPY Nomination Geolocator) + +- At the time of takeoff a takeoff time is set, which is referenced in the landing event to calculate approximate total flight time. + +- A Static map image is created based off location name. (Google Static Maps API) or a screenshot of is created using Selenium/ChromeDriver The selected plane is locked on in the screenshot. + +- If the landing event and takeoff events are true, It will output to any of the following built-in output methods. (Twitter, Pushbullet, and Discord all of which can be setup and enabled in each planes config file. Outputs the location name, map image and flight time on landing. (Tweepy and "Pushbullet.py" and Discord_webhooks) \ No newline at end of file diff --git a/README.md b/README.md index 3df1103..08fbd8c 100644 --- a/README.md +++ b/README.md @@ -3,11 +3,11 @@ [![Codacy Badge](https://api.codacy.com/project/badge/Grade/c4e1d839eec3468cadfe351d64dc1ac4)](https://app.codacy.com/manual/Jxck-S/plane-notify?utm_source=github.com&utm_medium=referral&utm_content=Jxck-S/plane-notify&utm_campaign=Badge_Grade_Settings) [![GPLv3 License](https://img.shields.io/badge/License-GPL%20v3-yellow.svg)](https://opensource.org/licenses/) -Notify If a Selected Plane has taken off or landed using Python with OpenSky or ADS-B Exchange Data, outputs location of takeoff location of landing and takeoff by reverse lookup of coordinates. +Notify if configured planes have taken off or landed using Python with OpenSky or ADS-B Exchange Data, outputs location of takeoff location of landing and takeoff by reverse lookup of coordinates. ### Branches -Their are two branches of this program single is the original only supports one plane works with OpenSky and ADSBX. Multi branch is the new version supports multiple planes currently only works with ADSBX, will eventually implement OpenSky. Your current viewing multi. +Their are two branches of this program single is the original only supports one plane works with OpenSky and ADSBX. Multi branch is the new version supports multiple planes, mainly built around being based on ADSBX data, OpenSky data in this version may have issues, didn't test much. Your current viewing multi. ### Discord Output Example @@ -17,25 +17,13 @@ Their are two branches of this program single is the original only supports one [ExImages](./ExImages) -## Why I made it +### Background -Made it so I could track Elon Musk's Jet and share with others of his whereabouts on Twitter. [![Twitter Follow](https://img.shields.io/twitter/follow/ElonJet.svg?style=social)](https://twitter.com/ElonJet) +I made this program so I could track Elon Musk's Jet and share with others of his whereabouts on Twitter. [![Twitter Follow](https://img.shields.io/twitter/follow/ElonJet.svg?style=social)](https://twitter.com/ElonJet) I have now Expanded and run multiple accounts for multiple planes, a list of the accounts here [plane-notify Twitter List](https://twitter.com/i/lists/1307414615316467715) -## How It works +### [ How It Works](PseudoCode.md) -- Takes data about every 15 seconds from OpenSky Network or ADS-B Exchange and compares it to previous data with what I've defined as a landing or takeoff event. - -- A takeoff event is the plane is not on the ground, below 10k feet and ((previously no data and now getting data) or was previously on the ground). - -- A landing event is previously below 10k feet and (previously getting data, no longer getting data and previously not on the ground) or (now on the ground and previously not on the ground). - -- Given the coordinates of the aircraft the coordinates are reverse looked up for a location name. (GeoPY Nomination Geolocator) - -- At the time of takeoff a takeoff time is set, which is referenced in the landing event to calculate approximate total flight time. - -- A Static map image is created based off location name. (Google Static Maps API) or a screenshot of is created using Selenium/ChromeDriver The selected plane is locked on in the screenshot. - -- If the landing event and takeoff events are true, It will output to any of the following built-in output methods. (Twitter, Pushbullet, and Discord all of which can be setup and enabled in config.ini). Outputs the location name, map image and takeoff time if landing. (Tweepy and "Pushbullet.py" and Discord_webhooks) +## Setup / Install ### Make sure Python/PIP is installed @@ -55,25 +43,19 @@ pip3 install ptyz ### Install Selenium / ChromeDriver or setup Google Static Maps -Selenium/ChromeDriver is used to take a screenshot of the plane on globe.adsbexchange.com. Or use Google Static Maps, which can cost money if over used(No tutorial use https://developers.google.com/maps/documentation/maps-static/get-api-key to get to a key). +Selenium/ChromeDriver is used to take a screenshot of the plane on globe.adsbexchange.com. Or use Google Static Maps, which can cost money if over used(No tutorial use to get to a key). #### 1. Chromium -``` -sudo apt-get install chromium -``` + sudo apt-get install chromium #### 2. ChromeDriver -``` -sudo apt-get install chromium-driver -``` + sudo apt-get install chromium-driver #### 3. Selenium -``` -pip install -U selenium -``` + pip install -U selenium ### Install Pushbullet, Tweepy, and Discord optional output methods already implemented in code, only install the ones you want to use. From 4784dbb4c3f9e5a873bb0979a564ad126c3260fe Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Wed, 7 Oct 2020 16:31:51 -0400 Subject: [PATCH 073/124] Only check incosistency on loss --- planeClass.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/planeClass.py b/planeClass.py index 383b2a7..9bc46de 100644 --- a/planeClass.py +++ b/planeClass.py @@ -131,12 +131,14 @@ class Plane: print ("Longitude: ", self.longitude) print ("GEO Alitude Ft: ", self.geo_alt_ft) print(Style.RESET_ALL) - #Set Check for inconsistancy in data + #Set Check for inconsistancy in data if not self.last_recheck_needed: #Recheck needed if feeding state changes - if self.feeding != self.last_feeding: + if self.feeding == False and self.last_feeding: self.recheck_needed = True print("Recheck needed, feeding status changed") + else: + self.recheck_needed = False elif self.last_recheck_needed: self.recheck_needed = False @@ -148,9 +150,9 @@ class Plane: elif self.recheck_feeding != self.feeding: print("Data Feeding change was Inconsistent last data ignored") - self.recheck_feeding = self.feeding + self.recheck_feeding = self.feeding self.last_recheck_needed = self.recheck_needed - + if self.recheck_needed is False: #Check if below desire ft From 99cb32426cd7e21ba12501aa97b7736e127c3e3c Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 10 Oct 2020 12:51:52 -0400 Subject: [PATCH 074/124] Change Connection Exceptions --- defADSBX.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/defADSBX.py b/defADSBX.py index 1581ecf..0ee6f7c 100644 --- a/defADSBX.py +++ b/defADSBX.py @@ -21,7 +21,7 @@ def pullADSBX(planes): data = response.text data = json.loads(data) failed = False - except (requests.HTTPError, requests.ConnectionError, requests.Timeout, IncompleteRead) as error_message: + except (requests.HTTPError, requests.Timeout, IncompleteRead, ConnectionError, ConnectionResetError) as error_message: print("ADSBX Connection Error") print(error_message) failed = True From 21c68f93cb29b74b2317c73dd74c63782ba641b3 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Sat, 10 Oct 2020 18:53:48 +0000 Subject: [PATCH 075/124] Differ land/take off statement --- planeClass.py | 50 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 9 deletions(-) diff --git a/planeClass.py b/planeClass.py index 383b2a7..9bb0658 100644 --- a/planeClass.py +++ b/planeClass.py @@ -134,9 +134,11 @@ class Plane: #Set Check for inconsistancy in data if not self.last_recheck_needed: #Recheck needed if feeding state changes - if self.feeding != self.last_feeding: + if self.feeding == False and self.last_feeding: self.recheck_needed = True print("Recheck needed, feeding status changed") + else: + self.recheck_needed = False elif self.last_recheck_needed: self.recheck_needed = False @@ -148,9 +150,9 @@ class Plane: elif self.recheck_feeding != self.feeding: print("Data Feeding change was Inconsistent last data ignored") - self.recheck_feeding = self.feeding + self.recheck_feeding = self.feeding self.last_recheck_needed = self.recheck_needed - + if self.recheck_needed is False: #Check if below desire ft @@ -159,13 +161,43 @@ class Plane: elif self.geo_alt_ft < 10000: self.below_desired_ft = True #Check if tookoff - self.tookoff = bool(self.below_desired_ft and self.on_ground is False and ((self.last_feeding is False and self.feeding) or (self.last_on_ground))) + if self.below_desired_ft and self.on_ground is False: + if self.last_on_ground: + self.tookoff = True + self.trigger_type = "no longer on ground" + self.tookoff_header = "Took off from " + elif self.last_feeding is False and self.feeding: + self.tookoff = True + self.trigger_type = "data acquisition" + self.tookoff_header = "Took off near " + else: + self.tookoff = False + else: + self.tookoff = False + + #self.tookoff = bool(self.below_desired_ft and self.on_ground is False and ((self.last_feeding is False and self.feeding) or (self.last_on_ground))) print ("Tookoff Just Now:", self.tookoff) #Check if Landed - self.landed = bool(self.last_below_desired_ft and ((self.last_feeding and self.feeding is False and self.last_on_ground is False) or (self.on_ground and self.last_on_ground is False))) + if self.last_below_desired_ft: + if self.on_ground and self.last_on_ground is False: + self.landed = True + self.trigger_type = "now on ground" + self.landed_header = "Landed in " + elif self.last_feeding and self.feeding is False and self.last_on_ground is False: + self.landed = True + self.trigger_type = "data loss" + self.landed_header = "Landed near " + else: + self.landed = False + else: + self.landed = False + + #self.landed = bool(self.last_below_desired_ft and ((self.last_feeding and self.feeding is False and self.last_on_ground is False) or (self.on_ground and self.last_on_ground is False))) print ("Landed Just Now:", self.landed) + if self.landed or self.tookoff: + print ("Trigger Type:", self.trigger_type) #Lookup Location of coordinates if self.landed or self.tookoff: @@ -245,9 +277,9 @@ class Plane: #Takeoff Notifcation and Landed if self.tookoff: if self.invalid_Location is False: - self.tookoff_message = ("Just took off from" + " " + self.aera_hierarchy + ", " + self.state + ", " + self.country_code) + self.tookoff_message = (self.tookoff_header + self.aera_hierarchy + ", " + self.state + ", " + self.country_code) else: - self.tookoff_message = ("Just took off") + self.tookoff_message = ("Took off") print (self.tookoff_message) #Google Map or tar1090 screenshot if self.config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): @@ -280,9 +312,9 @@ class Plane: elif platform.system() == "Windows": self.landed_time_msg = time.strftime("Apx. flt. time %#H Hours : %#M Mins ", time.gmtime(self.landed_time)) if self.invalid_Location is False: - self.landed_message = ("Landed just now in" + " " + self.aera_hierarchy + ", " + self.state + ", " + self.country_code + ". " + self.landed_time_msg) + self.landed_message = (self.landed_header + self.aera_hierarchy + ", " + self.state + ", " + self.country_code + ". " + self.landed_time_msg) else: - self.landed_message = ("Landed just now" , self.landed_time_msg) + self.landed_message = ("Landed", self.landed_time_msg) print (self.landed_message) #Google Map or tar1090 screenshot if self.config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): From 39d991e9961d929d1e09fad27c34e41ba0c96bfb Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Fri, 16 Oct 2020 21:27:35 -0400 Subject: [PATCH 076/124] Add contribute info --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 08fbd8c..f93e5b9 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,9 @@ Their are two branches of this program single is the original only supports one I made this program so I could track Elon Musk's Jet and share with others of his whereabouts on Twitter. [![Twitter Follow](https://img.shields.io/twitter/follow/ElonJet.svg?style=social)](https://twitter.com/ElonJet) I have now Expanded and run multiple accounts for multiple planes, a list of the accounts here [plane-notify Twitter List](https://twitter.com/i/lists/1307414615316467715) +### Contributing + Im open to any help or suggestions, I realize theirs much better ways im sure to do alot of my methods, im only a noob. I'll accept pull requests. If you'd like to discuss join https://JacksTech.net/Discord + ### [ How It Works](PseudoCode.md) ## Setup / Install From 1029043d51994f9605c600dc137085eab81c1a8d Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Thu, 22 Oct 2020 19:03:44 -0400 Subject: [PATCH 077/124] Improve waiting for load on screenshot --- defSS.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/defSS.py b/defSS.py index 5ae6fb8..4b2c157 100644 --- a/defSS.py +++ b/defSS.py @@ -5,17 +5,23 @@ #https://tecadmin.net/setup-selenium-with-chromedriver-on-debian/ #https://blog.testproject.io/2018/02/20/chrome-headless-selenium-python-linux-servers/ #https://serverfault.com/questions/172076/how-to-find-the-browser-versions-from-command-line-in-linux-windows +#https://pypi.org/project/webdriver-manager/ from selenium import webdriver +from webdriver_manager.chrome import ChromeDriverManager import time +from selenium.webdriver.support.ui import WebDriverWait def getSS(icao): chrome_options = webdriver.ChromeOptions() chrome_options.headless = True chrome_options.add_argument('window-size=800,800') + chrome_options.add_argument('ignore-certificate-errors') + chrome_options.add_argument("--enable-logging --v=1") #chrome_options.add_argument('--no-sandbox') # required when running as root user. otherwise you would get no sandbox errors. - browser = webdriver.Chrome(options=chrome_options) + browser = webdriver.Chrome(ChromeDriverManager().install(), options=chrome_options) url = "https://globe.adsbexchange.com/?largeMode=2&hideButtons&hideSidebar&mapDim=0&zoom=9&icao=" + icao + browser.set_page_load_timeout(80) browser.get(url) - time.sleep(30) + WebDriverWait(browser, 10).until(lambda d: d.execute_script("return jQuery.active == 0")) file_name = icao + "_map.png" browser.save_screenshot(file_name) browser.quit() \ No newline at end of file From 76313acfe91725f944f762a7be74842ab1b02250 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sun, 25 Oct 2020 22:42:50 -0400 Subject: [PATCH 078/124] Move config files/reduce repase, intital airport lookup --- NotifyBotMulti.py | 6 +- mainconf.ini => configs/mainconf.ini | 4 + plane1.ini => configs/plane1.ini | 20 ++--- defADSBX.py | 46 ++++++++--- defAirport.py | 27 +++++++ defDiscord.py | 5 +- defMap.py | 7 +- defOpenSky.py | 2 +- defTweet.py | 5 +- planeClass.py | 111 +++++++++++++++------------ 10 files changed, 148 insertions(+), 85 deletions(-) rename mainconf.ini => configs/mainconf.ini (86%) rename plane1.ini => configs/plane1.ini (61%) create mode 100644 defAirport.py diff --git a/NotifyBotMulti.py b/NotifyBotMulti.py index f0e662e..9d298db 100644 --- a/NotifyBotMulti.py +++ b/NotifyBotMulti.py @@ -13,14 +13,14 @@ from planeClass import Plane from datetime import datetime import pytz main_config = configparser.ConfigParser() -main_config.read('mainconf.ini') +main_config.read('./configs/mainconf.ini') import os #Setup Plane Objects off of Plane configs planes = {} -for filename in os.listdir(os. getcwd()): +for filename in os.listdir("./configs"): if filename.endswith(".ini") and filename != "mainconf.ini": plane_config = configparser.ConfigParser() - plane_config.read(filename) + plane_config.read(("./configs/" + filename)) planes[plane_config.get('DATA', 'ICAO').upper()] = Plane(plane_config.get('DATA', 'ICAO'), filename) running_Count = 0 diff --git a/mainconf.ini b/configs/mainconf.ini similarity index 86% rename from mainconf.ini rename to configs/mainconf.ini index 4adde27..f2ad476 100644 --- a/mainconf.ini +++ b/configs/mainconf.ini @@ -19,3 +19,7 @@ API_KEY = apikey USERNAME = None PASSWORD = None +[GOOGLE] +#API KEY for Google Static Maps only if you using this on any of the planes. +API_KEY = googleapikey + diff --git a/plane1.ini b/configs/plane1.ini similarity index 61% rename from plane1.ini rename to configs/plane1.ini index fd374dc..e3bcc58 100644 --- a/plane1.ini +++ b/configs/plane1.ini @@ -1,20 +1,22 @@ [DATA] #Plane to track, based of ICAO or ICAO24 which is the unique transponder address of a plane. -ICAO = icao +ICAO = icaohere + +[MAP] +#Map to create from Google Static Maps or screenshot global tar1090 from globe.adsbexchange.com +#Enter GOOGLESTATICMAP or ADSBX +OPTION = ADSBX + +#TITLE for Twitter, PB and Discord are Just text added to the front of each message/tweet sent [TWITTER] ENABLE = FALSE +TITLE = CONSUMER_KEY = ckhere CONSUMER_SECRET = cshere ACCESS_TOKEN = athere ACCESS_TOKEN_SECRET = atshere -[GOOGLE] -#API KEYS -#If static map disabled will load up tar1090 ads-b exchange and take screenshot instead. -STATICMAP_ENABLE = FALSE -STATICMAPKEY = googleapikey - [PUSHBULLET] ENABLE = FALSE TITLE = Title Of Pushbullet message @@ -22,8 +24,8 @@ API_KEY = apikey CHANNEL_TAG = channeltag [DISCORD] -ENABLE = FALSE +ENABLE = TRUE #WEBHOOK URL https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks URL = webhookurl -Title = title +Title = USERNAME = plane-notify diff --git a/defADSBX.py b/defADSBX.py index 0ee6f7c..28184ad 100644 --- a/defADSBX.py +++ b/defADSBX.py @@ -4,8 +4,10 @@ import configparser import time from datetime import datetime from http.client import IncompleteRead +import http.client as http +import urllib3 main_config = configparser.ConfigParser() -main_config.read('mainconf.ini') +main_config.read('./configs/mainconf.ini') def pullADSBX(planes): if len(planes) > 1: url = "https://adsbexchange.com/api/aircraft/json/" @@ -14,22 +16,46 @@ def pullADSBX(planes): headers = { 'api-auth': main_config.get('ADSBX', 'API_KEY'), - 'Content-Encoding': 'gzip' + 'Accept-Encoding': 'gzip' } try: response = requests.get(url, headers = headers) - data = response.text - data = json.loads(data) - failed = False - except (requests.HTTPError, requests.Timeout, IncompleteRead, ConnectionError, ConnectionResetError) as error_message: - print("ADSBX Connection Error") + response.raise_for_status() + except (requests.exceptions.HTTPError, requests.exceptions.ConnectionError, requests.exceptions.Timeout, requests.exceptions.RequestException): + print("Basic Connection Error") print(error_message) failed = True - except json.decoder.JSONDecodeError as error_message: - print("Error with JSON") - print (json.dumps(data, indent = 2)) + data = None + except (urllib3.exceptions.RemoteDisconected, IncompleteRead, http.IncompleteRead, ConnectionResetError, requests.ChunkEncodingError, urllib3.exceptions.ProtocolError, ValueError) as error_message: + print("Connection Error") print(error_message) failed = True + data = None + except Exception as error_message: + print("Connection Error uncaught, basic exception for all") + print(error_message) + failed = True + data = None + else: + if response.status_code == 200: + try: + data = json.loads(response.text) + except (json.decoder.JSONDecodeError, ValueError) as error_message: + print("Error with JSON") + print (json.dumps(data, indent = 2)) + print(error_message) + failed = True + data = None + except TypeError as error_message: + print("Type Error", error_message) + failed = True + data = None + else: + failed = False + else: + failed = True + data = None + print ("HTTP Status Code:", response.status_code) if failed is False: data_ctime = float(data['ctime']) / 1000.0 diff --git a/defAirport.py b/defAirport.py new file mode 100644 index 0000000..5970e8c --- /dev/null +++ b/defAirport.py @@ -0,0 +1,27 @@ +#https://www.geeksforgeeks.org/python-calculate-distance-between-two-places-using-geopy/ +#https://openflights.org/data.html +def getAirport(latitude, longitude): + import json + import csv + from geopy.distance import geodesic + plane = (latitude, longitude) + header = ["id", "name", "city", "country", "iata", "icao", "lat", "lng", "alt", "tz", "dst", "tz_db", "type", "source"] + airports = [] + first_run = True + with open('airports.dat', encoding='utf-8') as csvf: + reader = csv.DictReader( csvf, header) + #for row in reader: + # airports.append(row) + for row in reader: + airport = row + airport_coord = float(airport['lat']), float(airport['lng']) + airport_dist = float((geodesic(plane, airport_coord).mi)) + if first_run: + closest_airport_dict = airport + closest_airport_dist = airport_dist + first_run = False + elif airport_dist < closest_airport_dist: + closest_airport_dict = airport + closest_airport_dist = airport_dist + print("Closest Airport:", closest_airport_dict['icao'], closest_airport_dict['name'], closest_airport_dist, "Miles Away") + return closest_airport_dict \ No newline at end of file diff --git a/defDiscord.py b/defDiscord.py index 2ef33ce..619f720 100644 --- a/defDiscord.py +++ b/defDiscord.py @@ -1,9 +1,6 @@ -def sendDis(message, map_file_name, conf_file): +def sendDis(message, map_file_name, config): from discord_webhook import DiscordWebhook - import configparser - config = configparser.ConfigParser() - config.read(conf_file) webhook = DiscordWebhook(url=config.get('DISCORD', 'URL'), content=message, username=config.get('DISCORD', 'USERNAME')) with open(map_file_name, "rb") as f: diff --git a/defMap.py b/defMap.py index 04490a8..172c9ee 100644 --- a/defMap.py +++ b/defMap.py @@ -1,9 +1,9 @@ -def getMap(mapLocation): +def getMap(mapLocation, icao): import requests import configparser config = configparser.ConfigParser() - config.read('config.ini') - api_key = config.get('GOOGLE', 'STATICMAPKEY') + config.read('./configs/mainconf.ini') + api_key = config.get('GOOGLE', 'API_KEY') url = "https://maps.googleapis.com/maps/api/staticmap?" center = str(mapLocation) @@ -14,6 +14,7 @@ def getMap(mapLocation): api_key + "&sensor=false") # wb mode is stand for write binary mode + file_name = icao + "_map.png" f = open('map.png', 'wb') # r.content gives content, diff --git a/defOpenSky.py b/defOpenSky.py index 0d40bd7..9b381ee 100644 --- a/defOpenSky.py +++ b/defOpenSky.py @@ -1,7 +1,7 @@ def pullOpenSky(planes): import configparser main_config = configparser.ConfigParser() - main_config.read('mainconf.ini') + main_config.read('./configs/mainconf.ini') from opensky_api import OpenSkyApi planeData = None opens_api = OpenSkyApi(username= None if main_config.get('OPENSKY', 'USERNAME').upper() == "NONE" else main_config.get('OPENSKY', 'USERNAME'), password= None if main_config.get('OPENSKY', 'PASSWORD').upper() == "NONE" else main_config.get('OPENSKY', 'PASSWORD').upper()) diff --git a/defTweet.py b/defTweet.py index 057a999..67d6df6 100644 --- a/defTweet.py +++ b/defTweet.py @@ -1,9 +1,6 @@ # Authenticate to Twitter -def tweepysetup(conf_file): - import configparser - config = configparser.ConfigParser() - config.read(conf_file) +def tweepysetup(config): import tweepy #DOCU #https://realpython.com/twitter-bot-python-tweepy/ diff --git a/planeClass.py b/planeClass.py index 2daae8f..ebfd795 100644 --- a/planeClass.py +++ b/planeClass.py @@ -38,24 +38,26 @@ class Plane: #Setup Config File import configparser self.config = configparser.ConfigParser() - self.config.read(self.conf_file) + self.config.read(("./configs/"+ self.conf_file)) main_config = configparser.ConfigParser() - main_config.read('mainconf.ini') + main_config.read('./configs/mainconf.ini') #Platform for determining OS for strftime import platform - - if self.config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): + from defAirport import getAirport + if self.config.get('MAP', 'OPTION') == "GOOGLESTATICMAP": from defMap import getMap - else: + elif self.config.get('MAP', 'OPTION') == "ADSBX": from defSS import getSS + else: + raise Exception("Map option not set correctly in this planes conf") if self.config.getboolean('DISCORD', 'ENABLE'): from defDiscord import sendDis #Setup Tweepy if self.config.getboolean('TWITTER', 'ENABLE'): from defTweet import tweepysetup - self.tweet_api = tweepysetup(self.conf_file) + self.tweet_api = tweepysetup(self.config) #Setup PushBullet if self.config.getboolean('PUSHBULLET', 'ENABLE'): from pushbullet import Pushbullet @@ -70,13 +72,14 @@ class Plane: self.latitude = None self.on_ground = None self.has_location = None - #Get States from ADSBX or OPENS Vector + #Parse OpenSky Vector self.plane_Dict = None if main_config.get('DATA', 'SOURCE') == "OPENS": self.val_error = False if ac_dict != None: + #print (Fore.YELLOW + "OpenSky Sourced Data: ", ac_dict) try: - self.plane_Dict ={'icao' : ac_dict.icao24, 'callsign' : ac_dict.callsign, 'latitude' : ac_dict.latitude, 'longitude' : ac_dict.longitude, 'on_ground' : bool(ac_dict.on_ground)} + self.plane_Dict ={'icao' : ac_dict.icao24.upper(), 'callsign' : ac_dict.callsign, 'latitude' : ac_dict.latitude, 'longitude' : ac_dict.longitude, 'on_ground' : bool(ac_dict.on_ground)} if ac_dict.geo_altitude != None: self.plane_Dict['geo_alt_ft'] = float(ac_dict.geo_altitude) * 3.281 elif self.plane_Dict['on_ground']: @@ -89,13 +92,11 @@ class Plane: else: self.plane_Dict = None - print (Fore.YELLOW) - print ("OpenSky Sourced Data: ", self.plane_Dict) - print(Style.RESET_ALL) - + #Parse ADBSX Vector elif main_config.get('DATA', 'SOURCE') == "ADSBX": self.val_error = False if ac_dict != None: + #print (Fore.YELLOW +"ADSBX Sourced Data: ", ac_dict + Style.RESET_ALL) try: self.plane_Dict = {'icao' : ac_dict['icao'], 'callsign' : ac_dict['call'], 'reg' : ac_dict['reg'], 'latitude' : float(ac_dict['lat']), 'longitude' : float(ac_dict['lon']), 'geo_alt_ft' : int(ac_dict['galt']), 'on_ground' : bool(int(ac_dict["gnd"]))} if self.plane_Dict['on_ground']: @@ -105,32 +106,32 @@ class Plane: self.val_error = True print("Got data but some data is invalid!") print(e) + if "to" in ac_dict.keys(): + self.plane_Dict['to_location'] = ac_dict["to"] + if "from" in ac_dict.keys(): + self.plane_Dict['from_location'] = ac_dict["from"] else: self.plane_Dict = None - - print (Fore.YELLOW) - print ("ADSBX Sourced Data: ", self.plane_Dict) - print(Style.RESET_ALL) - print (Fore.CYAN) - print ("ICAO:", self.icao) - print(Style.RESET_ALL) - - + print (Fore.CYAN + "ICAO:", self.icao + Style.RESET_ALL) + #Print out data, and convert to locals if self.val_error is False: if self.plane_Dict == None: self.feeding = False + print("No Data") elif self.plane_Dict != None: self.feeding = True self.__dict__.update(self.plane_Dict) - print (Fore.CYAN) - if main_config.get('DATA', 'SOURCE') == "ADSBX": - print("Registration: ", self.reg) - print ("Callsign: ", self.callsign) + if "reg" in self.plane_Dict.keys(): + print(Fore.CYAN + "Registration: ", self.reg) + if "from_location" in self.plane_Dict.keys(): + print("From: ", self.from_location) + if "to_location" in self.plane_Dict.keys(): + print("To: ", self.to_location) + print (Fore.CYAN + "Callsign: ", self.callsign) print ("On Ground: ", self.on_ground) print ("Latitude: ", self.latitude) print ("Longitude: ", self.longitude) - print ("GEO Alitude Ft: ", self.geo_alt_ft) - print(Style.RESET_ALL) + print ("GEO Alitude Ft: ", self.geo_alt_ft, Style.RESET_ALL) #Set Check for inconsistancy in data if not self.last_recheck_needed: #Recheck needed if feeding state changes @@ -146,9 +147,9 @@ class Plane: #Run a Check compares new data to last flagged(check) data if self.last_recheck_needed: if self.recheck_feeding == self.feeding: - print("Data Feeding change Consistent") + print("Data Feeding change consistent") elif self.recheck_feeding != self.feeding: - print("Data Feeding change was Inconsistent last data ignored") + print("Data Feeding change was inconsistent last data ignored") self.recheck_feeding = self.feeding self.last_recheck_needed = self.recheck_needed @@ -176,7 +177,7 @@ class Plane: self.tookoff = False #self.tookoff = bool(self.below_desired_ft and self.on_ground is False and ((self.last_feeding is False and self.feeding) or (self.last_on_ground))) - print ("Tookoff Just Now:", self.tookoff) + #print ("Tookoff Just Now:", self.tookoff) #Check if Landed @@ -193,12 +194,12 @@ class Plane: self.landed = False else: self.landed = False - #self.landed = bool(self.last_below_desired_ft and ((self.last_feeding and self.feeding is False and self.last_on_ground is False) or (self.on_ground and self.last_on_ground is False))) - print ("Landed Just Now:", self.landed) - if self.landed or self.tookoff: - print ("Trigger Type:", self.trigger_type) - + #print ("Landed Just Now:", self.landed) + if self.landed: + print ("Landed by", self.trigger_type) + if self.tookoff: + print("Tookoff by", self.trigger_type) #Lookup Location of coordinates if self.landed or self.tookoff: if self.landed and self.last_longitude != None and self.last_latitude != None: @@ -273,23 +274,28 @@ class Plane: #Set Discord Title if self.config.getboolean('DISCORD', 'ENABLE'): self.dis_title = self.icao if self.config.get('DISCORD', 'TITLE') == "icao" else self.callsign if self.config.get('DISCORD', 'TITLE') == "callsign" else self.config.get('DISCORD', 'TITLE') - + #Set Twitter Title + if self.config.getboolean('TWITTER', 'ENABLE'): + self.twitter_title = self.icao if self.config.get('TWITTER', 'TITLE') == "icao" else self.callsign if self.config.get('TWITTER', 'TITLE') == "callsign" else self.config.get('TWITTER', 'TITLE') #Takeoff Notifcation and Landed if self.tookoff: if self.invalid_Location is False: - self.tookoff_message = (self.tookoff_header + self.aera_hierarchy + ", " + self.state + ", " + self.country_code) + self.tookoff_message = (self.tookoff_header + self.aera_hierarchy + ", " + self.state + ", " + self.country_code + ". ") else: self.tookoff_message = ("Took off") print (self.tookoff_message) #Google Map or tar1090 screenshot - if self.config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): - getMap(self.aera_hierarchy + ", " + self.state + ", " + self.country_code) - else: + if self.config.get('MAP', 'OPTION') == "GOOGLESTATICMAP": + getMap((self.aera_hierarchy + ", " + self.state + ", " + self.country_code), self.icao) + elif self.config.get('MAP', 'OPTION') == "ADSBX": getSS(self.icao) + else: + raise Exception("Map option not set correctly in this planes conf") #Discord if self.config.getboolean('DISCORD', 'ENABLE'): - self.dis_message = self.dis_title + " " + self.tookoff_message - sendDis(self.dis_message, self.map_file_name, self.conf_file) + nearest = getAirport(self.latitude, self.longitude) + self.dis_message = (self.dis_title + " " + self.tookoff_message + nearest['icao'] + ", " + nearest["name"]).strip() + sendDis(self.dis_message, self.map_file_name, self.config) #PushBullet if self.config.getboolean('PUSHBULLET', 'ENABLE'): with open(self.map_file_name, "rb") as pic: @@ -298,7 +304,7 @@ class Plane: push = self.pb_channel.push_file(**map_data) #Twitter if self.config.getboolean('TWITTER', 'ENABLE'): - self.tweet_api.update_with_media(self.map_file_name, status = self.tookoff_message) + self.tweet_api.update_with_media(self.map_file_name, status = (self.twitter_title + " " + self.tookoff_message).strip()) self.takeoff_time = time.time() os.remove(self.map_file_name) @@ -308,23 +314,26 @@ class Plane: if self.takeoff_time != None: self.landed_time = time.time() - self.takeoff_time if platform.system() == "Linux": - self.landed_time_msg = time.strftime("Apx. flt. time %-H Hours : %-M Mins ", time.gmtime(self.landed_time)) + self.landed_time_msg = time.strftime("Apx. flt. time %-H Hours : %-M Mins. ", time.gmtime(self.landed_time)) elif platform.system() == "Windows": - self.landed_time_msg = time.strftime("Apx. flt. time %#H Hours : %#M Mins ", time.gmtime(self.landed_time)) + self.landed_time_msg = time.strftime("Apx. flt. time %#H Hours : %#M Mins. ", time.gmtime(self.landed_time)) if self.invalid_Location is False: self.landed_message = (self.landed_header + self.aera_hierarchy + ", " + self.state + ", " + self.country_code + ". " + self.landed_time_msg) else: self.landed_message = ("Landed", self.landed_time_msg) print (self.landed_message) #Google Map or tar1090 screenshot - if self.config.getboolean('GOOGLE', 'STATICMAP_ENABLE'): - getMap(self.aera_hierarchy + ", " + self.state + ", " + self.country_code) - else: + if self.config.get('MAP', 'OPTION') == "GOOGLESTATICMAP": + getMap((self.aera_hierarchy + ", " + self.state + ", " + self.country_code), self.icao) + elif self.config.get('MAP', 'OPTION') == "ADSBX": getSS(self.icao) + else: + raise Exception("Map option not set correctly in this planes conf") #Discord if self.config.getboolean('DISCORD', 'ENABLE'): - self.dis_message = self.dis_title + " " + self.landed_message - sendDis(self.dis_message, self.map_file_name, self.conf_file) + nearest = getAirport(self.last_latitude, self.last_longitude) + self.dis_message = (self.dis_title + " " +self.landed_message + nearest['icao'] + ", " + nearest["name"]).strip() + sendDis(self.dis_message, self.map_file_name, self.config) #PushBullet if self.config.getboolean('PUSHBULLET', 'ENABLE'): with open(self.map_file_name, "rb") as pic: @@ -333,7 +342,7 @@ class Plane: push = self.pb_channel.push_file(**map_data) #Twitter if self.config.getboolean('TWITTER', 'ENABLE'): - self.tweet_api.update_with_media(self.map_file_name, status = self.landed_message) + self.tweet_api.update_with_media(self.map_file_name, status = (self.twitter_title + " " + self.landed_message).strip()) self.takeoff_time = None self.landed_time = None self.time_since_tk = None From fc83c695dde7d060c80a90490177216e55ae9995 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sun, 25 Oct 2020 22:52:16 -0400 Subject: [PATCH 079/124] Selenium/Chromedriver wait changes --- defSS.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/defSS.py b/defSS.py index 4b2c157..a3f53ca 100644 --- a/defSS.py +++ b/defSS.py @@ -21,7 +21,8 @@ def getSS(icao): url = "https://globe.adsbexchange.com/?largeMode=2&hideButtons&hideSidebar&mapDim=0&zoom=9&icao=" + icao browser.set_page_load_timeout(80) browser.get(url) - WebDriverWait(browser, 10).until(lambda d: d.execute_script("return jQuery.active == 0")) + WebDriverWait(browser, 30).until(lambda d: d.execute_script("return jQuery.active == 0")) + time.sleep(5) file_name = icao + "_map.png" browser.save_screenshot(file_name) browser.quit() \ No newline at end of file From a434def7b3cb5beda17c70036da9f09d2ccf0b88 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Tue, 27 Oct 2020 11:09:43 -0400 Subject: [PATCH 080/124] Dynamic Sleep Status --- NotifyBotMulti.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/NotifyBotMulti.py b/NotifyBotMulti.py index 9d298db..b2c3f1c 100644 --- a/NotifyBotMulti.py +++ b/NotifyBotMulti.py @@ -15,6 +15,7 @@ import pytz main_config = configparser.ConfigParser() main_config.read('./configs/mainconf.ini') import os +import sys #Setup Plane Objects off of Plane configs planes = {} for filename in os.listdir("./configs"): @@ -56,6 +57,7 @@ while True: planeData, failed = pullOpenSky(planes) if failed == False: if planeData.states != []: + print(planeData.time) for key, obj in planes.items(): has_data = False for dataState in planeData.states: @@ -71,6 +73,13 @@ while True: elapsed_calc_time = time.time() - start_time datetime_tz = datetime.now(tz) print (Back.GREEN, Fore.BLACK, "--------", running_Count, "--------", datetime_tz.strftime("%I:%M:%S %p"), "------------------------Elapsed Time-", elapsed_calc_time, " -------------------------------------", Style.RESET_ALL) - print(Back.RED, "Sleep 30", Style.RESET_ALL) - time.sleep(30) + + + sleep_sec = 30 + for i in range(sleep_sec,0,-1): + sys.stdout.write("\r") + sys.stdout.write(Back.RED + "Sleep {:2d}".format(i) + Style.RESET_ALL) + sys.stdout.flush() + time.sleep(1) + print() From 976059af3c77671e8521112f632e062d8895571f Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Wed, 28 Oct 2020 18:51:15 -0400 Subject: [PATCH 081/124] Change output format, show last contact time, Update Twitter usage --- planeClass.py | 66 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 48 insertions(+), 18 deletions(-) diff --git a/planeClass.py b/planeClass.py index ebfd795..cb240f6 100644 --- a/planeClass.py +++ b/planeClass.py @@ -44,6 +44,8 @@ class Plane: #Platform for determining OS for strftime import platform + from datetime import datetime + from tabulate import tabulate from defAirport import getAirport if self.config.get('MAP', 'OPTION') == "GOOGLESTATICMAP": from defMap import getMap @@ -79,9 +81,9 @@ class Plane: if ac_dict != None: #print (Fore.YELLOW + "OpenSky Sourced Data: ", ac_dict) try: - self.plane_Dict ={'icao' : ac_dict.icao24.upper(), 'callsign' : ac_dict.callsign, 'latitude' : ac_dict.latitude, 'longitude' : ac_dict.longitude, 'on_ground' : bool(ac_dict.on_ground)} + self.plane_Dict ={'icao' : ac_dict.icao24.upper(), 'callsign' : ac_dict.callsign, 'latitude' : ac_dict.latitude, 'longitude' : ac_dict.longitude, 'on_ground' : bool(ac_dict.on_ground), 'last_contact' : ac_dict.last_contact} if ac_dict.geo_altitude != None: - self.plane_Dict['geo_alt_ft'] = float(ac_dict.geo_altitude) * 3.281 + self.plane_Dict['geo_alt_ft'] = round(float(ac_dict.geo_altitude) * 3.281) elif self.plane_Dict['on_ground']: self.plane_Dict['geo_alt_ft'] = 0 except ValueError as e: @@ -96,9 +98,10 @@ class Plane: elif main_config.get('DATA', 'SOURCE') == "ADSBX": self.val_error = False if ac_dict != None: - #print (Fore.YELLOW +"ADSBX Sourced Data: ", ac_dict + Style.RESET_ALL) + #print (Fore.YELLOW +"ADSBX Sourced Data: ", ac_dict, Style.RESET_ALL) try: - self.plane_Dict = {'icao' : ac_dict['icao'], 'callsign' : ac_dict['call'], 'reg' : ac_dict['reg'], 'latitude' : float(ac_dict['lat']), 'longitude' : float(ac_dict['lon']), 'geo_alt_ft' : int(ac_dict['galt']), 'on_ground' : bool(int(ac_dict["gnd"]))} + #postime is divided by 1000 to get seconds from milliseconds, from timestamp expects secs. + self.plane_Dict = {'icao' : ac_dict['icao'], 'callsign' : ac_dict['call'], 'reg' : ac_dict['reg'], 'latitude' : float(ac_dict['lat']), 'longitude' : float(ac_dict['lon']), 'geo_alt_ft' : int(ac_dict['galt']), 'on_ground' : bool(int(ac_dict["gnd"])), 'last_contact' : round(float(ac_dict["postime"])/1000)} if self.plane_Dict['on_ground']: self.plane_Dict['geo_alt_ft'] = 0 except ValueError as e: @@ -112,26 +115,45 @@ class Plane: self.plane_Dict['from_location'] = ac_dict["from"] else: self.plane_Dict = None - print (Fore.CYAN + "ICAO:", self.icao + Style.RESET_ALL) + #print (Fore.CYAN + "ICAO:", self.icao + Style.RESET_ALL) #Print out data, and convert to locals if self.val_error is False: if self.plane_Dict == None: self.feeding = False + print(tabulate([[(Fore.CYAN + "ICAO" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.icao + Style.RESET_ALL)]], [], 'fancy_grid')) print("No Data") elif self.plane_Dict != None: self.feeding = True self.__dict__.update(self.plane_Dict) - if "reg" in self.plane_Dict.keys(): - print(Fore.CYAN + "Registration: ", self.reg) - if "from_location" in self.plane_Dict.keys(): - print("From: ", self.from_location) - if "to_location" in self.plane_Dict.keys(): - print("To: ", self.to_location) - print (Fore.CYAN + "Callsign: ", self.callsign) - print ("On Ground: ", self.on_ground) - print ("Latitude: ", self.latitude) - print ("Longitude: ", self.longitude) - print ("GEO Alitude Ft: ", self.geo_alt_ft, Style.RESET_ALL) + #if "reg" in self.plane_Dict.keys(): + #print(Fore.CYAN + "Registration: ", self.reg) + #if "from_location" in self.plane_Dict.keys(): + #print("From: ", self.from_location) + #if "to_location" in self.plane_Dict.keys(): + #print("To: ", self.to_location) + if "last_contact" in self.plane_Dict.keys(): + last_contact = datetime.fromtimestamp(self.last_contact) + time_since = datetime.now() - last_contact + #print(Fore.CYAN + "Time Since Contact:", time_since) + #print (Fore.CYAN + "Callsign: ", self.callsign) + #print ("On Ground: ", self.on_ground) + #print ("Latitude: ", self.latitude) + #print ("Longitude: ", self.longitude) + #print ("GEO Alitude Ft: ", self.geo_alt_ft, Style.RESET_ALL) + output = [ + [(Fore.CYAN + "ICAO" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.icao + Style.RESET_ALL)], + [(Fore.CYAN + "Callsign" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.callsign + Style.RESET_ALL)], + [(Fore.CYAN + "Reg" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.reg + Style.RESET_ALL)] if "reg" in self.plane_Dict.keys() else None, + [(Fore.CYAN + "From" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.from_location + Style.RESET_ALL)] if "from_location" in self.plane_Dict.keys() else None, + [(Fore.CYAN + "To" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.to_location + Style.RESET_ALL)] if "to_location" in self.plane_Dict.keys() else None, + [(Fore.CYAN + "Latitude" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(self.latitude) + Style.RESET_ALL)], + [(Fore.CYAN + "Longitude" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(self.longitude) + Style.RESET_ALL)], + [(Fore.CYAN + "Last Contact" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(time_since) + Style.RESET_ALL)], + [(Fore.CYAN + "On Ground" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(self.on_ground) + Style.RESET_ALL)], + [(Fore.CYAN + "GEO Alitude Ft" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(self.geo_alt_ft) + Style.RESET_ALL)] + ] + output = list(filter(None, output)) + print(tabulate(output, [], 'fancy_grid')) #Set Check for inconsistancy in data if not self.last_recheck_needed: #Recheck needed if feeding state changes @@ -304,7 +326,11 @@ class Plane: push = self.pb_channel.push_file(**map_data) #Twitter if self.config.getboolean('TWITTER', 'ENABLE'): - self.tweet_api.update_with_media(self.map_file_name, status = (self.twitter_title + " " + self.tookoff_message).strip()) + twitter_media_map_obj = self.tweet_api.media_upload(self.map_file_name) + alt_text = "Call: " + self.callsign + " On Ground: " + str(self.on_ground) + " Alt: " + str(self.geo_alt_ft) + " Last Contact: " + str(time_since) + " Trigger: " + self.trigger_type + self.tweet_api.create_media_metadata(media_id= twitter_media_map_obj.media_id, alt_text= alt_text) + self.tweet_api.update_status(status = ((self.twitter_title + " " + self.tookoff_message).strip()), media_ids=[twitter_media_map_obj.media_id]) + #self.tweet_api.update_with_media(self.map_file_name, status = (self.twitter_title + " " + self.tookoff_message).strip()) self.takeoff_time = time.time() os.remove(self.map_file_name) @@ -342,7 +368,11 @@ class Plane: push = self.pb_channel.push_file(**map_data) #Twitter if self.config.getboolean('TWITTER', 'ENABLE'): - self.tweet_api.update_with_media(self.map_file_name, status = (self.twitter_title + " " + self.landed_message).strip()) + twitter_media_map_obj = self.tweet_api.media_upload(self.map_file_name) + alt_text = "Call: " + self.callsign + " On Ground: " + str(self.on_ground) + " Alt: " + str(self.geo_alt_ft) + " Last Contact: " + str(time_since) + " Trigger: " + self.trigger_type + self.tweet_api.create_media_metadata(media_id= twitter_media_map_obj.media_id, alt_text= alt_text) + self.tweet_api.update_status(status = ((self.twitter_title + " " + self.landed_message).strip()), media_ids=[twitter_media_map_obj.media_id]) + #self.tweet_api.update_with_media(self.map_file_name, status = (self.twitter_title + " " + self.landed_message).strip()) self.takeoff_time = None self.landed_time = None self.time_since_tk = None From 984acd5755271783fd7f6c8aa788f7e6a8635d32 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Wed, 28 Oct 2020 18:52:06 -0400 Subject: [PATCH 082/124] Change to dynamic sleep --- NotifyBotMulti.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/NotifyBotMulti.py b/NotifyBotMulti.py index b2c3f1c..2e4fa21 100644 --- a/NotifyBotMulti.py +++ b/NotifyBotMulti.py @@ -57,7 +57,7 @@ while True: planeData, failed = pullOpenSky(planes) if failed == False: if planeData.states != []: - print(planeData.time) + # print(planeData.time) for key, obj in planes.items(): has_data = False for dataState in planeData.states: @@ -75,11 +75,14 @@ while True: print (Back.GREEN, Fore.BLACK, "--------", running_Count, "--------", datetime_tz.strftime("%I:%M:%S %p"), "------------------------Elapsed Time-", elapsed_calc_time, " -------------------------------------", Style.RESET_ALL) - sleep_sec = 30 + sleep_sec = 20 for i in range(sleep_sec,0,-1): + if i < 10: + i = " " + str(i) sys.stdout.write("\r") - sys.stdout.write(Back.RED + "Sleep {:2d}".format(i) + Style.RESET_ALL) + sys.stdout.write(Back.RED + "Sleep {00000000}".format(i) + Style.RESET_ALL) sys.stdout.flush() time.sleep(1) + sys.stdout.write(Back.RED + ('\x1b[1K\r' +"Slept for " +str(sleep_sec)) + Style.RESET_ALL) print() From d8d6df7b33f75c8b60da527b6a2be2f0762e6ba3 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Tue, 3 Nov 2020 16:37:20 -0500 Subject: [PATCH 083/124] Fix error message not defined --- defADSBX.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/defADSBX.py b/defADSBX.py index 28184ad..23efb68 100644 --- a/defADSBX.py +++ b/defADSBX.py @@ -21,7 +21,7 @@ def pullADSBX(planes): try: response = requests.get(url, headers = headers) response.raise_for_status() - except (requests.exceptions.HTTPError, requests.exceptions.ConnectionError, requests.exceptions.Timeout, requests.exceptions.RequestException): + except (requests.exceptions.HTTPError, requests.exceptions.ConnectionError, requests.exceptions.Timeout, requests.exceptions.RequestException) as error_message: print("Basic Connection Error") print(error_message) failed = True @@ -37,7 +37,7 @@ def pullADSBX(planes): failed = True data = None else: - if response.status_code == 200: + if "response" in locals() and response.status_code == 200: try: data = json.loads(response.text) except (json.decoder.JSONDecodeError, ValueError) as error_message: From 13bc6dcc910fc4c51c9f06a355fede9a660c3489 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Tue, 3 Nov 2020 16:38:12 -0500 Subject: [PATCH 084/124] Changes to last contact output --- planeClass.py | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/planeClass.py b/planeClass.py index cb240f6..a33e50b 100644 --- a/planeClass.py +++ b/planeClass.py @@ -20,6 +20,7 @@ class Plane: self.last_longitude = None self.recheck_needed = None self.last_recheck_needed = None + self.last_contact = None def getICAO(self): return self.icao def run(self, ac_dict): @@ -118,12 +119,25 @@ class Plane: #print (Fore.CYAN + "ICAO:", self.icao + Style.RESET_ALL) #Print out data, and convert to locals if self.val_error is False: + if self.plane_Dict != None: + self.last_contact = self.plane_Dict["last_contact"] + if self.last_contact != None: + last_contact_dt = datetime.fromtimestamp(self.last_contact) + time_since_contact = datetime.now() - last_contact_dt + else: + time_since_contact = None if self.plane_Dict == None: self.feeding = False - print(tabulate([[(Fore.CYAN + "ICAO" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.icao + Style.RESET_ALL)]], [], 'fancy_grid')) + output = [ + [(Fore.CYAN + "ICAO" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.icao + Style.RESET_ALL)], + [(Fore.CYAN + "Last Contact" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(time_since_contact) + Style.RESET_ALL)] if time_since_contact != None else None + ] + output = list(filter(None, output)) + print(tabulate(output, [], 'fancy_grid')) print("No Data") elif self.plane_Dict != None: self.feeding = True + #Update dictionary to Plane object direct variables self.__dict__.update(self.plane_Dict) #if "reg" in self.plane_Dict.keys(): #print(Fore.CYAN + "Registration: ", self.reg) @@ -131,9 +145,7 @@ class Plane: #print("From: ", self.from_location) #if "to_location" in self.plane_Dict.keys(): #print("To: ", self.to_location) - if "last_contact" in self.plane_Dict.keys(): - last_contact = datetime.fromtimestamp(self.last_contact) - time_since = datetime.now() - last_contact + #print(Fore.CYAN + "Time Since Contact:", time_since) #print (Fore.CYAN + "Callsign: ", self.callsign) #print ("On Ground: ", self.on_ground) @@ -148,7 +160,7 @@ class Plane: [(Fore.CYAN + "To" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.to_location + Style.RESET_ALL)] if "to_location" in self.plane_Dict.keys() else None, [(Fore.CYAN + "Latitude" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(self.latitude) + Style.RESET_ALL)], [(Fore.CYAN + "Longitude" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(self.longitude) + Style.RESET_ALL)], - [(Fore.CYAN + "Last Contact" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(time_since) + Style.RESET_ALL)], + [(Fore.CYAN + "Last Contact" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(time_since_contact) + Style.RESET_ALL)], [(Fore.CYAN + "On Ground" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(self.on_ground) + Style.RESET_ALL)], [(Fore.CYAN + "GEO Alitude Ft" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(self.geo_alt_ft) + Style.RESET_ALL)] ] @@ -327,7 +339,7 @@ class Plane: #Twitter if self.config.getboolean('TWITTER', 'ENABLE'): twitter_media_map_obj = self.tweet_api.media_upload(self.map_file_name) - alt_text = "Call: " + self.callsign + " On Ground: " + str(self.on_ground) + " Alt: " + str(self.geo_alt_ft) + " Last Contact: " + str(time_since) + " Trigger: " + self.trigger_type + alt_text = "Call: " + self.callsign + " On Ground: " + str(self.on_ground) + " Alt: " + str(self.geo_alt_ft) + " Last Contact: " + str(time_since_contact) + " Trigger: " + self.trigger_type self.tweet_api.create_media_metadata(media_id= twitter_media_map_obj.media_id, alt_text= alt_text) self.tweet_api.update_status(status = ((self.twitter_title + " " + self.tookoff_message).strip()), media_ids=[twitter_media_map_obj.media_id]) #self.tweet_api.update_with_media(self.map_file_name, status = (self.twitter_title + " " + self.tookoff_message).strip()) @@ -369,7 +381,7 @@ class Plane: #Twitter if self.config.getboolean('TWITTER', 'ENABLE'): twitter_media_map_obj = self.tweet_api.media_upload(self.map_file_name) - alt_text = "Call: " + self.callsign + " On Ground: " + str(self.on_ground) + " Alt: " + str(self.geo_alt_ft) + " Last Contact: " + str(time_since) + " Trigger: " + self.trigger_type + alt_text = "Call: " + self.callsign + " On Ground: " + str(self.on_ground) + " Alt: " + str(self.geo_alt_ft) + " Last Contact: " + str(time_since_contact) + " Trigger: " + self.trigger_type self.tweet_api.create_media_metadata(media_id= twitter_media_map_obj.media_id, alt_text= alt_text) self.tweet_api.update_status(status = ((self.twitter_title + " " + self.landed_message).strip()), media_ids=[twitter_media_map_obj.media_id]) #self.tweet_api.update_with_media(self.map_file_name, status = (self.twitter_title + " " + self.landed_message).strip()) @@ -377,6 +389,7 @@ class Plane: self.landed_time = None self.time_since_tk = None os.remove(self.map_file_name) + self.last_contact = None #Set Variables to compare to next check self.last_feeding = self.feeding From 2ba5a2e931d4192fc687a3e64177a82b21269e1d Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sun, 8 Nov 2020 12:22:31 -0500 Subject: [PATCH 085/124] Handle assisgment errors when bad data --- planeClass.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/planeClass.py b/planeClass.py index a33e50b..4887757 100644 --- a/planeClass.py +++ b/planeClass.py @@ -105,15 +105,15 @@ class Plane: self.plane_Dict = {'icao' : ac_dict['icao'], 'callsign' : ac_dict['call'], 'reg' : ac_dict['reg'], 'latitude' : float(ac_dict['lat']), 'longitude' : float(ac_dict['lon']), 'geo_alt_ft' : int(ac_dict['galt']), 'on_ground' : bool(int(ac_dict["gnd"])), 'last_contact' : round(float(ac_dict["postime"])/1000)} if self.plane_Dict['on_ground']: self.plane_Dict['geo_alt_ft'] = 0 + if "to" in ac_dict.keys(): + self.plane_Dict['to_location'] = ac_dict["to"] + if "from" in ac_dict.keys(): + self.plane_Dict['from_location'] = ac_dict["from"] except ValueError as e: self.plane_Dict = None self.val_error = True print("Got data but some data is invalid!") print(e) - if "to" in ac_dict.keys(): - self.plane_Dict['to_location'] = ac_dict["to"] - if "from" in ac_dict.keys(): - self.plane_Dict['from_location'] = ac_dict["from"] else: self.plane_Dict = None #print (Fore.CYAN + "ICAO:", self.icao + Style.RESET_ALL) From 09a7ce50df121aff760c4cafac4a294abe652b9b Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sun, 8 Nov 2020 12:23:51 -0500 Subject: [PATCH 086/124] Fixes response not set error, only print status if status --- defADSBX.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/defADSBX.py b/defADSBX.py index 23efb68..59ab90d 100644 --- a/defADSBX.py +++ b/defADSBX.py @@ -55,8 +55,8 @@ def pullADSBX(planes): else: failed = True data = None - - print ("HTTP Status Code:", response.status_code) + if "response" in locals(): + print ("HTTP Status Code:", response.status_code) if failed is False: data_ctime = float(data['ctime']) / 1000.0 print("UTC of Data:",datetime.utcfromtimestamp(data_ctime)) From 7852e5a7a16eb439c8a56367f210e977b09523ec Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Mon, 9 Nov 2020 13:23:09 -0500 Subject: [PATCH 087/124] Remove extra dict, cleanup parsing --- planeClass.py | 53 +++++++++++++++------------------------------------ 1 file changed, 15 insertions(+), 38 deletions(-) diff --git a/planeClass.py b/planeClass.py index 4887757..eb58e5d 100644 --- a/planeClass.py +++ b/planeClass.py @@ -76,24 +76,20 @@ class Plane: self.on_ground = None self.has_location = None #Parse OpenSky Vector - self.plane_Dict = None if main_config.get('DATA', 'SOURCE') == "OPENS": self.val_error = False if ac_dict != None: #print (Fore.YELLOW + "OpenSky Sourced Data: ", ac_dict) try: - self.plane_Dict ={'icao' : ac_dict.icao24.upper(), 'callsign' : ac_dict.callsign, 'latitude' : ac_dict.latitude, 'longitude' : ac_dict.longitude, 'on_ground' : bool(ac_dict.on_ground), 'last_contact' : ac_dict.last_contact} + self.__dict__.update({'icao' : ac_dict.icao24.upper(), 'callsign' : ac_dict.callsign, 'latitude' : ac_dict.latitude, 'longitude' : ac_dict.longitude, 'on_ground' : bool(ac_dict.on_ground), 'last_contact' : ac_dict.last_contact}) if ac_dict.geo_altitude != None: - self.plane_Dict['geo_alt_ft'] = round(float(ac_dict.geo_altitude) * 3.281) - elif self.plane_Dict['on_ground']: - self.plane_Dict['geo_alt_ft'] = 0 + self.geo_alt_ft = round(float(ac_dict.geo_altitude) * 3.281) + elif self.on_ground: + self.geo_alt_ft = 0 except ValueError as e: - self.plane_Dict = None self.val_error = True print("Got data but some data is invalid!") print(e) - else: - self.plane_Dict = None #Parse ADBSX Vector elif main_config.get('DATA', 'SOURCE') == "ADSBX": @@ -102,31 +98,27 @@ class Plane: #print (Fore.YELLOW +"ADSBX Sourced Data: ", ac_dict, Style.RESET_ALL) try: #postime is divided by 1000 to get seconds from milliseconds, from timestamp expects secs. - self.plane_Dict = {'icao' : ac_dict['icao'], 'callsign' : ac_dict['call'], 'reg' : ac_dict['reg'], 'latitude' : float(ac_dict['lat']), 'longitude' : float(ac_dict['lon']), 'geo_alt_ft' : int(ac_dict['galt']), 'on_ground' : bool(int(ac_dict["gnd"])), 'last_contact' : round(float(ac_dict["postime"])/1000)} - if self.plane_Dict['on_ground']: - self.plane_Dict['geo_alt_ft'] = 0 + self.__dict__.update({'icao' : ac_dict['icao'], 'callsign' : ac_dict['call'], 'reg' : ac_dict['reg'], 'latitude' : float(ac_dict['lat']), 'longitude' : float(ac_dict['lon']), 'geo_alt_ft' : int(ac_dict['galt']), 'on_ground' : bool(int(ac_dict["gnd"])), 'last_contact' : round(float(ac_dict["postime"])/1000)}) + if self.on_ground: + self.geo_alt_ft = 0 if "to" in ac_dict.keys(): - self.plane_Dict['to_location'] = ac_dict["to"] + self.to_location = ac_dict["to"] if "from" in ac_dict.keys(): - self.plane_Dict['from_location'] = ac_dict["from"] + self.from_location = ac_dict["from"] except ValueError as e: - self.plane_Dict = None self.val_error = True print("Got data but some data is invalid!") print(e) - else: - self.plane_Dict = None + #print (Fore.CYAN + "ICAO:", self.icao + Style.RESET_ALL) #Print out data, and convert to locals if self.val_error is False: - if self.plane_Dict != None: - self.last_contact = self.plane_Dict["last_contact"] if self.last_contact != None: last_contact_dt = datetime.fromtimestamp(self.last_contact) time_since_contact = datetime.now() - last_contact_dt else: time_since_contact = None - if self.plane_Dict == None: + if ac_dict == None: self.feeding = False output = [ [(Fore.CYAN + "ICAO" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.icao + Style.RESET_ALL)], @@ -135,29 +127,14 @@ class Plane: output = list(filter(None, output)) print(tabulate(output, [], 'fancy_grid')) print("No Data") - elif self.plane_Dict != None: + elif ac_dict != None: self.feeding = True - #Update dictionary to Plane object direct variables - self.__dict__.update(self.plane_Dict) - #if "reg" in self.plane_Dict.keys(): - #print(Fore.CYAN + "Registration: ", self.reg) - #if "from_location" in self.plane_Dict.keys(): - #print("From: ", self.from_location) - #if "to_location" in self.plane_Dict.keys(): - #print("To: ", self.to_location) - - #print(Fore.CYAN + "Time Since Contact:", time_since) - #print (Fore.CYAN + "Callsign: ", self.callsign) - #print ("On Ground: ", self.on_ground) - #print ("Latitude: ", self.latitude) - #print ("Longitude: ", self.longitude) - #print ("GEO Alitude Ft: ", self.geo_alt_ft, Style.RESET_ALL) output = [ [(Fore.CYAN + "ICAO" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.icao + Style.RESET_ALL)], [(Fore.CYAN + "Callsign" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.callsign + Style.RESET_ALL)], - [(Fore.CYAN + "Reg" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.reg + Style.RESET_ALL)] if "reg" in self.plane_Dict.keys() else None, - [(Fore.CYAN + "From" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.from_location + Style.RESET_ALL)] if "from_location" in self.plane_Dict.keys() else None, - [(Fore.CYAN + "To" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.to_location + Style.RESET_ALL)] if "to_location" in self.plane_Dict.keys() else None, + [(Fore.CYAN + "Reg" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.reg + Style.RESET_ALL)] if "reg" in self.__dict__ else None, + [(Fore.CYAN + "From" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.from_location + Style.RESET_ALL)] if "from_location" in self.__dict__ else None, + [(Fore.CYAN + "To" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.to_location + Style.RESET_ALL)] if "to_location" in self.__dict__ else None, [(Fore.CYAN + "Latitude" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(self.latitude) + Style.RESET_ALL)], [(Fore.CYAN + "Longitude" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(self.longitude) + Style.RESET_ALL)], [(Fore.CYAN + "Last Contact" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(time_since_contact) + Style.RESET_ALL)], From 9faf2201faefb8c250a30f93522e516fc1fc1e5b Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Mon, 9 Nov 2020 13:23:24 -0500 Subject: [PATCH 088/124] Remove unused imports --- NotifyBotMulti.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/NotifyBotMulti.py b/NotifyBotMulti.py index 2e4fa21..620b651 100644 --- a/NotifyBotMulti.py +++ b/NotifyBotMulti.py @@ -1,6 +1,4 @@ -import requests import configparser -import json import time from defADSBX import pullADSBX from defOpenSky import pullOpenSky From 0b9254b0a83711280d02516c026514f64e99c8b1 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Mon, 9 Nov 2020 13:38:08 -0500 Subject: [PATCH 089/124] Update docs, tabulate, airports.dat, new config dir --- README.md | 28 ++++++++++++++++++++-------- Refrences.md | 8 ++++++++ 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index f93e5b9..ab27892 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,8 @@ Their are two branches of this program single is the original only supports one I made this program so I could track Elon Musk's Jet and share with others of his whereabouts on Twitter. [![Twitter Follow](https://img.shields.io/twitter/follow/ElonJet.svg?style=social)](https://twitter.com/ElonJet) I have now Expanded and run multiple accounts for multiple planes, a list of the accounts here [plane-notify Twitter List](https://twitter.com/i/lists/1307414615316467715) ### Contributing - Im open to any help or suggestions, I realize theirs much better ways im sure to do alot of my methods, im only a noob. I'll accept pull requests. If you'd like to discuss join https://JacksTech.net/Discord + + Im open to any help or suggestions, I realize theirs much better ways im sure to do alot of my methods, im only a noob. I'll accept pull requests. If you'd like to discuss join ### [ How It Works](PseudoCode.md) @@ -42,6 +43,7 @@ apt install python3-pip pip install colorama pip install geopy pip3 install ptyz +pip3 install tabulate ``` ### Install Selenium / ChromeDriver or setup Google Static Maps @@ -50,15 +52,21 @@ Selenium/ChromeDriver is used to take a screenshot of the plane on globe.adsbexc #### 1. Chromium - sudo apt-get install chromium +``` +sudo apt-get install chromium +``` #### 2. ChromeDriver - sudo apt-get install chromium-driver +``` +sudo apt-get install chromium-driver +``` #### 3. Selenium - pip install -U selenium +``` +pip install -U selenium +``` ### Install Pushbullet, Tweepy, and Discord optional output methods already implemented in code, only install the ones you want to use. @@ -84,13 +92,18 @@ git clone -b multi --single-branch https://github.com/Jxck-S/plane-notify.git cd plane-notify ``` -### Configure main config file with keys and URLs (mainconf.ini) +### Download the latest airports.dat from OpenFlights for nearest airport lookup - https://openflights.org/data.html +```bash +wget https://raw.githubusercontent.com/jpatokal/openflights/master/data/airports.dat +``` + +### Configure main config file with keys and URLs (mainconf.ini) in configs directory - edit them with nano or vi on the running machine or on your pc and transfer the config to where you will be running the bot ### Configure individual planes -#### an example file is given (plane1.ini) Plane config files should be in the programs directory, the program looks for any file with a .ini exstenstion. +#### an example file is given (plane1.ini) Plane config files should be in the configs directory, the program looks for any file in that folder with a .ini exstenstion. ### Enter and create new Screen Session @@ -106,8 +119,7 @@ python3 NotifyBotMulti.py ### TODO -- Possibly implement airport name, done by closest airport +- Clostest airport name(WORKING), but outputs to Discord currently only atm, will be adding it to the map image with PIL, Would add as text output but the closest airport is not always correct - General Cleanup -- Move all configs to own folder ### [ More Refrences / Documentation](Refrences.md) diff --git a/Refrences.md b/Refrences.md index 0083b56..c2e8c97 100644 --- a/Refrences.md +++ b/Refrences.md @@ -44,3 +44,11 @@ - - - + +## Tabulate + +- + +## Nearest Airport / Airports.dat / OpenFlights + +- From 84933e15f1f53ac681578a5c28c8dac669bc1936 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Tue, 10 Nov 2020 01:19:33 +0000 Subject: [PATCH 090/124] Auto download airports.dat --- NotifyBotMulti.py | 5 ++-- defAirport.py | 71 ++++++++++++++++++++++++++++++----------------- planeClass.py | 6 ++-- 3 files changed, 52 insertions(+), 30 deletions(-) diff --git a/NotifyBotMulti.py b/NotifyBotMulti.py index 620b651..3c29a3a 100644 --- a/NotifyBotMulti.py +++ b/NotifyBotMulti.py @@ -9,7 +9,9 @@ if platform.system() == "Windows": init(convert=True) from planeClass import Plane from datetime import datetime +from defAirport import DownloadAirports import pytz +DownloadAirports() main_config = configparser.ConfigParser() main_config.read('./configs/mainconf.ini') import os @@ -82,5 +84,4 @@ while True: sys.stdout.flush() time.sleep(1) sys.stdout.write(Back.RED + ('\x1b[1K\r' +"Slept for " +str(sleep_sec)) + Style.RESET_ALL) - print() - + print() \ No newline at end of file diff --git a/defAirport.py b/defAirport.py index 5970e8c..97d4a0f 100644 --- a/defAirport.py +++ b/defAirport.py @@ -1,27 +1,48 @@ #https://www.geeksforgeeks.org/python-calculate-distance-between-two-places-using-geopy/ #https://openflights.org/data.html -def getAirport(latitude, longitude): - import json - import csv - from geopy.distance import geodesic - plane = (latitude, longitude) - header = ["id", "name", "city", "country", "iata", "icao", "lat", "lng", "alt", "tz", "dst", "tz_db", "type", "source"] - airports = [] - first_run = True - with open('airports.dat', encoding='utf-8') as csvf: - reader = csv.DictReader( csvf, header) - #for row in reader: - # airports.append(row) - for row in reader: - airport = row - airport_coord = float(airport['lat']), float(airport['lng']) - airport_dist = float((geodesic(plane, airport_coord).mi)) - if first_run: - closest_airport_dict = airport - closest_airport_dist = airport_dist - first_run = False - elif airport_dist < closest_airport_dist: - closest_airport_dict = airport - closest_airport_dist = airport_dist - print("Closest Airport:", closest_airport_dict['icao'], closest_airport_dict['name'], closest_airport_dist, "Miles Away") - return closest_airport_dict \ No newline at end of file +def DownloadAirports(): + import os + if not os.path.isfile('airports.dat'): + print("No airports.dat file, downloading now") + try: + import requests + url = 'https://raw.githubusercontent.com/jpatokal/openflights/master/data/airports.dat' + airports = requests.get(url) + + open('airports.dat', 'wb').write(airports.content) + except: + raise("Error getting airports.dat or storing") + else: + #Writes current date to airports.dat to show when it was aqquired + import datetime + date = datetime.datetime.now() + with open('airports.dat', 'a') as airports: + airports.write("#" + str(date)) + print("Successfully got airports.dat") + elif os.path.isfile('airports.dat'): + print("Already Have airports.dat, continuing") +def getClosestAirport(latitude, longitude): + import json + import csv + from geopy.distance import geodesic + plane = (latitude, longitude) + header = ["id", "name", "city", "country", "iata", "icao", "lat", "lng", "alt", "tz", "dst", "tz_db", "type", "source"] + airports = [] + first_run = True + with open('airports.dat', encoding='utf-8') as csvf: + reader = csv.DictReader(filter(lambda row: row[0]!='#', csvf), header) + #for row in reader: + # airports.append(row) + for row in reader: + airport = row + airport_coord = float(airport['lat']), float(airport['lng']) + airport_dist = float((geodesic(plane, airport_coord).mi)) + if first_run: + closest_airport_dict = airport + closest_airport_dist = airport_dist + first_run = False + elif airport_dist < closest_airport_dist: + closest_airport_dict = airport + closest_airport_dist = airport_dist + print("Closest Airport:", closest_airport_dict['icao'], closest_airport_dict['name'], closest_airport_dist, "Miles Away") + return closest_airport_dict \ No newline at end of file diff --git a/planeClass.py b/planeClass.py index eb58e5d..7db254c 100644 --- a/planeClass.py +++ b/planeClass.py @@ -47,7 +47,7 @@ class Plane: import platform from datetime import datetime from tabulate import tabulate - from defAirport import getAirport + from defAirport import getClosestAirport if self.config.get('MAP', 'OPTION') == "GOOGLESTATICMAP": from defMap import getMap elif self.config.get('MAP', 'OPTION') == "ADSBX": @@ -304,7 +304,7 @@ class Plane: raise Exception("Map option not set correctly in this planes conf") #Discord if self.config.getboolean('DISCORD', 'ENABLE'): - nearest = getAirport(self.latitude, self.longitude) + nearest = getClosestAirport(self.latitude, self.longitude) self.dis_message = (self.dis_title + " " + self.tookoff_message + nearest['icao'] + ", " + nearest["name"]).strip() sendDis(self.dis_message, self.map_file_name, self.config) #PushBullet @@ -346,7 +346,7 @@ class Plane: raise Exception("Map option not set correctly in this planes conf") #Discord if self.config.getboolean('DISCORD', 'ENABLE'): - nearest = getAirport(self.last_latitude, self.last_longitude) + nearest = getClosestAirport(self.last_latitude, self.last_longitude) self.dis_message = (self.dis_title + " " +self.landed_message + nearest['icao'] + ", " + nearest["name"]).strip() sendDis(self.dis_message, self.map_file_name, self.config) #PushBullet From 03d4fb1b95640bfcc267843c6593f932bfbeb301 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Tue, 10 Nov 2020 02:16:34 +0000 Subject: [PATCH 091/124] rename Airport lookup, ignore comments --- defAirport.py | 50 +++++++++++++++++++++++++------------------------- planeClass.py | 6 +++--- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/defAirport.py b/defAirport.py index 5970e8c..e84c498 100644 --- a/defAirport.py +++ b/defAirport.py @@ -1,27 +1,27 @@ #https://www.geeksforgeeks.org/python-calculate-distance-between-two-places-using-geopy/ #https://openflights.org/data.html -def getAirport(latitude, longitude): - import json - import csv - from geopy.distance import geodesic - plane = (latitude, longitude) - header = ["id", "name", "city", "country", "iata", "icao", "lat", "lng", "alt", "tz", "dst", "tz_db", "type", "source"] - airports = [] - first_run = True - with open('airports.dat', encoding='utf-8') as csvf: - reader = csv.DictReader( csvf, header) - #for row in reader: - # airports.append(row) - for row in reader: - airport = row - airport_coord = float(airport['lat']), float(airport['lng']) - airport_dist = float((geodesic(plane, airport_coord).mi)) - if first_run: - closest_airport_dict = airport - closest_airport_dist = airport_dist - first_run = False - elif airport_dist < closest_airport_dist: - closest_airport_dict = airport - closest_airport_dist = airport_dist - print("Closest Airport:", closest_airport_dict['icao'], closest_airport_dict['name'], closest_airport_dist, "Miles Away") - return closest_airport_dict \ No newline at end of file +def getClosestAirport(latitude, longitude): + import json + import csv + from geopy.distance import geodesic + plane = (latitude, longitude) + header = ["id", "name", "city", "country", "iata", "icao", "lat", "lng", "alt", "tz", "dst", "tz_db", "type", "source"] + airports = [] + first_run = True + with open('airports.dat', encoding='utf-8') as csvf: + reader = csv.DictReader(filter(lambda row: row[0]!='#', csvf), header) + #for row in reader: + # airports.append(row) + for row in reader: + airport = row + airport_coord = float(airport['lat']), float(airport['lng']) + airport_dist = float((geodesic(plane, airport_coord).mi)) + if first_run: + closest_airport_dict = airport + closest_airport_dist = airport_dist + first_run = False + elif airport_dist < closest_airport_dist: + closest_airport_dict = airport + closest_airport_dist = airport_dist + print("Closest Airport:", closest_airport_dict['icao'], closest_airport_dict['name'], closest_airport_dist, "Miles Away") + return closest_airport_dict \ No newline at end of file diff --git a/planeClass.py b/planeClass.py index eb58e5d..7db254c 100644 --- a/planeClass.py +++ b/planeClass.py @@ -47,7 +47,7 @@ class Plane: import platform from datetime import datetime from tabulate import tabulate - from defAirport import getAirport + from defAirport import getClosestAirport if self.config.get('MAP', 'OPTION') == "GOOGLESTATICMAP": from defMap import getMap elif self.config.get('MAP', 'OPTION') == "ADSBX": @@ -304,7 +304,7 @@ class Plane: raise Exception("Map option not set correctly in this planes conf") #Discord if self.config.getboolean('DISCORD', 'ENABLE'): - nearest = getAirport(self.latitude, self.longitude) + nearest = getClosestAirport(self.latitude, self.longitude) self.dis_message = (self.dis_title + " " + self.tookoff_message + nearest['icao'] + ", " + nearest["name"]).strip() sendDis(self.dis_message, self.map_file_name, self.config) #PushBullet @@ -346,7 +346,7 @@ class Plane: raise Exception("Map option not set correctly in this planes conf") #Discord if self.config.getboolean('DISCORD', 'ENABLE'): - nearest = getAirport(self.last_latitude, self.last_longitude) + nearest = getClosestAirport(self.last_latitude, self.last_longitude) self.dis_message = (self.dis_title + " " +self.landed_message + nearest['icao'] + ", " + nearest["name"]).strip() sendDis(self.dis_message, self.map_file_name, self.config) #PushBullet From 2cfaa7d161fe4c56e5ebef5f2e7a23af5e34af48 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Tue, 10 Nov 2020 02:17:07 +0000 Subject: [PATCH 092/124] Auto download airports.dat --- NotifyBotMulti.py | 5 +++-- defAirport.py | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/NotifyBotMulti.py b/NotifyBotMulti.py index 620b651..3c29a3a 100644 --- a/NotifyBotMulti.py +++ b/NotifyBotMulti.py @@ -9,7 +9,9 @@ if platform.system() == "Windows": init(convert=True) from planeClass import Plane from datetime import datetime +from defAirport import DownloadAirports import pytz +DownloadAirports() main_config = configparser.ConfigParser() main_config.read('./configs/mainconf.ini') import os @@ -82,5 +84,4 @@ while True: sys.stdout.flush() time.sleep(1) sys.stdout.write(Back.RED + ('\x1b[1K\r' +"Slept for " +str(sleep_sec)) + Style.RESET_ALL) - print() - + print() \ No newline at end of file diff --git a/defAirport.py b/defAirport.py index e84c498..97d4a0f 100644 --- a/defAirport.py +++ b/defAirport.py @@ -1,5 +1,26 @@ #https://www.geeksforgeeks.org/python-calculate-distance-between-two-places-using-geopy/ #https://openflights.org/data.html +def DownloadAirports(): + import os + if not os.path.isfile('airports.dat'): + print("No airports.dat file, downloading now") + try: + import requests + url = 'https://raw.githubusercontent.com/jpatokal/openflights/master/data/airports.dat' + airports = requests.get(url) + + open('airports.dat', 'wb').write(airports.content) + except: + raise("Error getting airports.dat or storing") + else: + #Writes current date to airports.dat to show when it was aqquired + import datetime + date = datetime.datetime.now() + with open('airports.dat', 'a') as airports: + airports.write("#" + str(date)) + print("Successfully got airports.dat") + elif os.path.isfile('airports.dat'): + print("Already Have airports.dat, continuing") def getClosestAirport(latitude, longitude): import json import csv From 452a688e0b014a04176e8584a604155b13f47851 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Thu, 12 Nov 2020 03:41:52 +0000 Subject: [PATCH 093/124] Add gitignore --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..59565f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.vscode/settings.json +pythonenv3.8/ +Roboto-Regular.ttf +airports.dat From 47864b7f7925222131fb0c4cdbf1e88cfc42ef23 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Thu, 12 Nov 2020 03:58:27 +0000 Subject: [PATCH 094/124] Nearest Airport IMG, coordinates use fix -Append airport to map -Import pull data modules only when needed -Move when nearest airport is calculated -Fix use of incorrect coordinates for location lookup and nearest airport #216 --- AppendAirport.py | 67 +++++++++++++++++++++++++++++++++++++++++++++++ NotifyBotMulti.py | 12 +++++---- defAirport.py | 3 ++- planeClass.py | 20 ++++++++------ 4 files changed, 88 insertions(+), 14 deletions(-) create mode 100644 AppendAirport.py diff --git a/AppendAirport.py b/AppendAirport.py new file mode 100644 index 0000000..444a18a --- /dev/null +++ b/AppendAirport.py @@ -0,0 +1,67 @@ +def download_font(): + import os + fontfile = "Roboto-Regular.ttf" + if not os.path.isfile(fontfile): + print("No font file, downloading now") + try: + import requests + url = 'https://github.com/google/fonts/raw/master/apache/roboto/static/Roboto-Regular.ttf' + font = requests.get(url) + + open(fontfile, 'wb').write(font.content) + except: + raise("Error getting font or storing") + else: + print("Successfully got font", fontfile) + elif os.path.isfile(fontfile): + print("Already have font, continuing") + +def append_airport(filename, icao, airport, distance_mi): + from PIL import Image, ImageDraw, ImageFont + distance_km = distance_mi * 1.609 + + # create Image object with the input image + + image = Image.open(filename) + + # initialise the drawing context with + # the image object as background + + draw = ImageDraw.Draw(image) + + #Setup fonts + fontfile = "Roboto-Regular.ttf" + font = ImageFont.truetype(fontfile, 14) + mini_font = ImageFont.truetype(fontfile, 12) + head_font = ImageFont.truetype(fontfile, 16) + + #Setup Colors + black = 'rgb(0, 0, 0)' # Black + white = 'rgb(255, 255, 255)' # White + navish = 'rgb(0, 63, 75)' + whitish = 'rgb(248, 248, 248)' + #Info Box + draw.rectangle(((316, 760), (605, 800)), fill= white, outline=black) + #Header Box + draw.rectangle(((387, 738), (535, 760)), fill= navish) + + #Create Text + #Nearest Airport Header + (x, y) = (408, 740) + text = "Nearest Airport" + draw.text((x, y), text, fill=white, font=head_font) + #ICAO + (x, y) = (320, 765) + text = icao + draw.text((x, y), text, fill=black, font=font) + #Distance + (x, y) = (432, 765) + text = str(round(distance_mi, 2)) + "mi / " + str(round(distance_km, 2)) + "km away" + draw.text((x, y), text, fill=black, font=font) + #Full name + (x, y) = (320, 783) + text = airport[0:56] + draw.text((x, y), text, fill=black, font=mini_font) + + # save the edited image + image.save(filename) \ No newline at end of file diff --git a/NotifyBotMulti.py b/NotifyBotMulti.py index 3c29a3a..f5c3232 100644 --- a/NotifyBotMulti.py +++ b/NotifyBotMulti.py @@ -1,7 +1,5 @@ import configparser import time -from defADSBX import pullADSBX -from defOpenSky import pullOpenSky from colorama import Fore, Back, Style import platform if platform.system() == "Windows": @@ -9,14 +7,16 @@ if platform.system() == "Windows": init(convert=True) from planeClass import Plane from datetime import datetime -from defAirport import DownloadAirports +from defAirport import download_airports +from AppendAirport import download_font import pytz -DownloadAirports() +download_airports() +download_font() main_config = configparser.ConfigParser() main_config.read('./configs/mainconf.ini') import os import sys -#Setup Plane Objects off of Plane configs +#Setup plane objects from plane configs planes = {} for filename in os.listdir("./configs"): if filename.endswith(".ini") and filename != "mainconf.ini": @@ -38,6 +38,7 @@ while True: start_time = time.time() print (Back.GREEN, Fore.BLACK, "--------", running_Count, "--------", datetime_tz.strftime("%I:%M:%S %p"), "-------------------------------------------------------", Style.RESET_ALL) if main_config.get('DATA', 'SOURCE') == "ADSBX": + from defADSBX import pullADSBX data, failed = pullADSBX(planes) if failed == False: if data['ac'] != None: @@ -54,6 +55,7 @@ while True: for obj in planes.values(): obj.run(None) elif main_config.get('DATA', 'SOURCE') == "OPENS": + from defOpenSky import pullOpenSky planeData, failed = pullOpenSky(planes) if failed == False: if planeData.states != []: diff --git a/defAirport.py b/defAirport.py index 97d4a0f..29d10d4 100644 --- a/defAirport.py +++ b/defAirport.py @@ -1,6 +1,6 @@ #https://www.geeksforgeeks.org/python-calculate-distance-between-two-places-using-geopy/ #https://openflights.org/data.html -def DownloadAirports(): +def download_airports(): import os if not os.path.isfile('airports.dat'): print("No airports.dat file, downloading now") @@ -44,5 +44,6 @@ def getClosestAirport(latitude, longitude): elif airport_dist < closest_airport_dist: closest_airport_dict = airport closest_airport_dist = airport_dist + closest_airport_dict['distance'] = closest_airport_dist print("Closest Airport:", closest_airport_dict['icao'], closest_airport_dict['name'], closest_airport_dist, "Miles Away") return closest_airport_dict \ No newline at end of file diff --git a/planeClass.py b/planeClass.py index 7db254c..a8919d4 100644 --- a/planeClass.py +++ b/planeClass.py @@ -47,6 +47,7 @@ class Plane: import platform from datetime import datetime from tabulate import tabulate + from AppendAirport import append_airport from defAirport import getClosestAirport if self.config.get('MAP', 'OPTION') == "GOOGLESTATICMAP": from defMap import getMap @@ -213,11 +214,13 @@ class Plane: print("Tookoff by", self.trigger_type) #Lookup Location of coordinates if self.landed or self.tookoff: - if self.landed and self.last_longitude != None and self.last_latitude != None: - self.combined = f"{self.last_latitude}, {self.last_longitude}" - self.has_coords = True - elif self.tookoff and self.longitude != None and self.latitude != None: + if self.trigger_type == "now on ground" or "data acquisition" and self.longitude != None and self.latitude != None: self.combined = f"{self.latitude} , {self.longitude}" + nearest_airport_dict = getClosestAirport(self.latitude, self.longitude) + self.has_coords = True + elif self.trigger_type == "data loss" or "no longer on ground" and self.last_longitude != None and self.last_latitude != None: + self.combined = f"{self.last_latitude}, {self.last_longitude}" + nearest_airport_dict = getClosestAirport(self.last_latitude, self.last_longitude) self.has_coords = True else: print (Fore.RED + 'No Location') @@ -300,12 +303,12 @@ class Plane: getMap((self.aera_hierarchy + ", " + self.state + ", " + self.country_code), self.icao) elif self.config.get('MAP', 'OPTION') == "ADSBX": getSS(self.icao) + append_airport(self.map_file_name, nearest_airport_dict['icao'], nearest_airport_dict['name'], nearest_airport_dict['distance']) else: raise Exception("Map option not set correctly in this planes conf") #Discord if self.config.getboolean('DISCORD', 'ENABLE'): - nearest = getClosestAirport(self.latitude, self.longitude) - self.dis_message = (self.dis_title + " " + self.tookoff_message + nearest['icao'] + ", " + nearest["name"]).strip() + self.dis_message = (self.dis_title + " " + self.tookoff_message + nearest_airport_dict['icao'] + ", " + nearest_airport_dict["name"]).strip() sendDis(self.dis_message, self.map_file_name, self.config) #PushBullet if self.config.getboolean('PUSHBULLET', 'ENABLE'): @@ -342,12 +345,13 @@ class Plane: getMap((self.aera_hierarchy + ", " + self.state + ", " + self.country_code), self.icao) elif self.config.get('MAP', 'OPTION') == "ADSBX": getSS(self.icao) + append_airport(self.map_file_name, nearest_airport_dict['icao'], nearest_airport_dict['name'], nearest_airport_dict['distance']) + else: raise Exception("Map option not set correctly in this planes conf") #Discord if self.config.getboolean('DISCORD', 'ENABLE'): - nearest = getClosestAirport(self.last_latitude, self.last_longitude) - self.dis_message = (self.dis_title + " " +self.landed_message + nearest['icao'] + ", " + nearest["name"]).strip() + self.dis_message = (self.dis_title + " " +self.landed_message + nearest_airport_dict['icao'] + ", " + nearest_airport_dict["name"]).strip() sendDis(self.dis_message, self.map_file_name, self.config) #PushBullet if self.config.getboolean('PUSHBULLET', 'ENABLE'): From 8283c83640c224f98806e92b5dab96be74a994cf Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Fri, 13 Nov 2020 03:05:21 +0000 Subject: [PATCH 095/124] Remove airports.dat download info, now automatic --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index ab27892..0b9da57 100644 --- a/README.md +++ b/README.md @@ -92,11 +92,6 @@ git clone -b multi --single-branch https://github.com/Jxck-S/plane-notify.git cd plane-notify ``` -### Download the latest airports.dat from OpenFlights for nearest airport lookup - https://openflights.org/data.html -```bash -wget https://raw.githubusercontent.com/jpatokal/openflights/master/data/airports.dat -``` - ### Configure main config file with keys and URLs (mainconf.ini) in configs directory - edit them with nano or vi on the running machine or on your pc and transfer the config to where you will be running the bot From 9d301f0065aabae71436386ce51590a0adab5402 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Fri, 13 Nov 2020 23:13:27 +0000 Subject: [PATCH 096/124] Update TODO --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0b9da57..b9f80f0 100644 --- a/README.md +++ b/README.md @@ -114,7 +114,8 @@ python3 NotifyBotMulti.py ### TODO -- Clostest airport name(WORKING), but outputs to Discord currently only atm, will be adding it to the map image with PIL, Would add as text output but the closest airport is not always correct - General Cleanup +- Add ADSBX V2 use +- Get rid of landing/takeoff by data loss/aqquision instead use to last contact timeout for landing. ### [ More Refrences / Documentation](Refrences.md) From a2b4eafc543ebbbe1c8637e519780c68554e3859 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Wed, 18 Nov 2020 04:00:15 +0000 Subject: [PATCH 097/124] Ignore pyc --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 59565f9..6be18a2 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ pythonenv3.8/ Roboto-Regular.ttf airports.dat +__pycache__ \ No newline at end of file From 845bcfa1f916efa9938fb566cbd21be78e623c1f Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Thu, 19 Nov 2020 00:25:51 +0000 Subject: [PATCH 098/124] Update needed dependencies in docs --- README.md | 23 ++++++++++++----------- Refrences.md | 5 +++++ 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index b9f80f0..2f3cdcc 100644 --- a/README.md +++ b/README.md @@ -37,13 +37,20 @@ apt install python3 apt install python3-pip ``` -### Install Colorama, geopy, ptyz +### Install Colorama, geopy, ptyz, etc ```bash pip install colorama pip install geopy pip3 install ptyz pip3 install tabulate +pip install pillow +``` + +### Install OpenSky Wrapper, if your going to be using OpenSky as source + +```bash +pip install -e "git+https://github.com/openskynetwork/opensky-api.git#egg=python&subdirectory=python" ``` ### Install Selenium / ChromeDriver or setup Google Static Maps @@ -52,21 +59,15 @@ Selenium/ChromeDriver is used to take a screenshot of the plane on globe.adsbexc #### 1. Chromium -``` -sudo apt-get install chromium -``` + sudo apt-get install chromium -#### 2. ChromeDriver +#### 2. Web Driver Manager -``` -sudo apt-get install chromium-driver -``` + pip install webdriver-manager #### 3. Selenium -``` -pip install -U selenium -``` + pip install -U selenium ### Install Pushbullet, Tweepy, and Discord optional output methods already implemented in code, only install the ones you want to use. diff --git a/Refrences.md b/Refrences.md index c2e8c97..cacfccf 100644 --- a/Refrences.md +++ b/Refrences.md @@ -8,6 +8,7 @@ ## OpenSky - +- ## GeoPy - Location Name Lookup @@ -45,6 +46,10 @@ - - +## Web Driver Manager + + + ## Tabulate - From b11df1393007da5c7cc7b2ddb35b74a8824f6c05 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Thu, 19 Nov 2020 19:45:26 -0500 Subject: [PATCH 099/124] Really ADSB Exchange?!??? --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2f3cdcc..59ae627 100644 --- a/README.md +++ b/README.md @@ -116,7 +116,7 @@ python3 NotifyBotMulti.py ### TODO - General Cleanup -- Add ADSBX V2 use +- Add ADSBX V2 use (not really possible unless theyd give me access, luckly if we get to keep V1 use ADSBX may be taking away Free API apparently, THANKS ALOT) - Get rid of landing/takeoff by data loss/aqquision instead use to last contact timeout for landing. ### [ More Refrences / Documentation](Refrences.md) From 030f2c14d2066523cb10a6996ce72d346af5d873 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Fri, 20 Nov 2020 03:24:21 +0000 Subject: [PATCH 100/124] Source failover, from ADSBX to OPENS Landing by data loss after 5 mins now --- NotifyBotMulti.py | 24 +++++++++++++++--------- planeClass.py | 43 +++++++++++++++++++++++++------------------ 2 files changed, 40 insertions(+), 27 deletions(-) diff --git a/NotifyBotMulti.py b/NotifyBotMulti.py index f5c3232..04f39db 100644 --- a/NotifyBotMulti.py +++ b/NotifyBotMulti.py @@ -14,6 +14,7 @@ download_airports() download_font() main_config = configparser.ConfigParser() main_config.read('./configs/mainconf.ini') +source = main_config.get('DATA', 'SOURCE') import os import sys #Setup plane objects from plane configs @@ -25,6 +26,7 @@ for filename in os.listdir("./configs"): planes[plane_config.get('DATA', 'ICAO').upper()] = Plane(plane_config.get('DATA', 'ICAO'), filename) running_Count = 0 +failed_count = 0 try: tz = pytz.timezone(main_config.get('DATA', 'TZ')) except pytz.exceptions.UnknownTimeZoneError: @@ -37,7 +39,7 @@ while True: running_Count +=1 start_time = time.time() print (Back.GREEN, Fore.BLACK, "--------", running_Count, "--------", datetime_tz.strftime("%I:%M:%S %p"), "-------------------------------------------------------", Style.RESET_ALL) - if main_config.get('DATA', 'SOURCE') == "ADSBX": + if source == "ADSBX": from defADSBX import pullADSBX data, failed = pullADSBX(planes) if failed == False: @@ -46,15 +48,17 @@ while True: has_data = False for planeData in data['ac']: if planeData['icao'] == key: - obj.run(planeData) + obj.run(planeData, source) has_data = True break if has_data is False: - obj.run(None) + obj.run(None, source) else: for obj in planes.values(): - obj.run(None) - elif main_config.get('DATA', 'SOURCE') == "OPENS": + obj.run(None, source) + elif failed: + failed_count += 1 + elif source == "OPENS": from defOpenSky import pullOpenSky planeData, failed = pullOpenSky(planes) if failed == False: @@ -64,20 +68,22 @@ while True: has_data = False for dataState in planeData.states: if (dataState.icao24).upper() == key: - obj.run(dataState) + obj.run(dataState, source) has_data = True break if has_data is False: - obj.run(None) + obj.run(None, source) else: for obj in planes.values(): - obj.run(None) + obj.run(None, source) + if failed_count >= 10: + source = "OPENS" elapsed_calc_time = time.time() - start_time datetime_tz = datetime.now(tz) print (Back.GREEN, Fore.BLACK, "--------", running_Count, "--------", datetime_tz.strftime("%I:%M:%S %p"), "------------------------Elapsed Time-", elapsed_calc_time, " -------------------------------------", Style.RESET_ALL) - sleep_sec = 20 + sleep_sec = 5 for i in range(sleep_sec,0,-1): if i < 10: i = " " + str(i) diff --git a/planeClass.py b/planeClass.py index a8919d4..b407ecc 100644 --- a/planeClass.py +++ b/planeClass.py @@ -14,16 +14,17 @@ class Plane: self.latitude = None self.callsign = None self.takeoff_time = None - self.reg = None + self.map_file_name = icao.upper() + "_map.png" self.last_latitude = None self.last_longitude = None self.recheck_needed = None self.last_recheck_needed = None self.last_contact = None + self.last_feed_data = None def getICAO(self): return self.icao - def run(self, ac_dict): + def run(self, ac_dict, source): #Import Modules #Clear Terminal @@ -40,8 +41,6 @@ class Plane: import configparser self.config = configparser.ConfigParser() self.config.read(("./configs/"+ self.conf_file)) - main_config = configparser.ConfigParser() - main_config.read('./configs/mainconf.ini') #Platform for determining OS for strftime import platform @@ -76,8 +75,9 @@ class Plane: self.latitude = None self.on_ground = None self.has_location = None + time_since_contact = None #Parse OpenSky Vector - if main_config.get('DATA', 'SOURCE') == "OPENS": + if source == "OPENS": self.val_error = False if ac_dict != None: #print (Fore.YELLOW + "OpenSky Sourced Data: ", ac_dict) @@ -93,7 +93,7 @@ class Plane: print(e) #Parse ADBSX Vector - elif main_config.get('DATA', 'SOURCE') == "ADSBX": + elif source == "ADSBX": self.val_error = False if ac_dict != None: #print (Fore.YELLOW +"ADSBX Sourced Data: ", ac_dict, Style.RESET_ALL) @@ -179,7 +179,7 @@ class Plane: self.tookoff = True self.trigger_type = "no longer on ground" self.tookoff_header = "Took off from " - elif self.last_feeding is False and self.feeding: + elif self.last_feeding is False and self.feeding and self.last_feed_data == None: self.tookoff = True self.trigger_type = "data acquisition" self.tookoff_header = "Took off near " @@ -193,19 +193,26 @@ class Plane: #Check if Landed - if self.last_below_desired_ft: - if self.on_ground and self.last_on_ground is False: - self.landed = True - self.trigger_type = "now on ground" - self.landed_header = "Landed in " - elif self.last_feeding and self.feeding is False and self.last_on_ground is False: - self.landed = True - self.trigger_type = "data loss" - self.landed_header = "Landed near " - else: - self.landed = False + if self.on_ground and self.last_on_ground is False and self.last_below_desired_ft: + self.landed = True + self.trigger_type = "now on ground" + self.landed_header = "Landed in " + self.last_feed_data = None + #Store a dictionary when data is lost near landing conditions, + elif self.last_below_desired_ft and self.last_feeding and self.feeding is False and self.last_on_ground is False: + self.last_feed_data = {} + self.last_feed_data.update(self.__dict__) + print("Latest data stored") + + elif self.last_feed_data != None and self.feeding is False and time_since_contact.seconds >= 300: + self.__dict__.update(self.last_feed_data) + self.last_feed_data = None + self.landed = True + self.trigger_type = "data loss" + self.landed_header = "Landed near " else: self.landed = False + #self.landed = bool(self.last_below_desired_ft and ((self.last_feeding and self.feeding is False and self.last_on_ground is False) or (self.on_ground and self.last_on_ground is False))) #print ("Landed Just Now:", self.landed) if self.landed: From a3ecea93e0f53a8f88073202cdfc29f021a3e2d6 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Sat, 21 Nov 2020 03:51:21 +0000 Subject: [PATCH 101/124] Fix code lines --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 59ae627..e6d8e33 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Notify if configured planes have taken off or landed using Python with OpenSky or ADS-B Exchange Data, outputs location of takeoff location of landing and takeoff by reverse lookup of coordinates. -### Branches +## Branches Their are two branches of this program single is the original only supports one plane works with OpenSky and ADSBX. Multi branch is the new version supports multiple planes, mainly built around being based on ADSBX data, OpenSky data in this version may have issues, didn't test much. Your current viewing multi. @@ -59,15 +59,21 @@ Selenium/ChromeDriver is used to take a screenshot of the plane on globe.adsbexc #### 1. Chromium + ```bash sudo apt-get install chromium + ``` #### 2. Web Driver Manager + ```bash pip install webdriver-manager + ``` #### 3. Selenium + ```bash pip install -U selenium + ``` ### Install Pushbullet, Tweepy, and Discord optional output methods already implemented in code, only install the ones you want to use. From 91ce337d44d708d20868f55fee422fd8b9da8d8b Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Sat, 21 Nov 2020 03:51:50 +0000 Subject: [PATCH 102/124] Fix wrong file name --- defMap.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/defMap.py b/defMap.py index 172c9ee..80162c4 100644 --- a/defMap.py +++ b/defMap.py @@ -15,7 +15,7 @@ def getMap(mapLocation, icao): # wb mode is stand for write binary mode file_name = icao + "_map.png" - f = open('map.png', 'wb') + f = open(file_name, 'wb') # r.content gives content, # in this case gives image From ddd09eff6b3c8c92391b79e60d478d8542410754 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Sat, 21 Nov 2020 03:52:23 +0000 Subject: [PATCH 103/124] Remove set response, unrefrenced --- defDiscord.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/defDiscord.py b/defDiscord.py index 619f720..988dcb6 100644 --- a/defDiscord.py +++ b/defDiscord.py @@ -5,4 +5,4 @@ def sendDis(message, map_file_name, config): with open(map_file_name, "rb") as f: webhook.add_file(file=f.read(), filename='map.png') - response = webhook.execute() \ No newline at end of file + webhook.execute() \ No newline at end of file From dc4b0e240b8cb315466b77d6e5316dbccefc24d8 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Sat, 21 Nov 2020 03:53:00 +0000 Subject: [PATCH 104/124] Unused module --- defADSBX.py | 1 - 1 file changed, 1 deletion(-) diff --git a/defADSBX.py b/defADSBX.py index 59ab90d..b23d252 100644 --- a/defADSBX.py +++ b/defADSBX.py @@ -1,7 +1,6 @@ import requests import json import configparser -import time from datetime import datetime from http.client import IncompleteRead import http.client as http From a8608f5c54a66e7aec6a087b19b99606a5c31cfb Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Sat, 21 Nov 2020 03:58:43 +0000 Subject: [PATCH 105/124] New Airport Lookup -New Database Source -Airport types per plane in config --- .gitignore | 3 +- configs/plane1.ini | 8 +++-- defAirport.py | 83 +++++++++++++++++++++++++++------------------- planeClass.py | 4 +-- 4 files changed, 59 insertions(+), 39 deletions(-) diff --git a/.gitignore b/.gitignore index 6be18a2..2ac7eec 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ pythonenv3.8/ Roboto-Regular.ttf airports.dat -__pycache__ \ No newline at end of file +__pycache__ +airports.csv diff --git a/configs/plane1.ini b/configs/plane1.ini index e3bcc58..e561648 100644 --- a/configs/plane1.ini +++ b/configs/plane1.ini @@ -7,8 +7,12 @@ ICAO = icaohere #Enter GOOGLESTATICMAP or ADSBX OPTION = ADSBX -#TITLE for Twitter, PB and Discord are Just text added to the front of each message/tweet sent +[AIRPORT] +#Requires a list of airport types, this plane could land/takeoff at +#Choices: small_airport, medium_airport, large_airport, heliport, seaplane_base +TYPES = [small_airport, medium_airport, large_airport] +#TITLE for Twitter, PB and Discord are Just text added to the front of each message/tweet sent [TWITTER] ENABLE = FALSE TITLE = @@ -27,5 +31,5 @@ CHANNEL_TAG = channeltag ENABLE = TRUE #WEBHOOK URL https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks URL = webhookurl -Title = +Title = USERNAME = plane-notify diff --git a/defAirport.py b/defAirport.py index 29d10d4..d47096c 100644 --- a/defAirport.py +++ b/defAirport.py @@ -2,48 +2,63 @@ #https://openflights.org/data.html def download_airports(): import os - if not os.path.isfile('airports.dat'): - print("No airports.dat file, downloading now") + if not os.path.isfile('airports.csv'): + print("No airports.csv file, downloading now") try: import requests - url = 'https://raw.githubusercontent.com/jpatokal/openflights/master/data/airports.dat' + url = 'https://ourairports.com/data/airports.csv' airports = requests.get(url) - open('airports.dat', 'wb').write(airports.content) + open('airports.csv', 'wb').write(airports.content) except: raise("Error getting airports.dat or storing") else: #Writes current date to airports.dat to show when it was aqquired import datetime date = datetime.datetime.now() - with open('airports.dat', 'a') as airports: + with open('airports.csv', 'a') as airports: airports.write("#" + str(date)) - print("Successfully got airports.dat") - elif os.path.isfile('airports.dat'): - print("Already Have airports.dat, continuing") -def getClosestAirport(latitude, longitude): - import json - import csv - from geopy.distance import geodesic - plane = (latitude, longitude) - header = ["id", "name", "city", "country", "iata", "icao", "lat", "lng", "alt", "tz", "dst", "tz_db", "type", "source"] - airports = [] - first_run = True - with open('airports.dat', encoding='utf-8') as csvf: - reader = csv.DictReader(filter(lambda row: row[0]!='#', csvf), header) - #for row in reader: - # airports.append(row) - for row in reader: - airport = row - airport_coord = float(airport['lat']), float(airport['lng']) - airport_dist = float((geodesic(plane, airport_coord).mi)) - if first_run: - closest_airport_dict = airport - closest_airport_dist = airport_dist - first_run = False - elif airport_dist < closest_airport_dist: - closest_airport_dict = airport - closest_airport_dist = airport_dist - closest_airport_dict['distance'] = closest_airport_dist - print("Closest Airport:", closest_airport_dict['icao'], closest_airport_dict['name'], closest_airport_dist, "Miles Away") - return closest_airport_dict \ No newline at end of file + print("Successfully got airports.csv") + elif os.path.isfile('airports.csv'): + print("Already Have airports.csv, continuing") +#OLD Airport lookup +# def getClosestAirport(latitude, longitude): +# import csv +# from geopy.distance import geodesic +# plane = (latitude, longitude) +# header = ["id", "name", "city", "country", "iata", "icao", "lat", "lng", "alt", "tz", "dst", "tz_db", "type", "source"] +# with open('airports.dat', encoding='utf-8') as airport_dat: +# airport_dat_reader = csv.DictReader(filter(lambda row: row[0]!='#', airport_dat), header) +# for airport in airport_dat_reader: +# airport_coord = float(airport['lat']), float(airport['lng']) +# airport_dist = float((geodesic(plane, airport_coord).mi)) +# if "closest_airport_dict" not in locals(): +# closest_airport_dict = airport +# closest_airport_dist = airport_dist +# elif airport_dist < closest_airport_dist: +# closest_airport_dict = airport +# closest_airport_dist = airport_dist +# closest_airport_dict['distance'] = closest_airport_dist +# print("Closest Airport:", closest_airport_dict['icao'], closest_airport_dict['name'], closest_airport_dist, "Miles Away") +# return closest_airport_dict +def getClosestAirport(latitude, longitude, allowed_types): + import csv + from geopy.distance import geodesic + plane = (latitude, longitude) + with open('airports.csv', 'r') as airport_csv: + airport_csv_reader = csv.DictReader(filter(lambda row: row[0]!='#', airport_csv)) + for airport in airport_csv_reader: + if airport['type'] in allowed_types: + airport_coord = float(airport['latitude_deg']), float(airport['longitude_deg']) + airport_dist = float((geodesic(plane, airport_coord).mi)) + if "closest_airport_dict" not in locals(): + closest_airport_dict = airport + closest_airport_dist = airport_dist + elif airport_dist < closest_airport_dist: + closest_airport_dict = airport + closest_airport_dist = airport_dist + closest_airport_dict['distance'] = closest_airport_dist + #Convert indent key to icao key as its labeled icao in other places not ident + closest_airport_dict['icao'] = closest_airport_dict.pop('ident') + print("Closest Airport:", closest_airport_dict['icao'], closest_airport_dict['name'], closest_airport_dist, "Miles Away") + return closest_airport_dict \ No newline at end of file diff --git a/planeClass.py b/planeClass.py index b407ecc..c431885 100644 --- a/planeClass.py +++ b/planeClass.py @@ -223,11 +223,11 @@ class Plane: if self.landed or self.tookoff: if self.trigger_type == "now on ground" or "data acquisition" and self.longitude != None and self.latitude != None: self.combined = f"{self.latitude} , {self.longitude}" - nearest_airport_dict = getClosestAirport(self.latitude, self.longitude) + nearest_airport_dict = getClosestAirport(self.latitude, self.longitude, self.config.get("AIRPORT", "TYPES")) self.has_coords = True elif self.trigger_type == "data loss" or "no longer on ground" and self.last_longitude != None and self.last_latitude != None: self.combined = f"{self.last_latitude}, {self.last_longitude}" - nearest_airport_dict = getClosestAirport(self.last_latitude, self.last_longitude) + nearest_airport_dict = getClosestAirport(self.last_latitude, self.last_longitude, self.config.get("AIRPORT", "TYPES")) self.has_coords = True else: print (Fore.RED + 'No Location') From 43f9d51b5f1ca548e91a23b61ba02faa09df7879 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Sat, 21 Nov 2020 04:40:35 +0000 Subject: [PATCH 106/124] New items should be tight --- PseudoCode.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/PseudoCode.md b/PseudoCode.md index 33c573d..03ae3bb 100644 --- a/PseudoCode.md +++ b/PseudoCode.md @@ -1,15 +1,9 @@ ### How It works - - Takes data about every ~30 seconds from OpenSky Network or ADS-B Exchange and compares it to previous data with what I've defined as a landing or takeoff event. - - A takeoff event is the plane is not on the ground, below 10k feet and ((previously no data and now getting data) or was previously on the ground). - A landing event is previously below 10k feet and (previously getting data, no longer getting data and previously not on the ground) or (now on the ground and previously not on the ground). - - Given the coordinates of the aircraft the coordinates are reverse looked up for a location name. (GeoPY Nomination Geolocator) - - At the time of takeoff a takeoff time is set, which is referenced in the landing event to calculate approximate total flight time. - - A Static map image is created based off location name. (Google Static Maps API) or a screenshot of is created using Selenium/ChromeDriver The selected plane is locked on in the screenshot. - -- If the landing event and takeoff events are true, It will output to any of the following built-in output methods. (Twitter, Pushbullet, and Discord all of which can be setup and enabled in each planes config file. Outputs the location name, map image and flight time on landing. (Tweepy and "Pushbullet.py" and Discord_webhooks) \ No newline at end of file +- If the landing event and takeoff events are true, It will output to any of the following built-in output methods. (Twitter, Pushbullet, and Discord all of which can be setup and enabled in each planes config file. Outputs the location name, map image and flight time on landing. (Tweepy and "Pushbullet.py" and Discord_webhooks) From 4a771a8bbcccdd1707668f0dbf137002b705009f Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Sat, 21 Nov 2020 16:40:54 +0000 Subject: [PATCH 107/124] Cleanup -Remove white space -Unused color --- AppendAirport.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AppendAirport.py b/AppendAirport.py index 444a18a..00d37f9 100644 --- a/AppendAirport.py +++ b/AppendAirport.py @@ -7,9 +7,9 @@ def download_font(): import requests url = 'https://github.com/google/fonts/raw/master/apache/roboto/static/Roboto-Regular.ttf' font = requests.get(url) - + open(fontfile, 'wb').write(font.content) - except: + except: raise("Error getting font or storing") else: print("Successfully got font", fontfile) From 222f4d11dd0c26cdb6ebb3a829ba12b937ff4c3e Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Sat, 21 Nov 2020 16:46:02 +0000 Subject: [PATCH 108/124] Remove unused color --- AppendAirport.py | 1 - 1 file changed, 1 deletion(-) diff --git a/AppendAirport.py b/AppendAirport.py index 00d37f9..fa540af 100644 --- a/AppendAirport.py +++ b/AppendAirport.py @@ -39,7 +39,6 @@ def append_airport(filename, icao, airport, distance_mi): black = 'rgb(0, 0, 0)' # Black white = 'rgb(255, 255, 255)' # White navish = 'rgb(0, 63, 75)' - whitish = 'rgb(248, 248, 248)' #Info Box draw.rectangle(((316, 760), (605, 800)), fill= white, outline=black) #Header Box From b5f8e50b4c90d47c2dff3be1eae386a2888bb1d0 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Sat, 21 Nov 2020 16:46:18 +0000 Subject: [PATCH 109/124] Remove empty line --- PseudoCode.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PseudoCode.md b/PseudoCode.md index 03ae3bb..5c4fc6d 100644 --- a/PseudoCode.md +++ b/PseudoCode.md @@ -6,4 +6,4 @@ - Given the coordinates of the aircraft the coordinates are reverse looked up for a location name. (GeoPY Nomination Geolocator) - At the time of takeoff a takeoff time is set, which is referenced in the landing event to calculate approximate total flight time. - A Static map image is created based off location name. (Google Static Maps API) or a screenshot of is created using Selenium/ChromeDriver The selected plane is locked on in the screenshot. -- If the landing event and takeoff events are true, It will output to any of the following built-in output methods. (Twitter, Pushbullet, and Discord all of which can be setup and enabled in each planes config file. Outputs the location name, map image and flight time on landing. (Tweepy and "Pushbullet.py" and Discord_webhooks) +- If the landing event and takeoff events are true, It will output to any of the following built-in output methods. (Twitter, Pushbullet, and Discord all of which can be setup and enabled in each planes config file. Outputs the location name, map image and flight time on landing. (Tweepy and "Pushbullet.py" and Discord_webhooks) \ No newline at end of file From 60322146d24e6da022de957f31c8f1c8a031883a Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Sat, 21 Nov 2020 18:07:18 +0000 Subject: [PATCH 110/124] Fix formatting according to Markdown Style Guide --- AppendAirport.py | 2 +- PseudoCode.md | 1 - README.md | 5 +++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/AppendAirport.py b/AppendAirport.py index fa540af..04bc30f 100644 --- a/AppendAirport.py +++ b/AppendAirport.py @@ -21,7 +21,7 @@ def append_airport(filename, icao, airport, distance_mi): distance_km = distance_mi * 1.609 # create Image object with the input image - + image = Image.open(filename) # initialise the drawing context with diff --git a/PseudoCode.md b/PseudoCode.md index 5c4fc6d..3a13683 100644 --- a/PseudoCode.md +++ b/PseudoCode.md @@ -1,7 +1,6 @@ ### How It works - Takes data about every ~30 seconds from OpenSky Network or ADS-B Exchange and compares it to previous data with what I've defined as a landing or takeoff event. - A takeoff event is the plane is not on the ground, below 10k feet and ((previously no data and now getting data) or was previously on the ground). - - A landing event is previously below 10k feet and (previously getting data, no longer getting data and previously not on the ground) or (now on the ground and previously not on the ground). - Given the coordinates of the aircraft the coordinates are reverse looked up for a location name. (GeoPY Nomination Geolocator) - At the time of takeoff a takeoff time is set, which is referenced in the landing event to calculate approximate total flight time. diff --git a/README.md b/README.md index e6d8e33..546acd7 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,8 @@ cd plane-notify ### Configure individual planes -#### an example file is given (plane1.ini) Plane config files should be in the configs directory, the program looks for any file in that folder with a .ini exstenstion. +- an example file is given (plane1.ini) plane config files should be in the configs directory, the program looks for any file in that folder with a .ini exstenstion. +- each plane should have its own config ### Enter and create new Screen Session @@ -125,4 +126,4 @@ python3 NotifyBotMulti.py - Add ADSBX V2 use (not really possible unless theyd give me access, luckly if we get to keep V1 use ADSBX may be taking away Free API apparently, THANKS ALOT) - Get rid of landing/takeoff by data loss/aqquision instead use to last contact timeout for landing. -### [ More Refrences / Documentation](Refrences.md) +### [More Refrences/Documentation](Refrences.md) From 90e143191a139b877ba9c0e0116a0dfb85e288da Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Sat, 21 Nov 2020 18:26:27 +0000 Subject: [PATCH 111/124] Formatting -Remark -Docustrings --- README.md | 4 ++-- defAirport.py | 6 +++--- planeClass.py | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 546acd7..0614abb 100644 --- a/README.md +++ b/README.md @@ -105,8 +105,8 @@ cd plane-notify ### Configure individual planes -- an example file is given (plane1.ini) plane config files should be in the configs directory, the program looks for any file in that folder with a .ini exstenstion. -- each plane should have its own config +- an example file is given (plane1.ini) plane config files should be in the configs directory, the program looks for any file in that folder with a .ini exstenstion. +- each plane should have its own config ### Enter and create new Screen Session diff --git a/defAirport.py b/defAirport.py index d47096c..a79be74 100644 --- a/defAirport.py +++ b/defAirport.py @@ -8,12 +8,12 @@ def download_airports(): import requests url = 'https://ourairports.com/data/airports.csv' airports = requests.get(url) - + open('airports.csv', 'wb').write(airports.content) - except: + except: raise("Error getting airports.dat or storing") else: - #Writes current date to airports.dat to show when it was aqquired + #Writes current date to airports.dat to show when it was aqquired import datetime date = datetime.datetime.now() with open('airports.csv', 'a') as airports: diff --git a/planeClass.py b/planeClass.py index c431885..3c55216 100644 --- a/planeClass.py +++ b/planeClass.py @@ -1,5 +1,6 @@ class Plane: def __init__(self, icao, conf_file): + '''Initializes a plane object from its config file and given icao''' self.icao = icao.upper() self.conf_file = conf_file self.geo_alt_ft = None @@ -14,7 +15,6 @@ class Plane: self.latitude = None self.callsign = None self.takeoff_time = None - self.map_file_name = icao.upper() + "_map.png" self.last_latitude = None self.last_longitude = None @@ -25,7 +25,7 @@ class Plane: def getICAO(self): return self.icao def run(self, ac_dict, source): - + '''Runs a check of a plane module to see if its landed or takenoff using plane data, and takes action if so''' #Import Modules #Clear Terminal #print("\033[H\033[J") @@ -198,7 +198,7 @@ class Plane: self.trigger_type = "now on ground" self.landed_header = "Landed in " self.last_feed_data = None - #Store a dictionary when data is lost near landing conditions, + #Store a dictionary when data is lost near landing conditions, elif self.last_below_desired_ft and self.last_feeding and self.feeding is False and self.last_on_ground is False: self.last_feed_data = {} self.last_feed_data.update(self.__dict__) @@ -353,7 +353,7 @@ class Plane: elif self.config.get('MAP', 'OPTION') == "ADSBX": getSS(self.icao) append_airport(self.map_file_name, nearest_airport_dict['icao'], nearest_airport_dict['name'], nearest_airport_dict['distance']) - + else: raise Exception("Map option not set correctly in this planes conf") #Discord From 83a71c3a03132701b2c5bfb9dd7147bdc5ca063e Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Sun, 22 Nov 2020 01:41:34 +0000 Subject: [PATCH 112/124] Unused value access removed --- defOpenSky.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/defOpenSky.py b/defOpenSky.py index 9b381ee..b32481e 100644 --- a/defOpenSky.py +++ b/defOpenSky.py @@ -7,7 +7,7 @@ def pullOpenSky(planes): opens_api = OpenSkyApi(username= None if main_config.get('OPENSKY', 'USERNAME').upper() == "NONE" else main_config.get('OPENSKY', 'USERNAME'), password= None if main_config.get('OPENSKY', 'PASSWORD').upper() == "NONE" else main_config.get('OPENSKY', 'PASSWORD').upper()) failed = False icao_array = [] - for key, obj in planes.items(): + for key in planes.keys(): icao_array.append(key.lower()) try: planeData = opens_api.get_states(time_secs=0, icao24=icao_array) From 948129059885cc78f9d398dd5da35ee5a87a9db3 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Sun, 22 Nov 2020 01:42:09 +0000 Subject: [PATCH 113/124] Fix quotes --- planeClass.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/planeClass.py b/planeClass.py index 3c55216..b894d20 100644 --- a/planeClass.py +++ b/planeClass.py @@ -1,6 +1,6 @@ class Plane: def __init__(self, icao, conf_file): - '''Initializes a plane object from its config file and given icao''' + """Initializes a plane object from its config file and given icao""" self.icao = icao.upper() self.conf_file = conf_file self.geo_alt_ft = None @@ -25,7 +25,7 @@ class Plane: def getICAO(self): return self.icao def run(self, ac_dict, source): - '''Runs a check of a plane module to see if its landed or takenoff using plane data, and takes action if so''' + """Runs a check of a plane module to see if its landed or takenoff using plane data, and takes action if so""" #Import Modules #Clear Terminal #print("\033[H\033[J") From 7466c7e799b6712e22240f8a401c40c0e1fe13da Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Sun, 22 Nov 2020 01:42:54 +0000 Subject: [PATCH 114/124] Fix formating --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0614abb..957934d 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ I made this program so I could track Elon Musk's Jet and share with others of hi Im open to any help or suggestions, I realize theirs much better ways im sure to do alot of my methods, im only a noob. I'll accept pull requests. If you'd like to discuss join -### [ How It Works](PseudoCode.md) +### [Algorithm](PseudoCode.md) ## Setup / Install @@ -75,7 +75,7 @@ Selenium/ChromeDriver is used to take a screenshot of the plane on globe.adsbexc pip install -U selenium ``` -### Install Pushbullet, Tweepy, and Discord optional output methods already implemented in code, only install the ones you want to use. +### Install Pushbullet, Tweepy, and Discord optional output methods already implemented in code, only install the ones you want to use ```bash pip install tweepy From 39941af44a4154a98bb4963f02dc4c9831efd835 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Sun, 22 Nov 2020 01:50:30 +0000 Subject: [PATCH 115/124] Fix code blocks --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 957934d..74d2179 100644 --- a/README.md +++ b/README.md @@ -59,21 +59,21 @@ Selenium/ChromeDriver is used to take a screenshot of the plane on globe.adsbexc #### 1. Chromium - ```bash - sudo apt-get install chromium - ``` +```bash +sudo apt-get install chromium +``` #### 2. Web Driver Manager - ```bash - pip install webdriver-manager - ``` +```bash +pip install webdriver-manager +``` #### 3. Selenium - ```bash - pip install -U selenium - ``` +```bash +pip install -U selenium +``` ### Install Pushbullet, Tweepy, and Discord optional output methods already implemented in code, only install the ones you want to use From fe38b2ed676b76b11b4eacf941fd4773e89ac17d Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Sun, 22 Nov 2020 13:15:09 +0000 Subject: [PATCH 116/124] Whitespace --- AppendAirport.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppendAirport.py b/AppendAirport.py index 04bc30f..8f9fa71 100644 --- a/AppendAirport.py +++ b/AppendAirport.py @@ -23,7 +23,7 @@ def append_airport(filename, icao, airport, distance_mi): # create Image object with the input image image = Image.open(filename) - + # initialise the drawing context with # the image object as background From fea30b4e65d2e82af7b9283a74af1924a2df0808 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Sun, 22 Nov 2020 13:20:41 +0000 Subject: [PATCH 117/124] Period fix docustirngs Remove push response set --- planeClass.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/planeClass.py b/planeClass.py index b894d20..318b764 100644 --- a/planeClass.py +++ b/planeClass.py @@ -1,6 +1,6 @@ class Plane: def __init__(self, icao, conf_file): - """Initializes a plane object from its config file and given icao""" + """Initializes a plane object from its config file and given icao.""" self.icao = icao.upper() self.conf_file = conf_file self.geo_alt_ft = None @@ -25,7 +25,7 @@ class Plane: def getICAO(self): return self.icao def run(self, ac_dict, source): - """Runs a check of a plane module to see if its landed or takenoff using plane data, and takes action if so""" + """Runs a check of a plane module to see if its landed or takenoff using plane data, and takes action if so.""" #Import Modules #Clear Terminal #print("\033[H\033[J") @@ -238,7 +238,7 @@ class Plane: if self.has_coords: try: self.location = geolocator.reverse(self.combined) - except: + except BaseException: print ("Geopy API Error") else: # print (Fore.YELLOW, "Geopy debug: ", location.raw, Style.RESET_ALL) @@ -321,8 +321,8 @@ class Plane: if self.config.getboolean('PUSHBULLET', 'ENABLE'): with open(self.map_file_name, "rb") as pic: map_data = self.pb.upload_file(pic, "Tookoff IMG") - push = self.pb_channel.push_note(self.config.get('PUSHBULLET', 'TITLE'), self.tookoff_message) - push = self.pb_channel.push_file(**map_data) + self.pb_channel.push_note(self.config.get('PUSHBULLET', 'TITLE'), self.tookoff_message) + self.pb_channel.push_file(**map_data) #Twitter if self.config.getboolean('TWITTER', 'ENABLE'): twitter_media_map_obj = self.tweet_api.media_upload(self.map_file_name) @@ -364,8 +364,8 @@ class Plane: if self.config.getboolean('PUSHBULLET', 'ENABLE'): with open(self.map_file_name, "rb") as pic: map_data = self.pb.upload_file(pic, "Landed IMG") - push = self.pb_channel.push_note(self.config.get('PUSHBULLET', 'TITLE'), self.landed_message) - push = self.pb_channel.push_file(**map_data) + self.pb_channel.push_note(self.config.get('PUSHBULLET', 'TITLE'), self.landed_message) + self.pb_channel.push_file(**map_data) #Twitter if self.config.getboolean('TWITTER', 'ENABLE'): twitter_media_map_obj = self.tweet_api.media_upload(self.map_file_name) From 1b37f41408f39e117c4e9efd98b2f152cdaf6c16 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Fri, 11 Dec 2020 14:44:18 +0000 Subject: [PATCH 118/124] Cleanup ADBSX Map --- defSS.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/defSS.py b/defSS.py index a3f53ca..fba9263 100644 --- a/defSS.py +++ b/defSS.py @@ -10,6 +10,7 @@ from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager import time from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.common.by import By def getSS(icao): chrome_options = webdriver.ChromeOptions() chrome_options.headless = True @@ -21,8 +22,19 @@ def getSS(icao): url = "https://globe.adsbexchange.com/?largeMode=2&hideButtons&hideSidebar&mapDim=0&zoom=9&icao=" + icao browser.set_page_load_timeout(80) browser.get(url) - WebDriverWait(browser, 30).until(lambda d: d.execute_script("return jQuery.active == 0")) + WebDriverWait(browser, 40).until(lambda d: d.execute_script("return jQuery.active == 0")) time.sleep(5) + remove_elements = ["show_trace", "credits", 'infoblock_close', 'selected_photo_link', "history_collapse"] + for element in remove_elements: + element = browser.find_element_by_id(element) + browser.execute_script("""var element = arguments[0]; element.parentNode.removeChild(element); """, element) + #Remove watermark on data + browser.execute_script("document.getElementById('selected_infoblock').className = 'none';") + #Disable slidebar + browser.execute_script("$('#infoblock-container').css('overflow', 'hidden');") + #Remove share + element = browser.find_element_by_xpath("//*[contains(text(), 'Share')]") + browser.execute_script("""var element = arguments[0]; element.parentNode.removeChild(element); """, element) file_name = icao + "_map.png" browser.save_screenshot(file_name) browser.quit() \ No newline at end of file From 4c279f55cd2467644914e8ad196d1fa37af9bcd7 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Fri, 11 Dec 2020 14:45:03 +0000 Subject: [PATCH 119/124] Remove bad exception --- defADSBX.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/defADSBX.py b/defADSBX.py index b23d252..4cb80eb 100644 --- a/defADSBX.py +++ b/defADSBX.py @@ -25,7 +25,7 @@ def pullADSBX(planes): print(error_message) failed = True data = None - except (urllib3.exceptions.RemoteDisconected, IncompleteRead, http.IncompleteRead, ConnectionResetError, requests.ChunkEncodingError, urllib3.exceptions.ProtocolError, ValueError) as error_message: + except (IncompleteRead, http.IncompleteRead, ConnectionResetError, requests.ChunkEncodingError, urllib3.exceptions.ProtocolError, ValueError) as error_message: print("Connection Error") print(error_message) failed = True From 81457015515cf19754aa8d5aba5a2a6b9f28a8f7 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Fri, 11 Dec 2020 17:34:22 +0000 Subject: [PATCH 120/124] Spacing? --- AppendAirport.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/AppendAirport.py b/AppendAirport.py index 8f9fa71..df03e4b 100644 --- a/AppendAirport.py +++ b/AppendAirport.py @@ -21,12 +21,9 @@ def append_airport(filename, icao, airport, distance_mi): distance_km = distance_mi * 1.609 # create Image object with the input image - image = Image.open(filename) - # initialise the drawing context with # the image object as background - draw = ImageDraw.Draw(image) #Setup fonts @@ -61,6 +58,5 @@ def append_airport(filename, icao, airport, distance_mi): (x, y) = (320, 783) text = airport[0:56] draw.text((x, y), text, fill=black, font=mini_font) - # save the edited image image.save(filename) \ No newline at end of file From 7a4dda89f368bfeb58104b92a5eafdd8a809c993 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Fri, 18 Dec 2020 01:02:34 +0000 Subject: [PATCH 121/124] V1 API Notice --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 74d2179..19fc246 100644 --- a/README.md +++ b/README.md @@ -102,6 +102,7 @@ cd plane-notify ### Configure main config file with keys and URLs (mainconf.ini) in configs directory - edit them with nano or vi on the running machine or on your pc and transfer the config to where you will be running the bot +- ADSBX is only setup for V1 API access, a V2 key will not work, I don't have a V2 key their for I can't make it compatible. ### Configure individual planes From e1a50010f7a13f2a2ece12e4c78ac2cb3f214769 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Sat, 19 Dec 2020 22:20:37 +0000 Subject: [PATCH 122/124] -Added tar1090 overlay option per plane. -Added Discord notifcation of failover(required rn). -Improved config parsing, subfolder support, disabled folder to ignore, plane configs parsed only once. -Unified divider length, 100 -Parsing ADSBX and OpenSky are seperate functions also run empty function. -Made some self variables local, they where unnecessarily self. -Remove recheck data, uneeded since timeout to landing was added. -Cleaned up Reverse Geocoder error handling, uses less variables. --- NotifyBotMulti.py | 45 ++-- configs/mainconf.ini | 8 +- configs/plane1.ini | 2 + defSS.py | 4 +- planeClass.py | 617 ++++++++++++++++++++----------------------- 5 files changed, 332 insertions(+), 344 deletions(-) diff --git a/NotifyBotMulti.py b/NotifyBotMulti.py index 04f39db..836dd69 100644 --- a/NotifyBotMulti.py +++ b/NotifyBotMulti.py @@ -19,11 +19,15 @@ import os import sys #Setup plane objects from plane configs planes = {} -for filename in os.listdir("./configs"): - if filename.endswith(".ini") and filename != "mainconf.ini": - plane_config = configparser.ConfigParser() - plane_config.read(("./configs/" + filename)) - planes[plane_config.get('DATA', 'ICAO').upper()] = Plane(plane_config.get('DATA', 'ICAO'), filename) +print("Found the following configs") +for dirpath, dirname, filename in os.walk("./configs"): + for filename in [f for f in filename if f.endswith(".ini") and f != "mainconf.ini"]: + if not "disabled" in dirpath: + print(os.path.join(dirpath, filename)) + plane_config = configparser.ConfigParser() + plane_config.read((os.path.join(dirpath, filename))) + #Creates a Key labeled the ICAO of the plane, with the value being a plane object + planes[plane_config.get('DATA', 'ICAO').upper()] = Plane(plane_config.get('DATA', 'ICAO'), os.path.join(dirpath, filename), plane_config) running_Count = 0 failed_count = 0 @@ -38,7 +42,8 @@ while True: running_Count = 0 running_Count +=1 start_time = time.time() - print (Back.GREEN, Fore.BLACK, "--------", running_Count, "--------", datetime_tz.strftime("%I:%M:%S %p"), "-------------------------------------------------------", Style.RESET_ALL) + header = ("-------- " + str(running_Count) + " -------- " + str(datetime_tz.strftime("%I:%M:%S %p")) + " ---------------------------------------------------------------------------") + print (Back.GREEN + Fore.BLACK + header[0:100] + Style.RESET_ALL) if source == "ADSBX": from defADSBX import pullADSBX data, failed = pullADSBX(planes) @@ -48,14 +53,14 @@ while True: has_data = False for planeData in data['ac']: if planeData['icao'] == key: - obj.run(planeData, source) + obj.run_ADSBX(planeData) has_data = True break if has_data is False: - obj.run(None, source) + obj.run_empty() else: for obj in planes.values(): - obj.run(None, source) + obj.run_empty() elif failed: failed_count += 1 elif source == "OPENS": @@ -68,22 +73,32 @@ while True: has_data = False for dataState in planeData.states: if (dataState.icao24).upper() == key: - obj.run(dataState, source) + obj.run_OPENS(dataState) has_data = True break if has_data is False: - obj.run(None, source) + obj.run_empty() else: for obj in planes.values(): - obj.run(None, source) + obj.run_empty() + elif failed: + failed_count += 1 if failed_count >= 10: - source = "OPENS" + if source == "OPENS": + source = "ADSBX" + elif source == "ADSBX": + source = "OPENS" + failed_count = 0 + from discord_webhook import DiscordWebhook + webhook = DiscordWebhook(url= main_config.get('DISCORD', 'URL'), content=(str("Failed over to " + source))) + webhook.execute() elapsed_calc_time = time.time() - start_time datetime_tz = datetime.now(tz) - print (Back.GREEN, Fore.BLACK, "--------", running_Count, "--------", datetime_tz.strftime("%I:%M:%S %p"), "------------------------Elapsed Time-", elapsed_calc_time, " -------------------------------------", Style.RESET_ALL) + footer = "-------- " + str(running_Count) + " -------- " + str(datetime_tz.strftime("%I:%M:%S %p")) + " ------------------------Elapsed Time- " + str(round(elapsed_calc_time, 3)) + " -------------------------------------" + print (Back.GREEN + Fore.BLACK + footer[0:100] + Style.RESET_ALL) - sleep_sec = 5 + sleep_sec = 15 for i in range(sleep_sec,0,-1): if i < 10: i = " " + str(i) diff --git a/configs/mainconf.ini b/configs/mainconf.ini index f2ad476..6c838f5 100644 --- a/configs/mainconf.ini +++ b/configs/mainconf.ini @@ -3,7 +3,7 @@ #SHOULD BE ADSBX which is ADS-B Exchange or OPENS which is OpenSky #By default configured with OpenSky which anyone can use without a login #ADS-B Exchange has better data but is not avalible unless you feed their network or pay. -SOURCE = ADSBX +SOURCE = OPENS #Timezone if you want your own time to show in the console, if invalid will be set to UTC. #List of TZs names https://en.wikipedia.org/wiki/List_of_tz_database_time_zones @@ -11,7 +11,7 @@ TZ = UTC #ADS-B Exchange https://www.adsbexchange.com/data/ [ADSBX] -API_KEY = apikey +API_KEY = ***REMOVED*** #OpenSky https://opensky-network.org/apidoc/index.html #When using without your own login user and pass should be None @@ -23,3 +23,7 @@ PASSWORD = None #API KEY for Google Static Maps only if you using this on any of the planes. API_KEY = googleapikey +#Used for failover messages +[DISCORD] +URL = ***REMOVED*** + diff --git a/configs/plane1.ini b/configs/plane1.ini index e561648..d27e270 100644 --- a/configs/plane1.ini +++ b/configs/plane1.ini @@ -6,6 +6,8 @@ ICAO = icaohere #Map to create from Google Static Maps or screenshot global tar1090 from globe.adsbexchange.com #Enter GOOGLESTATICMAP or ADSBX OPTION = ADSBX +#Tar1090 overlays option, should be seperated by comma no space, remove option all together to disable any +OVERLAYS = nexrad [AIRPORT] #Requires a list of airport types, this plane could land/takeoff at diff --git a/defSS.py b/defSS.py index fba9263..296ef20 100644 --- a/defSS.py +++ b/defSS.py @@ -11,7 +11,7 @@ from webdriver_manager.chrome import ChromeDriverManager import time from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By -def getSS(icao): +def getSS(icao, overlays): chrome_options = webdriver.ChromeOptions() chrome_options.headless = True chrome_options.add_argument('window-size=800,800') @@ -19,7 +19,7 @@ def getSS(icao): chrome_options.add_argument("--enable-logging --v=1") #chrome_options.add_argument('--no-sandbox') # required when running as root user. otherwise you would get no sandbox errors. browser = webdriver.Chrome(ChromeDriverManager().install(), options=chrome_options) - url = "https://globe.adsbexchange.com/?largeMode=2&hideButtons&hideSidebar&mapDim=0&zoom=9&icao=" + icao + url = "https://globe.adsbexchange.com/?largeMode=2&hideButtons&hideSidebar&mapDim=0&zoom=9&icao=" + icao + "&" + overlays browser.set_page_load_timeout(80) browser.get(url) WebDriverWait(browser, 40).until(lambda d: d.execute_script("return jQuery.active == 0")) diff --git a/planeClass.py b/planeClass.py index 318b764..0ddd7de 100644 --- a/planeClass.py +++ b/planeClass.py @@ -1,16 +1,17 @@ class Plane: - def __init__(self, icao, conf_file): + def __init__(self, icao, config_path, config): """Initializes a plane object from its config file and given icao.""" self.icao = icao.upper() - self.conf_file = conf_file + self.config = config + self.conf_file_path = config_path self.geo_alt_ft = None self.last_geo_alt_ft = None + self.below_desired_ft = None self.last_below_desired_ft = None self.feeding = None self.last_feeding = None self.last_on_ground = None self.on_ground = None - self.invalid_Location = None self.longitude = None self.latitude = None self.callsign = None @@ -18,18 +19,76 @@ class Plane: self.map_file_name = icao.upper() + "_map.png" self.last_latitude = None self.last_longitude = None - self.recheck_needed = None - self.last_recheck_needed = None self.last_contact = None - self.last_feed_data = None + self.landing_plausible = False def getICAO(self): return self.icao - def run(self, ac_dict, source): + def run_OPENS(self, ac_dict): + #Parse OpenSky Vector + from colorama import Fore, Back, Style + self.printheader("head") + #print (Fore.YELLOW + "OpenSky Sourced Data: ", ac_dict) + try: + self.__dict__.update({'icao' : ac_dict.icao24.upper(), 'callsign' : ac_dict.callsign, 'latitude' : ac_dict.latitude, 'longitude' : ac_dict.longitude, 'on_ground' : bool(ac_dict.on_ground), 'last_contact' : ac_dict.last_contact}) + if ac_dict.geo_altitude != None: + self.geo_alt_ft = round(float(ac_dict.geo_altitude) * 3.281) + elif self.on_ground: + self.geo_alt_ft = 0 + except ValueError as e: + print("Got data but some data is invalid!") + print(e) + self.printheader("foot") + else: + self.feeding = True + self.run_check() + def run_ADSBX(self, ac_dict): + #Parse ADBSX Vector + from colorama import Fore, Back, Style + self.printheader("head") + #print (Fore.YELLOW +"ADSBX Sourced Data: ", ac_dict, Style.RESET_ALL) + try: + #postime is divided by 1000 to get seconds from milliseconds, from timestamp expects secs. + self.__dict__.update({'icao' : ac_dict['icao'], 'callsign' : ac_dict['call'], 'reg' : ac_dict['reg'], 'latitude' : float(ac_dict['lat']), 'longitude' : float(ac_dict['lon']), 'geo_alt_ft' : int(ac_dict['galt']), 'on_ground' : bool(int(ac_dict["gnd"])), 'last_contact' : round(float(ac_dict["postime"])/1000)}) + if self.on_ground: + self.geo_alt_ft = 0 + if "to" in ac_dict.keys(): + self.to_location = ac_dict["to"] + if "from" in ac_dict.keys(): + self.from_location = ac_dict["from"] + except ValueError as e: + + print("Got data but some data is invalid!") + print(e) + print (Fore.YELLOW +"ADSBX Sourced Data: ", ac_dict, Style.RESET_ALL) + self.printheader("foot") + else: + self.feeding = True + self.run_check() + def printheader(self, type): + from colorama import Fore, Back, Style + if type == "head": + header = str("--------- " + self.conf_file_path + " ---------------------------- ICAO: " + self.icao + " ---------------------------------------") + elif type == "foot": + header = "----------------------------------------------------------------------------------------------------" + print(Back.MAGENTA + header[0:100] + Style.RESET_ALL) + + def get_time_since(self, last_contact): + from datetime import datetime + if last_contact != None: + last_contact_dt = datetime.fromtimestamp(last_contact) + time_since_contact = datetime.now() - last_contact_dt + else: + time_since_contact = None + return time_since_contact + def run_empty(self): + self.printheader("head") + self.feeding = False + self.run_check() + def run_check(self): """Runs a check of a plane module to see if its landed or takenoff using plane data, and takes action if so.""" #Import Modules #Clear Terminal #print("\033[H\033[J") - #Ability to Remove old Map import os #Setup Geopy @@ -37,11 +96,6 @@ class Plane: geolocator = Nominatim(user_agent="NotifyBot", timeout=5) import time from colorama import Fore, Back, Style - #Setup Config File - import configparser - self.config = configparser.ConfigParser() - self.config.read(("./configs/"+ self.conf_file)) - #Platform for determining OS for strftime import platform from datetime import datetime @@ -52,9 +106,12 @@ class Plane: from defMap import getMap elif self.config.get('MAP', 'OPTION') == "ADSBX": from defSS import getSS + if self.config.has_option('MAP', 'OVERLAYS'): + self.overlays = self.config.get('MAP', 'OVERLAYS') + else: + self.overlays = "" else: raise Exception("Map option not set correctly in this planes conf") - if self.config.getboolean('DISCORD', 'ENABLE'): from defDiscord import sendDis #Setup Tweepy @@ -67,335 +124,245 @@ class Plane: self.pb = Pushbullet(self.config['PUSHBULLET']['API_KEY']) self.pb_channel = self.pb.get_channel(self.config.get('PUSHBULLET', 'CHANNEL_TAG')) - print (Back.MAGENTA, "---------", self.conf_file, "---------------------------- ICAO:", self.icao, "--------------------------", Style.RESET_ALL) - #Reset Variables - self.below_desired_ft = None - self.geo_alt_ft = None - self.longitude = None - self.latitude = None - self.on_ground = None - self.has_location = None - time_since_contact = None - #Parse OpenSky Vector - if source == "OPENS": - self.val_error = False - if ac_dict != None: - #print (Fore.YELLOW + "OpenSky Sourced Data: ", ac_dict) - try: - self.__dict__.update({'icao' : ac_dict.icao24.upper(), 'callsign' : ac_dict.callsign, 'latitude' : ac_dict.latitude, 'longitude' : ac_dict.longitude, 'on_ground' : bool(ac_dict.on_ground), 'last_contact' : ac_dict.last_contact}) - if ac_dict.geo_altitude != None: - self.geo_alt_ft = round(float(ac_dict.geo_altitude) * 3.281) - elif self.on_ground: - self.geo_alt_ft = 0 - except ValueError as e: - self.val_error = True - print("Got data but some data is invalid!") - print(e) + if self.feeding == False: + time_since_contact = self.get_time_since(self.last_contact) + output = [ + [(Fore.CYAN + "ICAO" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.icao + Style.RESET_ALL)], + [(Fore.CYAN + "Last Contact" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(time_since_contact) + Style.RESET_ALL)] if time_since_contact != None else None + ] + output = list(filter(None, output)) + print(tabulate(output, [], 'fancy_grid')) + print("No Data") + elif self.feeding == True: + time_since_contact = self.get_time_since(self.last_contact) + output = [ + [(Fore.CYAN + "ICAO" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.icao + Style.RESET_ALL)], + [(Fore.CYAN + "Callsign" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.callsign + Style.RESET_ALL)], + [(Fore.CYAN + "Reg" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.reg + Style.RESET_ALL)] if "reg" in self.__dict__ else None, + [(Fore.CYAN + "From" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.from_location + Style.RESET_ALL)] if "from_location" in self.__dict__ else None, + [(Fore.CYAN + "To" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.to_location + Style.RESET_ALL)] if "to_location" in self.__dict__ else None, + [(Fore.CYAN + "Latitude" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(self.latitude) + Style.RESET_ALL)], + [(Fore.CYAN + "Longitude" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(self.longitude) + Style.RESET_ALL)], + [(Fore.CYAN + "Last Contact" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(time_since_contact).split(".")[0]+ Style.RESET_ALL)], + [(Fore.CYAN + "On Ground" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(self.on_ground) + Style.RESET_ALL)], + [(Fore.CYAN + "GEO Alitude" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str("{:,} ft".format(self.geo_alt_ft)) + Style.RESET_ALL)] + ] + output = list(filter(None, output)) + print(tabulate(output, [], 'fancy_grid')) - #Parse ADBSX Vector - elif source == "ADSBX": - self.val_error = False - if ac_dict != None: - #print (Fore.YELLOW +"ADSBX Sourced Data: ", ac_dict, Style.RESET_ALL) - try: - #postime is divided by 1000 to get seconds from milliseconds, from timestamp expects secs. - self.__dict__.update({'icao' : ac_dict['icao'], 'callsign' : ac_dict['call'], 'reg' : ac_dict['reg'], 'latitude' : float(ac_dict['lat']), 'longitude' : float(ac_dict['lon']), 'geo_alt_ft' : int(ac_dict['galt']), 'on_ground' : bool(int(ac_dict["gnd"])), 'last_contact' : round(float(ac_dict["postime"])/1000)}) - if self.on_ground: - self.geo_alt_ft = 0 - if "to" in ac_dict.keys(): - self.to_location = ac_dict["to"] - if "from" in ac_dict.keys(): - self.from_location = ac_dict["from"] - except ValueError as e: - self.val_error = True - print("Got data but some data is invalid!") - print(e) - - #print (Fore.CYAN + "ICAO:", self.icao + Style.RESET_ALL) - #Print out data, and convert to locals - if self.val_error is False: - if self.last_contact != None: - last_contact_dt = datetime.fromtimestamp(self.last_contact) - time_since_contact = datetime.now() - last_contact_dt +#Check if below desire ft + desired_ft = 10000 + if self.geo_alt_ft is None or self.geo_alt_ft > desired_ft: + self.below_desired_ft = False + elif self.geo_alt_ft < desired_ft: + self.below_desired_ft = True +#Check if tookoff + if self.below_desired_ft and self.on_ground is False: + if self.last_on_ground: + self.tookoff = True + self.trigger_type = "no longer on ground" + self.tookoff_header = "Took off from " + elif self.last_feeding is False and self.feeding and self.landing_plausible == False: + self.tookoff = True + self.trigger_type = "data acquisition" + self.tookoff_header = "Took off near " else: - time_since_contact = None - if ac_dict == None: - self.feeding = False - output = [ - [(Fore.CYAN + "ICAO" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.icao + Style.RESET_ALL)], - [(Fore.CYAN + "Last Contact" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(time_since_contact) + Style.RESET_ALL)] if time_since_contact != None else None - ] - output = list(filter(None, output)) - print(tabulate(output, [], 'fancy_grid')) - print("No Data") - elif ac_dict != None: - self.feeding = True - output = [ - [(Fore.CYAN + "ICAO" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.icao + Style.RESET_ALL)], - [(Fore.CYAN + "Callsign" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.callsign + Style.RESET_ALL)], - [(Fore.CYAN + "Reg" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.reg + Style.RESET_ALL)] if "reg" in self.__dict__ else None, - [(Fore.CYAN + "From" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.from_location + Style.RESET_ALL)] if "from_location" in self.__dict__ else None, - [(Fore.CYAN + "To" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.to_location + Style.RESET_ALL)] if "to_location" in self.__dict__ else None, - [(Fore.CYAN + "Latitude" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(self.latitude) + Style.RESET_ALL)], - [(Fore.CYAN + "Longitude" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(self.longitude) + Style.RESET_ALL)], - [(Fore.CYAN + "Last Contact" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(time_since_contact) + Style.RESET_ALL)], - [(Fore.CYAN + "On Ground" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(self.on_ground) + Style.RESET_ALL)], - [(Fore.CYAN + "GEO Alitude Ft" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(self.geo_alt_ft) + Style.RESET_ALL)] - ] - output = list(filter(None, output)) - print(tabulate(output, [], 'fancy_grid')) - #Set Check for inconsistancy in data - if not self.last_recheck_needed: - #Recheck needed if feeding state changes - if self.feeding == False and self.last_feeding: - self.recheck_needed = True - print("Recheck needed, feeding status changed") + self.tookoff = False + else: + self.tookoff = False + + #self.tookoff = bool(self.below_desired_ft and self.on_ground is False and ((self.last_feeding is False and self.feeding) or (self.last_on_ground))) + #print ("Tookoff Just Now:", self.tookoff) + + +#Check if Landed + if self.on_ground and self.last_on_ground is False and self.last_below_desired_ft: + self.landed = True + self.trigger_type = "now on ground" + self.landed_header = "Landed in " + self.landing_plausible = False + #Set status for landing plausible + elif self.last_below_desired_ft and self.last_feeding and self.feeding is False and self.last_on_ground is False: + print("Near landing conditions, if contiuned data loss for 5 mins, landing true") + self.landing_plausible = True + + elif self.landing_plausible and self.feeding is False and time_since_contact.seconds >= 300: + self.landing_plausible = False + self.landed = True + self.trigger_type = "data loss" + self.landed_header = "Landed near " + else: + self.landed = False + + #self.landed = bool(self.last_below_desired_ft and ((self.last_feeding and self.feeding is False and self.last_on_ground is False) or (self.on_ground and self.last_on_ground is False))) + #print ("Landed Just Now:", self.landed) + if self.landed: + print ("Landed by", self.trigger_type) + if self.tookoff: + print("Tookoff by", self.trigger_type) +#Lookup Location of coordinates + if self.landed or self.tookoff: + if self.trigger_type == "now on ground" or "data acquisition" and self.longitude != None and self.latitude != None: + combined = f"{self.latitude} , {self.longitude}" + nearest_airport_dict = getClosestAirport(self.latitude, self.longitude, self.config.get("AIRPORT", "TYPES")) + has_coords = True + elif self.trigger_type == "data loss" or "no longer on ground" and self.last_longitude != None and self.last_latitude != None: + combined = f"{self.last_latitude}, {self.last_longitude}" + nearest_airport_dict = getClosestAirport(self.last_latitude, self.last_longitude, self.config.get("AIRPORT", "TYPES")) + has_coords = True + else: + print (Fore.RED + 'No Location, No coordinates') + invalid_Location = True + print(Style.RESET_ALL) + if has_coords: + try: + location = geolocator.reverse(combined) + except BaseException: + print ("Geopy API Error") else: - self.recheck_needed = False - elif self.last_recheck_needed: - self.recheck_needed = False - - - #Run a Check compares new data to last flagged(check) data - if self.last_recheck_needed: - if self.recheck_feeding == self.feeding: - print("Data Feeding change consistent") - elif self.recheck_feeding != self.feeding: - print("Data Feeding change was inconsistent last data ignored") - - self.recheck_feeding = self.feeding - self.last_recheck_needed = self.recheck_needed - - if self.recheck_needed is False: - - #Check if below desire ft - if self.geo_alt_ft is None: - self.below_desired_ft = False - elif self.geo_alt_ft < 10000: - self.below_desired_ft = True - #Check if tookoff - if self.below_desired_ft and self.on_ground is False: - if self.last_on_ground: - self.tookoff = True - self.trigger_type = "no longer on ground" - self.tookoff_header = "Took off from " - elif self.last_feeding is False and self.feeding and self.last_feed_data == None: - self.tookoff = True - self.trigger_type = "data acquisition" - self.tookoff_header = "Took off near " - else: - self.tookoff = False - else: - self.tookoff = False - - #self.tookoff = bool(self.below_desired_ft and self.on_ground is False and ((self.last_feeding is False and self.feeding) or (self.last_on_ground))) - #print ("Tookoff Just Now:", self.tookoff) - - - #Check if Landed - if self.on_ground and self.last_on_ground is False and self.last_below_desired_ft: - self.landed = True - self.trigger_type = "now on ground" - self.landed_header = "Landed in " - self.last_feed_data = None - #Store a dictionary when data is lost near landing conditions, - elif self.last_below_desired_ft and self.last_feeding and self.feeding is False and self.last_on_ground is False: - self.last_feed_data = {} - self.last_feed_data.update(self.__dict__) - print("Latest data stored") - - elif self.last_feed_data != None and self.feeding is False and time_since_contact.seconds >= 300: - self.__dict__.update(self.last_feed_data) - self.last_feed_data = None - self.landed = True - self.trigger_type = "data loss" - self.landed_header = "Landed near " - else: - self.landed = False - - #self.landed = bool(self.last_below_desired_ft and ((self.last_feeding and self.feeding is False and self.last_on_ground is False) or (self.on_ground and self.last_on_ground is False))) - #print ("Landed Just Now:", self.landed) - if self.landed: - print ("Landed by", self.trigger_type) - if self.tookoff: - print("Tookoff by", self.trigger_type) - #Lookup Location of coordinates - if self.landed or self.tookoff: - if self.trigger_type == "now on ground" or "data acquisition" and self.longitude != None and self.latitude != None: - self.combined = f"{self.latitude} , {self.longitude}" - nearest_airport_dict = getClosestAirport(self.latitude, self.longitude, self.config.get("AIRPORT", "TYPES")) - self.has_coords = True - elif self.trigger_type == "data loss" or "no longer on ground" and self.last_longitude != None and self.last_latitude != None: - self.combined = f"{self.last_latitude}, {self.last_longitude}" - nearest_airport_dict = getClosestAirport(self.last_latitude, self.last_longitude, self.config.get("AIRPORT", "TYPES")) - self.has_coords = True - else: - print (Fore.RED + 'No Location') - self.has_location = False - self.invalid_Location = True - self.has_coords = False - print(Style.RESET_ALL) - if self.has_coords: - try: - self.location = geolocator.reverse(self.combined) - except BaseException: - print ("Geopy API Error") - else: - # print (Fore.YELLOW, "Geopy debug: ", location.raw, Style.RESET_ALL) - self.has_location = True - - - - - #Figure if valid location, valid being geopy finds a location - if self.has_location: + # print (Fore.YELLOW, "Geopy debug: ", location.raw, Style.RESET_ALL) + #Checking for invalid location, where GeoPy doesn't find coordinates info try: - self.geoError = self.location.raw['error'] + geoError = location.raw['error'] except KeyError: - self.invalid_Location = False - self.geoError = None - else: - self.invalid_Location = True - - print ("Invalid Location: ", self.invalid_Location) - - if self.invalid_Location: - print (Fore.RED) - print (self.geoError) - print ("Likely Over Water or Invalid Location") - print(Style.RESET_ALL) - - - #Convert Full address to sep variables only if Valid Location - elif self.invalid_Location is False: - self.address = self.location.raw['address'] - self.country = self.address.get('country', '') - self.country_code = self.address.get('country_code', '').upper() - self.state = self.address.get('state', '') - self.county = self.address.get('county', '') - self.city = self.address.get('city', '') - self.town = self.address.get('town', '') - self.hamlet = self.address.get('hamlet', '') + invalid_Location = False + #Convert Full address to sep variables only if Valid Location + address = location.raw['address'] + country = address.get('country', '') + country_code = address.get('country_code', '').upper() + state = address.get('state', '') + county = address.get('county', '') + city = address.get('city', '') + town = address.get('town', '') + hamlet = address.get('hamlet', '') # print (Fore.YELLOW) # print ("Address Fields debug: ", self.address) # print(Style.RESET_ALL) print (Fore.GREEN) - print("Entire Address: ", self.location.address) - print ("Country Code: ", self.country_code) - print ("Country: ", self.country) - print ("State: ", self.state) - print ("City: ", self.city) - print ("Town: ", self.town) - print ("Hamlet: ", self.hamlet) - print ("County: ", self.county) + print("Entire Address: ", location.address) + print ("Country Code: ", country_code) + print ("Country: ", country) + print ("State: ", state) + print ("City: ", city) + print ("Town: ", town) + print ("Hamlet: ", hamlet) + print ("County: ", county) print(Style.RESET_ALL) - #Chose city town county or hamlet for location as not all are always avalible. - if self.invalid_Location is False: - self.aera_hierarchy = self.city or self.town or self.county or self.hamlet - #Set Discord Title - if self.config.getboolean('DISCORD', 'ENABLE'): - self.dis_title = self.icao if self.config.get('DISCORD', 'TITLE') == "icao" else self.callsign if self.config.get('DISCORD', 'TITLE') == "callsign" else self.config.get('DISCORD', 'TITLE') - #Set Twitter Title - if self.config.getboolean('TWITTER', 'ENABLE'): - self.twitter_title = self.icao if self.config.get('TWITTER', 'TITLE') == "icao" else self.callsign if self.config.get('TWITTER', 'TITLE') == "callsign" else self.config.get('TWITTER', 'TITLE') - #Takeoff Notifcation and Landed - if self.tookoff: - if self.invalid_Location is False: - self.tookoff_message = (self.tookoff_header + self.aera_hierarchy + ", " + self.state + ", " + self.country_code + ". ") + #Chose city town county or hamlet for location as not all are always avalible. + aera_hierarchy = city or town or county or hamlet else: - self.tookoff_message = ("Took off") - print (self.tookoff_message) - #Google Map or tar1090 screenshot - if self.config.get('MAP', 'OPTION') == "GOOGLESTATICMAP": - getMap((self.aera_hierarchy + ", " + self.state + ", " + self.country_code), self.icao) - elif self.config.get('MAP', 'OPTION') == "ADSBX": - getSS(self.icao) - append_airport(self.map_file_name, nearest_airport_dict['icao'], nearest_airport_dict['name'], nearest_airport_dict['distance']) - else: - raise Exception("Map option not set correctly in this planes conf") - #Discord - if self.config.getboolean('DISCORD', 'ENABLE'): - self.dis_message = (self.dis_title + " " + self.tookoff_message + nearest_airport_dict['icao'] + ", " + nearest_airport_dict["name"]).strip() - sendDis(self.dis_message, self.map_file_name, self.config) - #PushBullet - if self.config.getboolean('PUSHBULLET', 'ENABLE'): - with open(self.map_file_name, "rb") as pic: - map_data = self.pb.upload_file(pic, "Tookoff IMG") - self.pb_channel.push_note(self.config.get('PUSHBULLET', 'TITLE'), self.tookoff_message) - self.pb_channel.push_file(**map_data) - #Twitter - if self.config.getboolean('TWITTER', 'ENABLE'): - twitter_media_map_obj = self.tweet_api.media_upload(self.map_file_name) - alt_text = "Call: " + self.callsign + " On Ground: " + str(self.on_ground) + " Alt: " + str(self.geo_alt_ft) + " Last Contact: " + str(time_since_contact) + " Trigger: " + self.trigger_type - self.tweet_api.create_media_metadata(media_id= twitter_media_map_obj.media_id, alt_text= alt_text) - self.tweet_api.update_status(status = ((self.twitter_title + " " + self.tookoff_message).strip()), media_ids=[twitter_media_map_obj.media_id]) - #self.tweet_api.update_with_media(self.map_file_name, status = (self.twitter_title + " " + self.tookoff_message).strip()) - self.takeoff_time = time.time() - os.remove(self.map_file_name) + invalid_Location = True + print (Fore.RED) + print (geoError) + print ("Invalid Location, Likely Over Water ") + print(Style.RESET_ALL) + + #Set Discord Title + if self.config.getboolean('DISCORD', 'ENABLE'): + self.dis_title = self.icao if self.config.get('DISCORD', 'TITLE') == "icao" else self.callsign if self.config.get('DISCORD', 'TITLE') == "callsign" else self.config.get('DISCORD', 'TITLE') + #Set Twitter Title + if self.config.getboolean('TWITTER', 'ENABLE'): + self.twitter_title = self.icao if self.config.get('TWITTER', 'TITLE') == "icao" else self.callsign if self.config.get('TWITTER', 'TITLE') == "callsign" else self.config.get('TWITTER', 'TITLE') + #Takeoff Notifcation and Landed + if self.tookoff: + if invalid_Location is False: + tookoff_message = (self.tookoff_header + aera_hierarchy + ", " + state + ", " + country_code + ". ") + else: + tookoff_message = ("Took off") + print (tookoff_message) + #Google Map or tar1090 screenshot + if self.config.get('MAP', 'OPTION') == "GOOGLESTATICMAP": + getMap((aera_hierarchy + ", " + state + ", " + country_code), self.icao) + elif self.config.get('MAP', 'OPTION') == "ADSBX": + getSS(self.icao, self.overlays) + if nearest_airport_dict != None: + append_airport(self.map_file_name, nearest_airport_dict['icao'], nearest_airport_dict['name'], nearest_airport_dict['distance']) + airport_string = nearest_airport_dict['icao'] + ", " + nearest_airport_dict["name"] + else: + airport_string = "" + else: + raise Exception("Map option not set correctly in this planes conf") + #Discord + if self.config.getboolean('DISCORD', 'ENABLE'): + dis_message = (self.dis_title + " " + tookoff_message + airport_string).strip() + sendDis(dis_message, self.map_file_name, self.config) + #PushBullet + if self.config.getboolean('PUSHBULLET', 'ENABLE'): + with open(self.map_file_name, "rb") as pic: + map_data = self.pb.upload_file(pic, "Tookoff IMG") + self.pb_channel.push_note(self.config.get('PUSHBULLET', 'TITLE'), tookoff_message) + self.pb_channel.push_file(**map_data) + #Twitter + if self.config.getboolean('TWITTER', 'ENABLE'): + twitter_media_map_obj = self.tweet_api.media_upload(self.map_file_name) + alt_text = "Call: " + self.callsign + " On Ground: " + str(self.on_ground) + " Alt: " + str(self.geo_alt_ft) + " Last Contact: " + str(time_since_contact) + " Trigger: " + self.trigger_type + self.tweet_api.create_media_metadata(media_id= twitter_media_map_obj.media_id, alt_text= alt_text) + self.tweet_api.update_status(status = ((self.twitter_title + " " + tookoff_message).strip()), media_ids=[twitter_media_map_obj.media_id]) + #self.tweet_api.update_with_media(self.map_file_name, status = (self.twitter_title + " " + tookoff_message).strip()) + self.takeoff_time = time.time() + os.remove(self.map_file_name) - if self.landed: - self.landed_time_msg = "" - if self.takeoff_time != None: - self.landed_time = time.time() - self.takeoff_time - if platform.system() == "Linux": - self.landed_time_msg = time.strftime("Apx. flt. time %-H Hours : %-M Mins. ", time.gmtime(self.landed_time)) - elif platform.system() == "Windows": - self.landed_time_msg = time.strftime("Apx. flt. time %#H Hours : %#M Mins. ", time.gmtime(self.landed_time)) - if self.invalid_Location is False: - self.landed_message = (self.landed_header + self.aera_hierarchy + ", " + self.state + ", " + self.country_code + ". " + self.landed_time_msg) - else: - self.landed_message = ("Landed", self.landed_time_msg) - print (self.landed_message) - #Google Map or tar1090 screenshot - if self.config.get('MAP', 'OPTION') == "GOOGLESTATICMAP": - getMap((self.aera_hierarchy + ", " + self.state + ", " + self.country_code), self.icao) - elif self.config.get('MAP', 'OPTION') == "ADSBX": - getSS(self.icao) - append_airport(self.map_file_name, nearest_airport_dict['icao'], nearest_airport_dict['name'], nearest_airport_dict['distance']) + if self.landed: + self.landed_time_msg = "" + if self.takeoff_time != None: + self.landed_time = time.time() - self.takeoff_time + if platform.system() == "Linux": + self.landed_time_msg = time.strftime("Apx. flt. time %-H Hours : %-M Mins. ", time.gmtime(self.landed_time)) + elif platform.system() == "Windows": + self.landed_time_msg = time.strftime("Apx. flt. time %#H Hours : %#M Mins. ", time.gmtime(self.landed_time)) + if invalid_Location is False: + landed_message = (self.landed_header + aera_hierarchy + ", " + state + ", " + country_code + ". " + self.landed_time_msg) + else: + landed_message = ("Landed" + ", " + self.landed_time_msg) + print (landed_message) + #Google Map or tar1090 screenshot + if self.config.get('MAP', 'OPTION') == "GOOGLESTATICMAP": + getMap((aera_hierarchy + ", " + state + ", " + country_code), self.icao) + elif self.config.get('MAP', 'OPTION') == "ADSBX": + getSS(self.icao, self.overlays) + if nearest_airport_dict != None: + append_airport(self.map_file_name, nearest_airport_dict['icao'], nearest_airport_dict['name'], nearest_airport_dict['distance']) + airport_string = nearest_airport_dict['icao'] + ", " + nearest_airport_dict["name"] + else: + airport_string = "" - else: - raise Exception("Map option not set correctly in this planes conf") - #Discord - if self.config.getboolean('DISCORD', 'ENABLE'): - self.dis_message = (self.dis_title + " " +self.landed_message + nearest_airport_dict['icao'] + ", " + nearest_airport_dict["name"]).strip() - sendDis(self.dis_message, self.map_file_name, self.config) - #PushBullet - if self.config.getboolean('PUSHBULLET', 'ENABLE'): - with open(self.map_file_name, "rb") as pic: - map_data = self.pb.upload_file(pic, "Landed IMG") - self.pb_channel.push_note(self.config.get('PUSHBULLET', 'TITLE'), self.landed_message) - self.pb_channel.push_file(**map_data) - #Twitter - if self.config.getboolean('TWITTER', 'ENABLE'): - twitter_media_map_obj = self.tweet_api.media_upload(self.map_file_name) - alt_text = "Call: " + self.callsign + " On Ground: " + str(self.on_ground) + " Alt: " + str(self.geo_alt_ft) + " Last Contact: " + str(time_since_contact) + " Trigger: " + self.trigger_type - self.tweet_api.create_media_metadata(media_id= twitter_media_map_obj.media_id, alt_text= alt_text) - self.tweet_api.update_status(status = ((self.twitter_title + " " + self.landed_message).strip()), media_ids=[twitter_media_map_obj.media_id]) - #self.tweet_api.update_with_media(self.map_file_name, status = (self.twitter_title + " " + self.landed_message).strip()) - self.takeoff_time = None - self.landed_time = None - self.time_since_tk = None - os.remove(self.map_file_name) - self.last_contact = None + else: + raise Exception("Map option not set correctly in this planes conf") + #Discord + if self.config.getboolean('DISCORD', 'ENABLE'): + dis_message = (self.dis_title + " " + landed_message + " " + airport_string).strip() + sendDis(dis_message, self.map_file_name, self.config) + #PushBullet + if self.config.getboolean('PUSHBULLET', 'ENABLE'): + with open(self.map_file_name, "rb") as pic: + map_data = self.pb.upload_file(pic, "Landed IMG") + self.pb_channel.push_note(self.config.get('PUSHBULLET', 'TITLE'), landed_message) + self.pb_channel.push_file(**map_data) + #Twitter + if self.config.getboolean('TWITTER', 'ENABLE'): + twitter_media_map_obj = self.tweet_api.media_upload(self.map_file_name) + alt_text = "Call: " + self.callsign + " On Ground: " + str(self.on_ground) + " Alt: " + str(self.geo_alt_ft) + " Last Contact: " + str(time_since_contact) + " Trigger: " + self.trigger_type + self.tweet_api.create_media_metadata(media_id= twitter_media_map_obj.media_id, alt_text= alt_text) + self.tweet_api.update_status(status = ((self.twitter_title + " " + landed_message).strip()), media_ids=[twitter_media_map_obj.media_id]) + #self.tweet_api.update_with_media(self.map_file_name, status = (self.twitter_title + " " + landed_message).strip()) + self.takeoff_time = None + self.landed_time = None + self.time_since_tk = None + os.remove(self.map_file_name) + self.last_contact = None - #Set Variables to compare to next check - self.last_feeding = self.feeding - self.last_geo_alt_ft = self.geo_alt_ft - self.last_on_ground = self.on_ground - self.last_below_desired_ft = self.below_desired_ft - self.last_longitude = self.longitude - self.last_latitude = self.latitude +#Set Variables to compare to next check + self.last_feeding = self.feeding + self.last_geo_alt_ft = self.geo_alt_ft + self.last_on_ground = self.on_ground + self.last_below_desired_ft = self.below_desired_ft + self.last_longitude = self.longitude + self.last_latitude = self.latitude - elif self.val_error: - print ("Failed to Parse Will Recheck this Plane After new data") if self.takeoff_time != None: self.elapsed_time = time.time() - self.takeoff_time self.time_since_tk = time.strftime("Time Since Take off %H Hours : %M Mins : %S Secs", time.gmtime(self.elapsed_time)) print(self.time_since_tk) - - - - - print (Back.MAGENTA, "---------------------------------------------------------------------------", Style.RESET_ALL) + self.printheader("foot") \ No newline at end of file From 849a71732fe3d21514d7ce4d1b2154a193ac2185 Mon Sep 17 00:00:00 2001 From: Jack Sweeney Date: Sat, 19 Dec 2020 22:20:37 +0000 Subject: [PATCH 123/124] -Many changes, overlays, cleanup, more config.... -Added tar1090 overlay option per plane. -Added Discord notifcation of failover(required rn). -Improved config parsing, subfolder support, disabled folder to ignore, plane configs parsed only once. -Unified divider length, 100 -Parsing ADSBX and OpenSky are seperate functions also run empty function. -Made some self variables local, they where unnecessarily self. -Remove recheck data, uneeded since timeout to landing was added. -Cleaned up Reverse Geocoder error handling, uses less variables. --- NotifyBotMulti.py | 45 ++-- configs/mainconf.ini | 8 +- configs/plane1.ini | 2 + defSS.py | 4 +- planeClass.py | 617 ++++++++++++++++++++----------------------- 5 files changed, 332 insertions(+), 344 deletions(-) diff --git a/NotifyBotMulti.py b/NotifyBotMulti.py index 04f39db..836dd69 100644 --- a/NotifyBotMulti.py +++ b/NotifyBotMulti.py @@ -19,11 +19,15 @@ import os import sys #Setup plane objects from plane configs planes = {} -for filename in os.listdir("./configs"): - if filename.endswith(".ini") and filename != "mainconf.ini": - plane_config = configparser.ConfigParser() - plane_config.read(("./configs/" + filename)) - planes[plane_config.get('DATA', 'ICAO').upper()] = Plane(plane_config.get('DATA', 'ICAO'), filename) +print("Found the following configs") +for dirpath, dirname, filename in os.walk("./configs"): + for filename in [f for f in filename if f.endswith(".ini") and f != "mainconf.ini"]: + if not "disabled" in dirpath: + print(os.path.join(dirpath, filename)) + plane_config = configparser.ConfigParser() + plane_config.read((os.path.join(dirpath, filename))) + #Creates a Key labeled the ICAO of the plane, with the value being a plane object + planes[plane_config.get('DATA', 'ICAO').upper()] = Plane(plane_config.get('DATA', 'ICAO'), os.path.join(dirpath, filename), plane_config) running_Count = 0 failed_count = 0 @@ -38,7 +42,8 @@ while True: running_Count = 0 running_Count +=1 start_time = time.time() - print (Back.GREEN, Fore.BLACK, "--------", running_Count, "--------", datetime_tz.strftime("%I:%M:%S %p"), "-------------------------------------------------------", Style.RESET_ALL) + header = ("-------- " + str(running_Count) + " -------- " + str(datetime_tz.strftime("%I:%M:%S %p")) + " ---------------------------------------------------------------------------") + print (Back.GREEN + Fore.BLACK + header[0:100] + Style.RESET_ALL) if source == "ADSBX": from defADSBX import pullADSBX data, failed = pullADSBX(planes) @@ -48,14 +53,14 @@ while True: has_data = False for planeData in data['ac']: if planeData['icao'] == key: - obj.run(planeData, source) + obj.run_ADSBX(planeData) has_data = True break if has_data is False: - obj.run(None, source) + obj.run_empty() else: for obj in planes.values(): - obj.run(None, source) + obj.run_empty() elif failed: failed_count += 1 elif source == "OPENS": @@ -68,22 +73,32 @@ while True: has_data = False for dataState in planeData.states: if (dataState.icao24).upper() == key: - obj.run(dataState, source) + obj.run_OPENS(dataState) has_data = True break if has_data is False: - obj.run(None, source) + obj.run_empty() else: for obj in planes.values(): - obj.run(None, source) + obj.run_empty() + elif failed: + failed_count += 1 if failed_count >= 10: - source = "OPENS" + if source == "OPENS": + source = "ADSBX" + elif source == "ADSBX": + source = "OPENS" + failed_count = 0 + from discord_webhook import DiscordWebhook + webhook = DiscordWebhook(url= main_config.get('DISCORD', 'URL'), content=(str("Failed over to " + source))) + webhook.execute() elapsed_calc_time = time.time() - start_time datetime_tz = datetime.now(tz) - print (Back.GREEN, Fore.BLACK, "--------", running_Count, "--------", datetime_tz.strftime("%I:%M:%S %p"), "------------------------Elapsed Time-", elapsed_calc_time, " -------------------------------------", Style.RESET_ALL) + footer = "-------- " + str(running_Count) + " -------- " + str(datetime_tz.strftime("%I:%M:%S %p")) + " ------------------------Elapsed Time- " + str(round(elapsed_calc_time, 3)) + " -------------------------------------" + print (Back.GREEN + Fore.BLACK + footer[0:100] + Style.RESET_ALL) - sleep_sec = 5 + sleep_sec = 15 for i in range(sleep_sec,0,-1): if i < 10: i = " " + str(i) diff --git a/configs/mainconf.ini b/configs/mainconf.ini index f2ad476..6c838f5 100644 --- a/configs/mainconf.ini +++ b/configs/mainconf.ini @@ -3,7 +3,7 @@ #SHOULD BE ADSBX which is ADS-B Exchange or OPENS which is OpenSky #By default configured with OpenSky which anyone can use without a login #ADS-B Exchange has better data but is not avalible unless you feed their network or pay. -SOURCE = ADSBX +SOURCE = OPENS #Timezone if you want your own time to show in the console, if invalid will be set to UTC. #List of TZs names https://en.wikipedia.org/wiki/List_of_tz_database_time_zones @@ -11,7 +11,7 @@ TZ = UTC #ADS-B Exchange https://www.adsbexchange.com/data/ [ADSBX] -API_KEY = apikey +API_KEY = ***REMOVED*** #OpenSky https://opensky-network.org/apidoc/index.html #When using without your own login user and pass should be None @@ -23,3 +23,7 @@ PASSWORD = None #API KEY for Google Static Maps only if you using this on any of the planes. API_KEY = googleapikey +#Used for failover messages +[DISCORD] +URL = ***REMOVED*** + diff --git a/configs/plane1.ini b/configs/plane1.ini index e561648..d27e270 100644 --- a/configs/plane1.ini +++ b/configs/plane1.ini @@ -6,6 +6,8 @@ ICAO = icaohere #Map to create from Google Static Maps or screenshot global tar1090 from globe.adsbexchange.com #Enter GOOGLESTATICMAP or ADSBX OPTION = ADSBX +#Tar1090 overlays option, should be seperated by comma no space, remove option all together to disable any +OVERLAYS = nexrad [AIRPORT] #Requires a list of airport types, this plane could land/takeoff at diff --git a/defSS.py b/defSS.py index fba9263..296ef20 100644 --- a/defSS.py +++ b/defSS.py @@ -11,7 +11,7 @@ from webdriver_manager.chrome import ChromeDriverManager import time from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By -def getSS(icao): +def getSS(icao, overlays): chrome_options = webdriver.ChromeOptions() chrome_options.headless = True chrome_options.add_argument('window-size=800,800') @@ -19,7 +19,7 @@ def getSS(icao): chrome_options.add_argument("--enable-logging --v=1") #chrome_options.add_argument('--no-sandbox') # required when running as root user. otherwise you would get no sandbox errors. browser = webdriver.Chrome(ChromeDriverManager().install(), options=chrome_options) - url = "https://globe.adsbexchange.com/?largeMode=2&hideButtons&hideSidebar&mapDim=0&zoom=9&icao=" + icao + url = "https://globe.adsbexchange.com/?largeMode=2&hideButtons&hideSidebar&mapDim=0&zoom=9&icao=" + icao + "&" + overlays browser.set_page_load_timeout(80) browser.get(url) WebDriverWait(browser, 40).until(lambda d: d.execute_script("return jQuery.active == 0")) diff --git a/planeClass.py b/planeClass.py index 318b764..0ddd7de 100644 --- a/planeClass.py +++ b/planeClass.py @@ -1,16 +1,17 @@ class Plane: - def __init__(self, icao, conf_file): + def __init__(self, icao, config_path, config): """Initializes a plane object from its config file and given icao.""" self.icao = icao.upper() - self.conf_file = conf_file + self.config = config + self.conf_file_path = config_path self.geo_alt_ft = None self.last_geo_alt_ft = None + self.below_desired_ft = None self.last_below_desired_ft = None self.feeding = None self.last_feeding = None self.last_on_ground = None self.on_ground = None - self.invalid_Location = None self.longitude = None self.latitude = None self.callsign = None @@ -18,18 +19,76 @@ class Plane: self.map_file_name = icao.upper() + "_map.png" self.last_latitude = None self.last_longitude = None - self.recheck_needed = None - self.last_recheck_needed = None self.last_contact = None - self.last_feed_data = None + self.landing_plausible = False def getICAO(self): return self.icao - def run(self, ac_dict, source): + def run_OPENS(self, ac_dict): + #Parse OpenSky Vector + from colorama import Fore, Back, Style + self.printheader("head") + #print (Fore.YELLOW + "OpenSky Sourced Data: ", ac_dict) + try: + self.__dict__.update({'icao' : ac_dict.icao24.upper(), 'callsign' : ac_dict.callsign, 'latitude' : ac_dict.latitude, 'longitude' : ac_dict.longitude, 'on_ground' : bool(ac_dict.on_ground), 'last_contact' : ac_dict.last_contact}) + if ac_dict.geo_altitude != None: + self.geo_alt_ft = round(float(ac_dict.geo_altitude) * 3.281) + elif self.on_ground: + self.geo_alt_ft = 0 + except ValueError as e: + print("Got data but some data is invalid!") + print(e) + self.printheader("foot") + else: + self.feeding = True + self.run_check() + def run_ADSBX(self, ac_dict): + #Parse ADBSX Vector + from colorama import Fore, Back, Style + self.printheader("head") + #print (Fore.YELLOW +"ADSBX Sourced Data: ", ac_dict, Style.RESET_ALL) + try: + #postime is divided by 1000 to get seconds from milliseconds, from timestamp expects secs. + self.__dict__.update({'icao' : ac_dict['icao'], 'callsign' : ac_dict['call'], 'reg' : ac_dict['reg'], 'latitude' : float(ac_dict['lat']), 'longitude' : float(ac_dict['lon']), 'geo_alt_ft' : int(ac_dict['galt']), 'on_ground' : bool(int(ac_dict["gnd"])), 'last_contact' : round(float(ac_dict["postime"])/1000)}) + if self.on_ground: + self.geo_alt_ft = 0 + if "to" in ac_dict.keys(): + self.to_location = ac_dict["to"] + if "from" in ac_dict.keys(): + self.from_location = ac_dict["from"] + except ValueError as e: + + print("Got data but some data is invalid!") + print(e) + print (Fore.YELLOW +"ADSBX Sourced Data: ", ac_dict, Style.RESET_ALL) + self.printheader("foot") + else: + self.feeding = True + self.run_check() + def printheader(self, type): + from colorama import Fore, Back, Style + if type == "head": + header = str("--------- " + self.conf_file_path + " ---------------------------- ICAO: " + self.icao + " ---------------------------------------") + elif type == "foot": + header = "----------------------------------------------------------------------------------------------------" + print(Back.MAGENTA + header[0:100] + Style.RESET_ALL) + + def get_time_since(self, last_contact): + from datetime import datetime + if last_contact != None: + last_contact_dt = datetime.fromtimestamp(last_contact) + time_since_contact = datetime.now() - last_contact_dt + else: + time_since_contact = None + return time_since_contact + def run_empty(self): + self.printheader("head") + self.feeding = False + self.run_check() + def run_check(self): """Runs a check of a plane module to see if its landed or takenoff using plane data, and takes action if so.""" #Import Modules #Clear Terminal #print("\033[H\033[J") - #Ability to Remove old Map import os #Setup Geopy @@ -37,11 +96,6 @@ class Plane: geolocator = Nominatim(user_agent="NotifyBot", timeout=5) import time from colorama import Fore, Back, Style - #Setup Config File - import configparser - self.config = configparser.ConfigParser() - self.config.read(("./configs/"+ self.conf_file)) - #Platform for determining OS for strftime import platform from datetime import datetime @@ -52,9 +106,12 @@ class Plane: from defMap import getMap elif self.config.get('MAP', 'OPTION') == "ADSBX": from defSS import getSS + if self.config.has_option('MAP', 'OVERLAYS'): + self.overlays = self.config.get('MAP', 'OVERLAYS') + else: + self.overlays = "" else: raise Exception("Map option not set correctly in this planes conf") - if self.config.getboolean('DISCORD', 'ENABLE'): from defDiscord import sendDis #Setup Tweepy @@ -67,335 +124,245 @@ class Plane: self.pb = Pushbullet(self.config['PUSHBULLET']['API_KEY']) self.pb_channel = self.pb.get_channel(self.config.get('PUSHBULLET', 'CHANNEL_TAG')) - print (Back.MAGENTA, "---------", self.conf_file, "---------------------------- ICAO:", self.icao, "--------------------------", Style.RESET_ALL) - #Reset Variables - self.below_desired_ft = None - self.geo_alt_ft = None - self.longitude = None - self.latitude = None - self.on_ground = None - self.has_location = None - time_since_contact = None - #Parse OpenSky Vector - if source == "OPENS": - self.val_error = False - if ac_dict != None: - #print (Fore.YELLOW + "OpenSky Sourced Data: ", ac_dict) - try: - self.__dict__.update({'icao' : ac_dict.icao24.upper(), 'callsign' : ac_dict.callsign, 'latitude' : ac_dict.latitude, 'longitude' : ac_dict.longitude, 'on_ground' : bool(ac_dict.on_ground), 'last_contact' : ac_dict.last_contact}) - if ac_dict.geo_altitude != None: - self.geo_alt_ft = round(float(ac_dict.geo_altitude) * 3.281) - elif self.on_ground: - self.geo_alt_ft = 0 - except ValueError as e: - self.val_error = True - print("Got data but some data is invalid!") - print(e) + if self.feeding == False: + time_since_contact = self.get_time_since(self.last_contact) + output = [ + [(Fore.CYAN + "ICAO" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.icao + Style.RESET_ALL)], + [(Fore.CYAN + "Last Contact" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(time_since_contact) + Style.RESET_ALL)] if time_since_contact != None else None + ] + output = list(filter(None, output)) + print(tabulate(output, [], 'fancy_grid')) + print("No Data") + elif self.feeding == True: + time_since_contact = self.get_time_since(self.last_contact) + output = [ + [(Fore.CYAN + "ICAO" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.icao + Style.RESET_ALL)], + [(Fore.CYAN + "Callsign" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.callsign + Style.RESET_ALL)], + [(Fore.CYAN + "Reg" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.reg + Style.RESET_ALL)] if "reg" in self.__dict__ else None, + [(Fore.CYAN + "From" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.from_location + Style.RESET_ALL)] if "from_location" in self.__dict__ else None, + [(Fore.CYAN + "To" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.to_location + Style.RESET_ALL)] if "to_location" in self.__dict__ else None, + [(Fore.CYAN + "Latitude" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(self.latitude) + Style.RESET_ALL)], + [(Fore.CYAN + "Longitude" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(self.longitude) + Style.RESET_ALL)], + [(Fore.CYAN + "Last Contact" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(time_since_contact).split(".")[0]+ Style.RESET_ALL)], + [(Fore.CYAN + "On Ground" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(self.on_ground) + Style.RESET_ALL)], + [(Fore.CYAN + "GEO Alitude" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str("{:,} ft".format(self.geo_alt_ft)) + Style.RESET_ALL)] + ] + output = list(filter(None, output)) + print(tabulate(output, [], 'fancy_grid')) - #Parse ADBSX Vector - elif source == "ADSBX": - self.val_error = False - if ac_dict != None: - #print (Fore.YELLOW +"ADSBX Sourced Data: ", ac_dict, Style.RESET_ALL) - try: - #postime is divided by 1000 to get seconds from milliseconds, from timestamp expects secs. - self.__dict__.update({'icao' : ac_dict['icao'], 'callsign' : ac_dict['call'], 'reg' : ac_dict['reg'], 'latitude' : float(ac_dict['lat']), 'longitude' : float(ac_dict['lon']), 'geo_alt_ft' : int(ac_dict['galt']), 'on_ground' : bool(int(ac_dict["gnd"])), 'last_contact' : round(float(ac_dict["postime"])/1000)}) - if self.on_ground: - self.geo_alt_ft = 0 - if "to" in ac_dict.keys(): - self.to_location = ac_dict["to"] - if "from" in ac_dict.keys(): - self.from_location = ac_dict["from"] - except ValueError as e: - self.val_error = True - print("Got data but some data is invalid!") - print(e) - - #print (Fore.CYAN + "ICAO:", self.icao + Style.RESET_ALL) - #Print out data, and convert to locals - if self.val_error is False: - if self.last_contact != None: - last_contact_dt = datetime.fromtimestamp(self.last_contact) - time_since_contact = datetime.now() - last_contact_dt +#Check if below desire ft + desired_ft = 10000 + if self.geo_alt_ft is None or self.geo_alt_ft > desired_ft: + self.below_desired_ft = False + elif self.geo_alt_ft < desired_ft: + self.below_desired_ft = True +#Check if tookoff + if self.below_desired_ft and self.on_ground is False: + if self.last_on_ground: + self.tookoff = True + self.trigger_type = "no longer on ground" + self.tookoff_header = "Took off from " + elif self.last_feeding is False and self.feeding and self.landing_plausible == False: + self.tookoff = True + self.trigger_type = "data acquisition" + self.tookoff_header = "Took off near " else: - time_since_contact = None - if ac_dict == None: - self.feeding = False - output = [ - [(Fore.CYAN + "ICAO" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.icao + Style.RESET_ALL)], - [(Fore.CYAN + "Last Contact" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(time_since_contact) + Style.RESET_ALL)] if time_since_contact != None else None - ] - output = list(filter(None, output)) - print(tabulate(output, [], 'fancy_grid')) - print("No Data") - elif ac_dict != None: - self.feeding = True - output = [ - [(Fore.CYAN + "ICAO" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.icao + Style.RESET_ALL)], - [(Fore.CYAN + "Callsign" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.callsign + Style.RESET_ALL)], - [(Fore.CYAN + "Reg" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.reg + Style.RESET_ALL)] if "reg" in self.__dict__ else None, - [(Fore.CYAN + "From" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.from_location + Style.RESET_ALL)] if "from_location" in self.__dict__ else None, - [(Fore.CYAN + "To" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + self.to_location + Style.RESET_ALL)] if "to_location" in self.__dict__ else None, - [(Fore.CYAN + "Latitude" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(self.latitude) + Style.RESET_ALL)], - [(Fore.CYAN + "Longitude" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(self.longitude) + Style.RESET_ALL)], - [(Fore.CYAN + "Last Contact" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(time_since_contact) + Style.RESET_ALL)], - [(Fore.CYAN + "On Ground" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(self.on_ground) + Style.RESET_ALL)], - [(Fore.CYAN + "GEO Alitude Ft" + Style.RESET_ALL), (Fore.LIGHTGREEN_EX + str(self.geo_alt_ft) + Style.RESET_ALL)] - ] - output = list(filter(None, output)) - print(tabulate(output, [], 'fancy_grid')) - #Set Check for inconsistancy in data - if not self.last_recheck_needed: - #Recheck needed if feeding state changes - if self.feeding == False and self.last_feeding: - self.recheck_needed = True - print("Recheck needed, feeding status changed") + self.tookoff = False + else: + self.tookoff = False + + #self.tookoff = bool(self.below_desired_ft and self.on_ground is False and ((self.last_feeding is False and self.feeding) or (self.last_on_ground))) + #print ("Tookoff Just Now:", self.tookoff) + + +#Check if Landed + if self.on_ground and self.last_on_ground is False and self.last_below_desired_ft: + self.landed = True + self.trigger_type = "now on ground" + self.landed_header = "Landed in " + self.landing_plausible = False + #Set status for landing plausible + elif self.last_below_desired_ft and self.last_feeding and self.feeding is False and self.last_on_ground is False: + print("Near landing conditions, if contiuned data loss for 5 mins, landing true") + self.landing_plausible = True + + elif self.landing_plausible and self.feeding is False and time_since_contact.seconds >= 300: + self.landing_plausible = False + self.landed = True + self.trigger_type = "data loss" + self.landed_header = "Landed near " + else: + self.landed = False + + #self.landed = bool(self.last_below_desired_ft and ((self.last_feeding and self.feeding is False and self.last_on_ground is False) or (self.on_ground and self.last_on_ground is False))) + #print ("Landed Just Now:", self.landed) + if self.landed: + print ("Landed by", self.trigger_type) + if self.tookoff: + print("Tookoff by", self.trigger_type) +#Lookup Location of coordinates + if self.landed or self.tookoff: + if self.trigger_type == "now on ground" or "data acquisition" and self.longitude != None and self.latitude != None: + combined = f"{self.latitude} , {self.longitude}" + nearest_airport_dict = getClosestAirport(self.latitude, self.longitude, self.config.get("AIRPORT", "TYPES")) + has_coords = True + elif self.trigger_type == "data loss" or "no longer on ground" and self.last_longitude != None and self.last_latitude != None: + combined = f"{self.last_latitude}, {self.last_longitude}" + nearest_airport_dict = getClosestAirport(self.last_latitude, self.last_longitude, self.config.get("AIRPORT", "TYPES")) + has_coords = True + else: + print (Fore.RED + 'No Location, No coordinates') + invalid_Location = True + print(Style.RESET_ALL) + if has_coords: + try: + location = geolocator.reverse(combined) + except BaseException: + print ("Geopy API Error") else: - self.recheck_needed = False - elif self.last_recheck_needed: - self.recheck_needed = False - - - #Run a Check compares new data to last flagged(check) data - if self.last_recheck_needed: - if self.recheck_feeding == self.feeding: - print("Data Feeding change consistent") - elif self.recheck_feeding != self.feeding: - print("Data Feeding change was inconsistent last data ignored") - - self.recheck_feeding = self.feeding - self.last_recheck_needed = self.recheck_needed - - if self.recheck_needed is False: - - #Check if below desire ft - if self.geo_alt_ft is None: - self.below_desired_ft = False - elif self.geo_alt_ft < 10000: - self.below_desired_ft = True - #Check if tookoff - if self.below_desired_ft and self.on_ground is False: - if self.last_on_ground: - self.tookoff = True - self.trigger_type = "no longer on ground" - self.tookoff_header = "Took off from " - elif self.last_feeding is False and self.feeding and self.last_feed_data == None: - self.tookoff = True - self.trigger_type = "data acquisition" - self.tookoff_header = "Took off near " - else: - self.tookoff = False - else: - self.tookoff = False - - #self.tookoff = bool(self.below_desired_ft and self.on_ground is False and ((self.last_feeding is False and self.feeding) or (self.last_on_ground))) - #print ("Tookoff Just Now:", self.tookoff) - - - #Check if Landed - if self.on_ground and self.last_on_ground is False and self.last_below_desired_ft: - self.landed = True - self.trigger_type = "now on ground" - self.landed_header = "Landed in " - self.last_feed_data = None - #Store a dictionary when data is lost near landing conditions, - elif self.last_below_desired_ft and self.last_feeding and self.feeding is False and self.last_on_ground is False: - self.last_feed_data = {} - self.last_feed_data.update(self.__dict__) - print("Latest data stored") - - elif self.last_feed_data != None and self.feeding is False and time_since_contact.seconds >= 300: - self.__dict__.update(self.last_feed_data) - self.last_feed_data = None - self.landed = True - self.trigger_type = "data loss" - self.landed_header = "Landed near " - else: - self.landed = False - - #self.landed = bool(self.last_below_desired_ft and ((self.last_feeding and self.feeding is False and self.last_on_ground is False) or (self.on_ground and self.last_on_ground is False))) - #print ("Landed Just Now:", self.landed) - if self.landed: - print ("Landed by", self.trigger_type) - if self.tookoff: - print("Tookoff by", self.trigger_type) - #Lookup Location of coordinates - if self.landed or self.tookoff: - if self.trigger_type == "now on ground" or "data acquisition" and self.longitude != None and self.latitude != None: - self.combined = f"{self.latitude} , {self.longitude}" - nearest_airport_dict = getClosestAirport(self.latitude, self.longitude, self.config.get("AIRPORT", "TYPES")) - self.has_coords = True - elif self.trigger_type == "data loss" or "no longer on ground" and self.last_longitude != None and self.last_latitude != None: - self.combined = f"{self.last_latitude}, {self.last_longitude}" - nearest_airport_dict = getClosestAirport(self.last_latitude, self.last_longitude, self.config.get("AIRPORT", "TYPES")) - self.has_coords = True - else: - print (Fore.RED + 'No Location') - self.has_location = False - self.invalid_Location = True - self.has_coords = False - print(Style.RESET_ALL) - if self.has_coords: - try: - self.location = geolocator.reverse(self.combined) - except BaseException: - print ("Geopy API Error") - else: - # print (Fore.YELLOW, "Geopy debug: ", location.raw, Style.RESET_ALL) - self.has_location = True - - - - - #Figure if valid location, valid being geopy finds a location - if self.has_location: + # print (Fore.YELLOW, "Geopy debug: ", location.raw, Style.RESET_ALL) + #Checking for invalid location, where GeoPy doesn't find coordinates info try: - self.geoError = self.location.raw['error'] + geoError = location.raw['error'] except KeyError: - self.invalid_Location = False - self.geoError = None - else: - self.invalid_Location = True - - print ("Invalid Location: ", self.invalid_Location) - - if self.invalid_Location: - print (Fore.RED) - print (self.geoError) - print ("Likely Over Water or Invalid Location") - print(Style.RESET_ALL) - - - #Convert Full address to sep variables only if Valid Location - elif self.invalid_Location is False: - self.address = self.location.raw['address'] - self.country = self.address.get('country', '') - self.country_code = self.address.get('country_code', '').upper() - self.state = self.address.get('state', '') - self.county = self.address.get('county', '') - self.city = self.address.get('city', '') - self.town = self.address.get('town', '') - self.hamlet = self.address.get('hamlet', '') + invalid_Location = False + #Convert Full address to sep variables only if Valid Location + address = location.raw['address'] + country = address.get('country', '') + country_code = address.get('country_code', '').upper() + state = address.get('state', '') + county = address.get('county', '') + city = address.get('city', '') + town = address.get('town', '') + hamlet = address.get('hamlet', '') # print (Fore.YELLOW) # print ("Address Fields debug: ", self.address) # print(Style.RESET_ALL) print (Fore.GREEN) - print("Entire Address: ", self.location.address) - print ("Country Code: ", self.country_code) - print ("Country: ", self.country) - print ("State: ", self.state) - print ("City: ", self.city) - print ("Town: ", self.town) - print ("Hamlet: ", self.hamlet) - print ("County: ", self.county) + print("Entire Address: ", location.address) + print ("Country Code: ", country_code) + print ("Country: ", country) + print ("State: ", state) + print ("City: ", city) + print ("Town: ", town) + print ("Hamlet: ", hamlet) + print ("County: ", county) print(Style.RESET_ALL) - #Chose city town county or hamlet for location as not all are always avalible. - if self.invalid_Location is False: - self.aera_hierarchy = self.city or self.town or self.county or self.hamlet - #Set Discord Title - if self.config.getboolean('DISCORD', 'ENABLE'): - self.dis_title = self.icao if self.config.get('DISCORD', 'TITLE') == "icao" else self.callsign if self.config.get('DISCORD', 'TITLE') == "callsign" else self.config.get('DISCORD', 'TITLE') - #Set Twitter Title - if self.config.getboolean('TWITTER', 'ENABLE'): - self.twitter_title = self.icao if self.config.get('TWITTER', 'TITLE') == "icao" else self.callsign if self.config.get('TWITTER', 'TITLE') == "callsign" else self.config.get('TWITTER', 'TITLE') - #Takeoff Notifcation and Landed - if self.tookoff: - if self.invalid_Location is False: - self.tookoff_message = (self.tookoff_header + self.aera_hierarchy + ", " + self.state + ", " + self.country_code + ". ") + #Chose city town county or hamlet for location as not all are always avalible. + aera_hierarchy = city or town or county or hamlet else: - self.tookoff_message = ("Took off") - print (self.tookoff_message) - #Google Map or tar1090 screenshot - if self.config.get('MAP', 'OPTION') == "GOOGLESTATICMAP": - getMap((self.aera_hierarchy + ", " + self.state + ", " + self.country_code), self.icao) - elif self.config.get('MAP', 'OPTION') == "ADSBX": - getSS(self.icao) - append_airport(self.map_file_name, nearest_airport_dict['icao'], nearest_airport_dict['name'], nearest_airport_dict['distance']) - else: - raise Exception("Map option not set correctly in this planes conf") - #Discord - if self.config.getboolean('DISCORD', 'ENABLE'): - self.dis_message = (self.dis_title + " " + self.tookoff_message + nearest_airport_dict['icao'] + ", " + nearest_airport_dict["name"]).strip() - sendDis(self.dis_message, self.map_file_name, self.config) - #PushBullet - if self.config.getboolean('PUSHBULLET', 'ENABLE'): - with open(self.map_file_name, "rb") as pic: - map_data = self.pb.upload_file(pic, "Tookoff IMG") - self.pb_channel.push_note(self.config.get('PUSHBULLET', 'TITLE'), self.tookoff_message) - self.pb_channel.push_file(**map_data) - #Twitter - if self.config.getboolean('TWITTER', 'ENABLE'): - twitter_media_map_obj = self.tweet_api.media_upload(self.map_file_name) - alt_text = "Call: " + self.callsign + " On Ground: " + str(self.on_ground) + " Alt: " + str(self.geo_alt_ft) + " Last Contact: " + str(time_since_contact) + " Trigger: " + self.trigger_type - self.tweet_api.create_media_metadata(media_id= twitter_media_map_obj.media_id, alt_text= alt_text) - self.tweet_api.update_status(status = ((self.twitter_title + " " + self.tookoff_message).strip()), media_ids=[twitter_media_map_obj.media_id]) - #self.tweet_api.update_with_media(self.map_file_name, status = (self.twitter_title + " " + self.tookoff_message).strip()) - self.takeoff_time = time.time() - os.remove(self.map_file_name) + invalid_Location = True + print (Fore.RED) + print (geoError) + print ("Invalid Location, Likely Over Water ") + print(Style.RESET_ALL) + + #Set Discord Title + if self.config.getboolean('DISCORD', 'ENABLE'): + self.dis_title = self.icao if self.config.get('DISCORD', 'TITLE') == "icao" else self.callsign if self.config.get('DISCORD', 'TITLE') == "callsign" else self.config.get('DISCORD', 'TITLE') + #Set Twitter Title + if self.config.getboolean('TWITTER', 'ENABLE'): + self.twitter_title = self.icao if self.config.get('TWITTER', 'TITLE') == "icao" else self.callsign if self.config.get('TWITTER', 'TITLE') == "callsign" else self.config.get('TWITTER', 'TITLE') + #Takeoff Notifcation and Landed + if self.tookoff: + if invalid_Location is False: + tookoff_message = (self.tookoff_header + aera_hierarchy + ", " + state + ", " + country_code + ". ") + else: + tookoff_message = ("Took off") + print (tookoff_message) + #Google Map or tar1090 screenshot + if self.config.get('MAP', 'OPTION') == "GOOGLESTATICMAP": + getMap((aera_hierarchy + ", " + state + ", " + country_code), self.icao) + elif self.config.get('MAP', 'OPTION') == "ADSBX": + getSS(self.icao, self.overlays) + if nearest_airport_dict != None: + append_airport(self.map_file_name, nearest_airport_dict['icao'], nearest_airport_dict['name'], nearest_airport_dict['distance']) + airport_string = nearest_airport_dict['icao'] + ", " + nearest_airport_dict["name"] + else: + airport_string = "" + else: + raise Exception("Map option not set correctly in this planes conf") + #Discord + if self.config.getboolean('DISCORD', 'ENABLE'): + dis_message = (self.dis_title + " " + tookoff_message + airport_string).strip() + sendDis(dis_message, self.map_file_name, self.config) + #PushBullet + if self.config.getboolean('PUSHBULLET', 'ENABLE'): + with open(self.map_file_name, "rb") as pic: + map_data = self.pb.upload_file(pic, "Tookoff IMG") + self.pb_channel.push_note(self.config.get('PUSHBULLET', 'TITLE'), tookoff_message) + self.pb_channel.push_file(**map_data) + #Twitter + if self.config.getboolean('TWITTER', 'ENABLE'): + twitter_media_map_obj = self.tweet_api.media_upload(self.map_file_name) + alt_text = "Call: " + self.callsign + " On Ground: " + str(self.on_ground) + " Alt: " + str(self.geo_alt_ft) + " Last Contact: " + str(time_since_contact) + " Trigger: " + self.trigger_type + self.tweet_api.create_media_metadata(media_id= twitter_media_map_obj.media_id, alt_text= alt_text) + self.tweet_api.update_status(status = ((self.twitter_title + " " + tookoff_message).strip()), media_ids=[twitter_media_map_obj.media_id]) + #self.tweet_api.update_with_media(self.map_file_name, status = (self.twitter_title + " " + tookoff_message).strip()) + self.takeoff_time = time.time() + os.remove(self.map_file_name) - if self.landed: - self.landed_time_msg = "" - if self.takeoff_time != None: - self.landed_time = time.time() - self.takeoff_time - if platform.system() == "Linux": - self.landed_time_msg = time.strftime("Apx. flt. time %-H Hours : %-M Mins. ", time.gmtime(self.landed_time)) - elif platform.system() == "Windows": - self.landed_time_msg = time.strftime("Apx. flt. time %#H Hours : %#M Mins. ", time.gmtime(self.landed_time)) - if self.invalid_Location is False: - self.landed_message = (self.landed_header + self.aera_hierarchy + ", " + self.state + ", " + self.country_code + ". " + self.landed_time_msg) - else: - self.landed_message = ("Landed", self.landed_time_msg) - print (self.landed_message) - #Google Map or tar1090 screenshot - if self.config.get('MAP', 'OPTION') == "GOOGLESTATICMAP": - getMap((self.aera_hierarchy + ", " + self.state + ", " + self.country_code), self.icao) - elif self.config.get('MAP', 'OPTION') == "ADSBX": - getSS(self.icao) - append_airport(self.map_file_name, nearest_airport_dict['icao'], nearest_airport_dict['name'], nearest_airport_dict['distance']) + if self.landed: + self.landed_time_msg = "" + if self.takeoff_time != None: + self.landed_time = time.time() - self.takeoff_time + if platform.system() == "Linux": + self.landed_time_msg = time.strftime("Apx. flt. time %-H Hours : %-M Mins. ", time.gmtime(self.landed_time)) + elif platform.system() == "Windows": + self.landed_time_msg = time.strftime("Apx. flt. time %#H Hours : %#M Mins. ", time.gmtime(self.landed_time)) + if invalid_Location is False: + landed_message = (self.landed_header + aera_hierarchy + ", " + state + ", " + country_code + ". " + self.landed_time_msg) + else: + landed_message = ("Landed" + ", " + self.landed_time_msg) + print (landed_message) + #Google Map or tar1090 screenshot + if self.config.get('MAP', 'OPTION') == "GOOGLESTATICMAP": + getMap((aera_hierarchy + ", " + state + ", " + country_code), self.icao) + elif self.config.get('MAP', 'OPTION') == "ADSBX": + getSS(self.icao, self.overlays) + if nearest_airport_dict != None: + append_airport(self.map_file_name, nearest_airport_dict['icao'], nearest_airport_dict['name'], nearest_airport_dict['distance']) + airport_string = nearest_airport_dict['icao'] + ", " + nearest_airport_dict["name"] + else: + airport_string = "" - else: - raise Exception("Map option not set correctly in this planes conf") - #Discord - if self.config.getboolean('DISCORD', 'ENABLE'): - self.dis_message = (self.dis_title + " " +self.landed_message + nearest_airport_dict['icao'] + ", " + nearest_airport_dict["name"]).strip() - sendDis(self.dis_message, self.map_file_name, self.config) - #PushBullet - if self.config.getboolean('PUSHBULLET', 'ENABLE'): - with open(self.map_file_name, "rb") as pic: - map_data = self.pb.upload_file(pic, "Landed IMG") - self.pb_channel.push_note(self.config.get('PUSHBULLET', 'TITLE'), self.landed_message) - self.pb_channel.push_file(**map_data) - #Twitter - if self.config.getboolean('TWITTER', 'ENABLE'): - twitter_media_map_obj = self.tweet_api.media_upload(self.map_file_name) - alt_text = "Call: " + self.callsign + " On Ground: " + str(self.on_ground) + " Alt: " + str(self.geo_alt_ft) + " Last Contact: " + str(time_since_contact) + " Trigger: " + self.trigger_type - self.tweet_api.create_media_metadata(media_id= twitter_media_map_obj.media_id, alt_text= alt_text) - self.tweet_api.update_status(status = ((self.twitter_title + " " + self.landed_message).strip()), media_ids=[twitter_media_map_obj.media_id]) - #self.tweet_api.update_with_media(self.map_file_name, status = (self.twitter_title + " " + self.landed_message).strip()) - self.takeoff_time = None - self.landed_time = None - self.time_since_tk = None - os.remove(self.map_file_name) - self.last_contact = None + else: + raise Exception("Map option not set correctly in this planes conf") + #Discord + if self.config.getboolean('DISCORD', 'ENABLE'): + dis_message = (self.dis_title + " " + landed_message + " " + airport_string).strip() + sendDis(dis_message, self.map_file_name, self.config) + #PushBullet + if self.config.getboolean('PUSHBULLET', 'ENABLE'): + with open(self.map_file_name, "rb") as pic: + map_data = self.pb.upload_file(pic, "Landed IMG") + self.pb_channel.push_note(self.config.get('PUSHBULLET', 'TITLE'), landed_message) + self.pb_channel.push_file(**map_data) + #Twitter + if self.config.getboolean('TWITTER', 'ENABLE'): + twitter_media_map_obj = self.tweet_api.media_upload(self.map_file_name) + alt_text = "Call: " + self.callsign + " On Ground: " + str(self.on_ground) + " Alt: " + str(self.geo_alt_ft) + " Last Contact: " + str(time_since_contact) + " Trigger: " + self.trigger_type + self.tweet_api.create_media_metadata(media_id= twitter_media_map_obj.media_id, alt_text= alt_text) + self.tweet_api.update_status(status = ((self.twitter_title + " " + landed_message).strip()), media_ids=[twitter_media_map_obj.media_id]) + #self.tweet_api.update_with_media(self.map_file_name, status = (self.twitter_title + " " + landed_message).strip()) + self.takeoff_time = None + self.landed_time = None + self.time_since_tk = None + os.remove(self.map_file_name) + self.last_contact = None - #Set Variables to compare to next check - self.last_feeding = self.feeding - self.last_geo_alt_ft = self.geo_alt_ft - self.last_on_ground = self.on_ground - self.last_below_desired_ft = self.below_desired_ft - self.last_longitude = self.longitude - self.last_latitude = self.latitude +#Set Variables to compare to next check + self.last_feeding = self.feeding + self.last_geo_alt_ft = self.geo_alt_ft + self.last_on_ground = self.on_ground + self.last_below_desired_ft = self.below_desired_ft + self.last_longitude = self.longitude + self.last_latitude = self.latitude - elif self.val_error: - print ("Failed to Parse Will Recheck this Plane After new data") if self.takeoff_time != None: self.elapsed_time = time.time() - self.takeoff_time self.time_since_tk = time.strftime("Time Since Take off %H Hours : %M Mins : %S Secs", time.gmtime(self.elapsed_time)) print(self.time_since_tk) - - - - - print (Back.MAGENTA, "---------------------------------------------------------------------------", Style.RESET_ALL) + self.printheader("foot") \ No newline at end of file From d4c81515a864ab4a50a70d064bb730b8e7be5729 Mon Sep 17 00:00:00 2001 From: Jxck-S Date: Sat, 19 Dec 2020 17:38:25 -0500 Subject: [PATCH 124/124] Whoops --- configs/mainconf.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configs/mainconf.ini b/configs/mainconf.ini index 6c838f5..8a89474 100644 --- a/configs/mainconf.ini +++ b/configs/mainconf.ini @@ -11,7 +11,7 @@ TZ = UTC #ADS-B Exchange https://www.adsbexchange.com/data/ [ADSBX] -API_KEY = ***REMOVED*** +API_KEY = apikey #OpenSky https://opensky-network.org/apidoc/index.html #When using without your own login user and pass should be None @@ -25,5 +25,5 @@ API_KEY = googleapikey #Used for failover messages [DISCORD] -URL = ***REMOVED*** +URL = webhookurl

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