232 lines
6.2 KiB
Python
232 lines
6.2 KiB
Python
|
|
|
|
import datetime
|
|
import requests
|
|
from requests.packages.urllib3.exceptions import InsecureRequestWarning
|
|
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
|
|
import csv
|
|
from urllib.parse import urljoin
|
|
from urllib.parse import urlencode
|
|
import json
|
|
import pytz
|
|
|
|
from requests.auth import HTTPBasicAuth
|
|
S = requests.Session()
|
|
S.verify = False
|
|
eastern = pytz.timezone('US/Eastern')
|
|
|
|
username = "rlx.ops@noaa.gov"
|
|
password = "rlx25303!"
|
|
today = datetime.date.today()
|
|
currentday = datetime.datetime.now()
|
|
|
|
|
|
y = today.year
|
|
m = today.month
|
|
d = today.day
|
|
|
|
currenttime = currentday.replace(hour=12,minute=0,second=0,microsecond=0)
|
|
entrytime = currentday.replace(hour=12,minute=30,second=0,microsecond=0)
|
|
eastern_time = currenttime.astimezone(eastern)
|
|
|
|
obtime = eastern_time.strftime("%Y-%m-%dT%H:%M:%S")
|
|
eastern_time = entrytime.astimezone(eastern)
|
|
entrytime = eastern_time.strftime("%Y-%m-%dT%H:%M:%S")
|
|
|
|
|
|
|
|
|
|
def getob(y,m,d):
|
|
url = "https://mesonet.agron.iastate.edu/request/coop/obs-dl.php?network=WV_COOP&station%5B%5D=RLXW2&year1={year}&month1={month}&day1={day}&year2={year}&month2={month}&day2={day}&what=download&delim=comma".format(year=y,month=m,day=d)
|
|
print(url)
|
|
response = S.get(url)
|
|
csvdecode = response.content.decode('utf-8')
|
|
csvstuff = csv.reader(csvdecode.splitlines(), delimiter=',')
|
|
csvlist = list(csvstuff)
|
|
print(csvlist[1])
|
|
print(csvlist[1][5],csvlist[1][6],csvlist[1][7])
|
|
return create_dict(csvlist[1][5],csvlist[1][6],csvlist[1][7],csvlist[1][3],csvlist[1][4])
|
|
|
|
def create_dict(precipitation,snowfall,snowdepth,maxt,mint):
|
|
data = {}
|
|
print(precipitation)
|
|
match precipitation:
|
|
case "0":
|
|
precipitation = float(precipitation)
|
|
gaugeCatchIsTrace=False
|
|
case "T":
|
|
precipitation = float(0.00)
|
|
gaugeCatchIsTrace=True
|
|
case "0.0001":
|
|
precipitation = float(0.00)
|
|
gaugeCatchIsTrace=True
|
|
case "M":
|
|
precipitation = "NA"
|
|
gaugeCatchIsTrace=False
|
|
case "":
|
|
precipitation = "NA"
|
|
gaugeCatchIsTrace=False
|
|
case _:
|
|
|
|
if float(precipitation) >= 0:
|
|
precipitation = float(precipitation)
|
|
gaugeCatchIsTrace=False
|
|
else:
|
|
precipitation = "NA"
|
|
gaugeCatchIsTrace=False
|
|
match snowfall:
|
|
case "M":
|
|
snowfall = "NA"
|
|
snowfalltrace = False
|
|
case "T":
|
|
snowfall = 0.0
|
|
snowfalltrace = True
|
|
case "0.0001":
|
|
snowfall = 0.0
|
|
snowfalltrace = True
|
|
|
|
case _:
|
|
snowfall = round(float(snowfall),1)
|
|
snowfalltrace = False
|
|
|
|
match snowdepth:
|
|
case "M":
|
|
snowdepth = "NA"
|
|
snowdepthtrace = False
|
|
case "T":
|
|
snowdepth = 0.0
|
|
snowdepthtrace = True
|
|
case "0.0001":
|
|
snowdepth = 0.0
|
|
snowdepthtrace = True
|
|
case _:
|
|
snowdepth = round(float(snowdepth),1)
|
|
snowdepthtrace = False
|
|
station = "WV-KN-53"
|
|
entryDateTime=datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S")
|
|
notes="Maximum temperature: " + maxt + "F minimum temperature: " + mint + "F"
|
|
|
|
weatherdata = {
|
|
"id": 0,
|
|
"stationNumber": station,
|
|
"stationName": "South Charleston 0.3 SSW",
|
|
"obsDateTime": obtime,
|
|
"gaugeCatch": {
|
|
"sortValue": 0,
|
|
"precipValue": precipitation,
|
|
"formatValue": "0.00",
|
|
"value": precipitation,
|
|
"isTrace": gaugeCatchIsTrace,
|
|
"isSnowDepth": False,
|
|
"units": "US Units"
|
|
},
|
|
"snowfallDepth": {
|
|
"sortValue": None,
|
|
"precipValue": snowfall,
|
|
"formatValue": 0.0,
|
|
"value": snowfall,
|
|
"isTrace": snowfalltrace,
|
|
"isSnowDepth": True,
|
|
"units": "US Units"
|
|
},
|
|
"snowfallSwe": {
|
|
"sortValue": None,
|
|
"precipValue": 0,
|
|
"formatValue": "NA",
|
|
"value": None,
|
|
"isTrace": False,
|
|
"isSnowDepth": False,
|
|
"units": "US Units"
|
|
},
|
|
"snowpackDepth": {
|
|
"sortValue": None,
|
|
"precipValue": snowdepth,
|
|
"formatValue": 0.0,
|
|
"value": snowdepth,
|
|
"isTrace": snowdepthtrace,
|
|
"isSnowDepth": True,
|
|
"units": "US Units"
|
|
},
|
|
"snowpackSwe": {
|
|
"sortValue": None,
|
|
"precipValue": 0,
|
|
"formatValue": "NA",
|
|
"value": None,
|
|
"isTrace": False,
|
|
"isSnowDepth": False,
|
|
"units": "US Units"
|
|
},
|
|
"notes": notes,
|
|
"entryDateTime": entrytime,
|
|
"dateTimeStamp": "",
|
|
"units": "US Units"
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return weatherdata
|
|
|
|
|
|
|
|
def coco(data):
|
|
# Login URL
|
|
login_url = "https://mobile.cocorahs.org/login?_data=routes%2F_auth.login"
|
|
|
|
# Login Credentials
|
|
credentials = {
|
|
"username": "rlx.ops@noaa.gov",
|
|
"password": "rlx25303!",
|
|
}
|
|
|
|
# Headers for login request (simplified from the JS fetch headers)
|
|
headers = {
|
|
"accept": "*/*",
|
|
"accept-language": "en-US,en;q=0.9",
|
|
"content-type": "application/x-www-form-urlencoded;charset=UTF-8",
|
|
"sec-fetch-mode": "cors",
|
|
"sec-fetch-site": "same-origin"
|
|
}
|
|
|
|
# Prepare the payload for POST request
|
|
payload = urlencode(credentials)
|
|
|
|
# Session for maintaining cookies
|
|
session = requests.Session()
|
|
|
|
# Perform login
|
|
login_response = session.post(login_url, headers=headers, data=payload)
|
|
|
|
if login_response.status_code == 204: # Assuming 204 means success for login
|
|
url = "https://mobile.cocorahs.org/mydata/dailyprecip/add?_data=routes%2Fmydata.dailyprecip.add"
|
|
response = session.post(url, headers=headers, json=data)
|
|
if response.status_code == 200 or response.status_code == 204:
|
|
print("Data submitted successfully!")
|
|
print(response.text)
|
|
else:
|
|
print(f"Failed to submit data. Status code: {response.status_code}")
|
|
print(response.text)
|
|
|
|
|
|
else:
|
|
print("Login failed.")
|
|
|
|
|
|
|
|
def main():
|
|
data = getob(y, m, d) # This should return the expected data format
|
|
coco(data)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
|