Refactor API key handling and improve logging in weather script

This commit is contained in:
vista-man
2025-01-28 14:02:40 +01:00
parent 2f8a0c1a78
commit 50a906a9a5

View File

@@ -3,89 +3,75 @@ import time
import sys import sys
import os import os
# Klasse om te loggen naar meerdere bestanden
class Tee: class Tee:
def __init__(self, *files): def __init__(self, *files):
# Initialiseer met een lijst van bestandobjecten om naar te schrijven
self.files = files self.files = files
def write(self, obj): def write(self, obj):
# Schrijf het gegeven object naar alle bestanden en flush de output
for f in self.files: for f in self.files:
f.write(obj) f.write(obj)
f.flush() f.flush()
def flush(self): def flush(self):
# Flush de output voor alle bestanden
for f in self.files: for f in self.files:
f.flush() f.flush()
def close(self): def close(self):
# Sluit alle bestanden
for f in self.files: for f in self.files:
f.close() f.close()
# Functie om de breedte- en lengtegraad van een stad op te halen met de OpenWeatherMap API
def get_coordinates(city_name): def get_coordinates(city_name):
api_key = 'cf2b92cba5cdb89baccb2fe05cacb3a5' # API-sleutel voor OpenWeatherMap api_key = os.getenv('OPENWEATHERMAP_API_KEY', 'default_api_key')
base_url = 'http://api.openweathermap.org/geo/1.0/direct' # Basis-URL voor geocoding API base_url = 'http://api.openweathermap.org/geo/1.0/direct'
params = { params = {
'q': city_name, # Stadnaam om te queryen 'q': city_name,
'appid': api_key # API-sleutel parameter 'appid': api_key
} }
response = requests.get(base_url, params=params) # Maak een GET-verzoek naar de API response = requests.get(base_url, params=params)
if response.status_code == 200: if response.status_code == 200:
data = response.json() # Parse de JSON-respons data = response.json()
if data: if data:
# Retourneer de breedte- en lengtegraad van het eerste resultaat
return data[0]['lat'], data[0]['lon'] return data[0]['lat'], data[0]['lon']
else: else:
# Print een foutmelding als de stad niet gevonden is
print(f"Stad {city_name} niet gevonden.") print(f"Stad {city_name} niet gevonden.")
return None, None return None, None
else: else:
# Print een foutmelding als het API-verzoek mislukt
print(f"Kon de coördinaten voor stad {city_name} niet ophalen. Foutcode: {response.status_code}") print(f"Kon de coördinaten voor stad {city_name} niet ophalen. Foutcode: {response.status_code}")
return None, None return None, None
# Functie om de weersgegevens voor gegeven coördinaten op te halen met de OpenWeatherMap API
def get_weather(lat, lon, city_name): def get_weather(lat, lon, city_name):
api_key = 'cf2b92cba5cdb89baccb2fe05cacb3a5' # API-sleutel voor OpenWeatherMap api_key = os.getenv('OPENWEATHERMAP_API_KEY', 'default_api_key')
base_url = 'https://api.openweathermap.org/data/2.5/weather' # Basis-URL voor weer API base_url = 'https://api.openweathermap.org/data/2.5/weather'
params = { params = {
'lat': lat, # Breedtegraad parameter 'lat': lat,
'lon': lon, # Lengtegraad parameter 'lon': lon,
'appid': api_key, # API-sleutel parameter 'appid': api_key,
'units': 'metric' # Eenheden parameter om temperatuur in Celsius te krijgen 'units': 'metric'
} }
response = requests.get(base_url, params=params) # Maak een GET-verzoek naar de API response = requests.get(base_url, params=params)
if response.status_code == 200: if response.status_code == 200:
data = response.json() # Parse de JSON-respons data = response.json()
# Print de weersinformatie
print(f"Weer op coördinaten ({lat}, {lon}) in {city_name}:") print(f"Weer op coördinaten ({lat}, {lon}) in {city_name}:")
print(f"Temperatuur: {data['main']['temp']}°C") print(f"Temperatuur: {data['main']['temp']}°C")
print(f"Weer: {data['weather'][0]['description']}") print(f"Weer: {data['weather'][0]['description']}")
else: else:
# Print een foutmelding als het API-verzoek mislukt
print(f"Kon de weersgegevens voor coördinaten ({lat}, {lon}) niet ophalen. Foutcode: {response.status_code}") print(f"Kon de weersgegevens voor coördinaten ({lat}, {lon}) niet ophalen. Foutcode: {response.status_code}")
# Hoofdfunctie om de stadnaam van de gebruiker te vragen en de weersgegevens op te halen
if __name__ == "__main__": if __name__ == "__main__":
log_file_path = os.path.join(os.path.dirname(__file__), 'weather.log') log_file_path = os.path.join(os.path.dirname(__file__), 'weather.log')
if os.path.exists(log_file_path): if os.path.exists(log_file_path):
with open(log_file_path, 'a') as log_file: with open(log_file_path, 'a') as log_file:
log_file.write('\n') # Voeg 2 lege regels toe voordat nieuwe logs worden toegevoegd log_file.write('\n')
with open(log_file_path, 'a') as log_file: with open(log_file_path, 'a') as log_file:
city_name = input("Voer de naam van de stad in: ") # Vraag de gebruiker om een stadnaam in te voeren city_name = input("Voer de naam van de stad in: ")
lat, lon = get_coordinates(city_name) # Haal de coördinaten van de stad op lat, lon = get_coordinates(city_name)
if lat is not None and lon is not None: if lat is not None and lon is not None:
original_stdout = sys.stdout # Sla de originele stdout op original_stdout = sys.stdout
tee = Tee(original_stdout, log_file) tee = Tee(original_stdout, log_file)
sys.stdout = tee # Redirect stdout naar zowel terminal als logbestand sys.stdout = tee
get_weather(lat, lon, city_name) # Haal de weersgegevens voor de coördinaten op get_weather(lat, lon, city_name)
sys.stdout = original_stdout # Reset stdout naar origineel sys.stdout = original_stdout
# Wacht 5 seconden voordat het script wordt afgesloten om ervoor te zorgen dat alle logs zijn geschreven
time.sleep(5) time.sleep(5)
tee.close() # Sluit het Tee-object om ervoor te zorgen dat alle bestanden correct worden gesloten tee.close()