123 lines
4.3 KiB
Python
123 lines
4.3 KiB
Python
import os
|
|
import json
|
|
import requests
|
|
from datetime import datetime
|
|
|
|
from weather.db import (
|
|
get_db, close_db
|
|
)
|
|
|
|
def fetchHourlyForecasts():
|
|
try:
|
|
remote_url = 'https://api.weather.gov/gridpoints/SLC/106,146/forecast/hourly'
|
|
headers = {
|
|
"User-Agent": "Brian's Python API test (captbrogers@gmail.com)"
|
|
}
|
|
response = requests.get(remote_url, headers=headers)
|
|
response.raise_for_status()
|
|
|
|
current_date = datetime.now()
|
|
if not os.path.exists(f"data/{current_date.strftime('%Y-%m-%d')}"):
|
|
os.makedirs(f"data/{current_date.strftime('%Y-%m-%d')}", exist_ok=True)
|
|
|
|
hourly_filename = f"data/{current_date.strftime('%Y-%m-%d')}/hourly_{current_date.strftime('%H')}.json"
|
|
with open(hourly_filename, 'w') as json_file:
|
|
json.dump(response.json(), json_file, indent=4)
|
|
|
|
|
|
db = get_db()
|
|
cursor = db.cursor()
|
|
insert_sql = """
|
|
INSERT INTO `current_forecasts`
|
|
(
|
|
`start_time`,
|
|
`end_time`,
|
|
`is_daytime`,
|
|
`temperature`,
|
|
`precipitation_probability`,
|
|
`relative_humidity`,
|
|
`wind_speed`,
|
|
`wind_direction`,
|
|
`icon_url`,
|
|
`short_forecast`,
|
|
`detailed_forecast`,
|
|
`created_at`
|
|
) VALUES (
|
|
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?
|
|
)
|
|
"""
|
|
|
|
for forecast in response.json()['properties']['periods']:
|
|
# TODO: this should be a transaction with rollback, pretty hacky right now
|
|
cursor.execute(insert_sql, (
|
|
datetime.strptime(forecast['startTime'], "%Y-%m-%dT%H:%M:%S%z").strftime("%Y-%m-%d %H:%M:%S"),
|
|
datetime.strptime(forecast['endTime'], "%Y-%m-%dT%H:%M:%S%z").strftime("%Y-%m-%d %H:%M:%S"),
|
|
forecast['isDaytime'],
|
|
forecast['temperature'],
|
|
forecast['probabilityOfPrecipitation']['value'],
|
|
forecast['relativeHumidity']['value'],
|
|
forecast['windSpeed'],
|
|
forecast['windDirection'],
|
|
forecast['icon'],
|
|
forecast['shortForecast'],
|
|
forecast['detailedForecast'],
|
|
datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
))
|
|
db.commit()
|
|
|
|
close_db()
|
|
except requests.exceptions.RequestException as e:
|
|
return str(e)
|
|
|
|
|
|
|
|
def fetchDailyForecasts():
|
|
try:
|
|
remote_url = 'https://api.weather.gov/gridpoints/SLC/106,146/forecast'
|
|
headers = {
|
|
"User-Agent": "Brian's Python API test (captbrogers@gmail.com)"
|
|
}
|
|
response = requests.get(remote_url, headers=headers)
|
|
response.raise_for_status()
|
|
|
|
current_date = datetime.now()
|
|
if not os.path.exists(f"data/{current_date.strftime('%Y-%m-%d')}"):
|
|
os.makedirs(f"data/{current_date.strftime('%Y-%m-%d')}", exist_ok=True)
|
|
|
|
daily_filename = f"data/{current_date.strftime('%Y-%m-%d')}/daily_{current_date.strftime('%H')}.json"
|
|
with open(daily_filename, 'w') as json_file:
|
|
json.dump(response.json(), json_file, indent=4)
|
|
|
|
db = get_db()
|
|
cursor = db.cursor()
|
|
insert_sql = """
|
|
INSERT INTO `daily_forecasts`
|
|
(
|
|
`forecasted_date`,
|
|
`temperature_high`,
|
|
`precipitation_probability`,
|
|
`icon_url`,
|
|
`short_forecast`,
|
|
`created_at`
|
|
) VALUES (
|
|
?, ?, ?, ?, ?, ?
|
|
)
|
|
"""
|
|
|
|
for forecast in response.json()['properties']['periods']:
|
|
if forecast['isDaytime']:
|
|
# TODO: this should be a transaction with rollback
|
|
cursor.execute(insert_sql, (
|
|
datetime.strptime(forecast['startTime'], "%Y-%m-%dT%H:%M:%S%z").strftime("%Y-%m-%d %H:%M:%S"),
|
|
forecast['temperature'],
|
|
forecast['probabilityOfPrecipitation']['value'],
|
|
forecast['icon'],
|
|
forecast['shortForecast'],
|
|
datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
|
|
))
|
|
db.commit()
|
|
|
|
close_db()
|
|
except requests.exceptions.RequestException as e:
|
|
return str(e)
|