Send SMS aircraft alerts based on ADS-B data
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

107 lines
2.6 KiB

# Partially written with ChatGPT
import os
import time
import json
import argparse
import requests
import adsms.db
import discord_webhook
def load_config(config_file):
with open(config_file) as f:
return json.load(f)
def send_text_message(phone, message, key):
request = {"phone": phone, "message": message, "key": key}
resp = requests.post("https://textbelt.com/text", request)
print(resp.json())
def process_subscriptions(con, config, data):
subscriptions = db.get_subscriptions(con)
for (
sub_id,
phone,
icao,
description,
last_seen,
platform,
min_lat,
min_lon,
max_lat,
max_lon,
) in subscriptions:
if (
icao in data
and data[icao]["seen_pos"] < config["max_age"]
and min_lat <= data[icao]["lat"] <= max_lat
and min_lon <= data[icao]["lon"] <= max_lon
):
if last_seen + config["min_disappearance"] < time.time():
message = f"{description}\n{config['tracker']}?icao={icao}"
if platform == "textbelt":
send_text_message(phone, message, config["textbelt_key"])
elif platform == "discord_webhook":
print(
discord_webhook.DiscordWebhook(
url=phone, content=message
).execute()
)
print(f"{phone}: {message}")
db.update_last_seen_time(con, sub_id)
con.commit()
def get_current_data(con, config):
# return {"78007e": {"seen": 0}}
print(
config["data"]
+ (",".join(db.get_all_icao(con)) if config["codes"] else "")
)
response = requests.get(
config["data"]
+ (",".join(db.get_all_icao(con)) if config["codes"] else "")
).json()
planes = response.get("aircraft", response["ac"])
return {plane["hex"]: plane for plane in planes}
def run(config):
con = adsms.db.load_database(config["database"])
print(db.get_all_icao(con))
while True:
data = get_current_data(con, config)
process_subscriptions(con, config, data)
time.sleep(config["delay"])
con.close()
def main():
parser = argparse.ArgumentParser()
parser.add_argument("config_file")
args = parser.parse_args()
config = load_config(args.config_file)
try:
if config["pid_file"]:
with open(config["pid_file"], "w+") as f:
f.write(str(os.getpid()))
run(config)
finally:
if config["pid_file"]:
os.unlink(config["pid_file"])