Skip to content

Instantly share code, notes, and snippets.

@wgaylord
Last active November 19, 2018 16:44
Show Gist options
  • Save wgaylord/49e7dd2cf5f52b92044f0b8939eb0c1c to your computer and use it in GitHub Desktop.
Save wgaylord/49e7dd2cf5f52b92044f0b8939eb0c1c to your computer and use it in GitHub Desktop.
import requests
from datetime import datetime
import lxml.html
def MakeObservation(username,password,norad,transmitter,station,startTime,endTime):
loginUrl = "https://network.satnogs.org/accounts/login/" #login URL
session = requests.session()
login = session.get(loginUrl) #Get login page for CSFR token
login_html = lxml.html.fromstring(login.text)
login_hidden_inputs = login_html.xpath(r'//form//input[@type="hidden"]') #Get CSFR token
form = {x.attrib["name"]: x.attrib["value"] for x in login_hidden_inputs}
form["login"]=username
form["password"]=password
session.post(loginUrl,data=form,headers={'referer':loginUrl}).text #Login
obsURL = "https://network.satnogs.org/observations/new/" #Observation URL
obs = session.get(obsURL) #Get the observation/new/ page to get the CSFR token
obs_html = lxml.html.fromstring(obs.text)
hidden_inputs = obs_html.xpath(r'//form//input[@type="hidden"]')
form = {x.attrib["name"]: x.attrib["value"] for x in hidden_inputs}
form["satellite"]=norad
form["transmitter"]=transmitter
form["start-time"]=startTime
form["end-time"]=endTime
form["0-starting_time"] = startTime
form["0-ending_time"] = endTime
form["0-station"] = station
form["total"]=str(1)
session.post(obsURL,data=form,headers={'referer':obsURL}).text
#MakeObservation(USERNAME,PASSWORD,40967,"ZyjKNJ9KqnTHBCUzAPN5G5",41,"2018-11-19 07:38:28.000","2018-11-19 07:52:00.00")
#Directly from JS code
def checkOverlap(jobs,start,stop):
overlap = 0
for x in jobs:
job_start = datetime.strptime(x["start"],"%Y-%m-%dT%H:%M:%SZ")
job_end = datetime.strptime(x["end"],"%Y-%m-%dT%H:%M:%SZ")
if(job_end < start):
continue
if(job_start > stop):
continue
if(job_start > start and job_start < stop):
overlap = round((((job_start-start).total_seconds())/((stop-start).total_seconds()))*100)
overlap = 100 - overlap
if(job_end > start and job_end < stop):
overlap = round((((stop-job_end).total_seconds())/((stop-start).total_seconds()))*100)
overlap = 100 - overlap
if(job_start < start and job_end > stop):
overlap = 100
if(job_start == start and job_end == stop):
overlap = 100
return overlap
def getNextPasses(station):
pass_list = []
next_passes = requests.get("https://network.satnogs.org/pass_predictions/"+str(station),headers={'X-Requested-With': 'XMLHttpRequest'}).json()["nextpasses"]
jobs = requests.get("https://network.satnogs.org/api/jobs/?ground_station="+str(station)).json()
for x in next_passes:
passInfo = {}
passInfo["start"] = x["tr"].replace("T"," ")
passInfo["end"] = x["ts"].replace("T"," ")
passInfo["norad_cat_id"] = int(x["norad_cat_id"])
passInfo["valid"] = x["valid"]
passInfo["name"] = x["name"]
passInfo["overlap"] = checkOverlap(jobs,datetime.strptime(x["tr"].split(".")[0],"%Y-%m-%dT%H:%M:%S"),datetime.strptime(x["ts"].split(".")[0],"%Y-%m-%dT%H:%M:%S"))
pass_list.append(passInfo)
return pass_list
def getBestTransmitters(norad):
data = requests.get("https://network.satnogs.org/transmitters/"+str(norad)).json()["transmitters"]
best = data[0]
trans = []
for x in data:
if x["success_rate"] > best["success_rate"]:
best = x
trans.insert(0,x["uuid"])
else:
trans.append(x["uuid"])
return trans
def ReCalcOverlap(passes,station):
jobs = requests.get("https://network.satnogs.org/api/jobs/?ground_station="+str(station)).json()
new_pass_list = []
for x in passes:
x["overlap"] = checkOverlap(jobs,datetime.strptime(passInfo["start"].split(".")[0],"%Y-%m-%d %H:%M:%S"),datetime.strptime(passInfo["end"].split(".")[0],"%Y-%m-%d %H:%M:%S"))
if x["overlap"] == 0:
new_pass_list.append(x)
return x
def getAllCompatableTransmitters(trans,station):
station = requests.get("https://network.satnogs.org/api/stations/"+str(station)).json()
goodTrans = []
for x in trans:
transmitter = requests.get("https://db.satnogs.org/api/transmitters/"+x).json()
if "detail" in transmitter.keys():
continue
for y in station["antenna"]:
if(transmitter["downlink_low"] < y["frequency_max"] and transmitter["downlink_low"] > y["frequency"]):
goodTrans.append(x)
break
return goodTrans
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment