Files

55 lines
1.9 KiB
Python

"""
Weather module for entropy generation
"""
import time
import hashlib
import random
import openmeteo_requests
import requests_cache
from retry_requests import retry
from .constants import OPENMETEO_API_URL, OPENMETEO_HOURLY_PARAMS
class Weather:
"""Handles weather data retrieval for entropy generation"""
def __init__(self):
self.api_url = OPENMETEO_API_URL
self.hourly_params = OPENMETEO_HOURLY_PARAMS
def _fetch_weather_api(self, params):
"""Internal function to make Open-Meteo API requests"""
cache_session = requests_cache.CachedSession('.cache', expire_after=60)
retry_session = retry(cache_session, retries=2, backoff_factor=0.2)
openmeteo = openmeteo_requests.Client(session=retry_session)
return openmeteo.weather_api(self.api_url, params=params)
def _get_weather_data(self):
"""Internal function that retrieves weather data from API"""
params = {
"latitude": random.uniform(-70, 70),
"longitude": random.uniform(-180, 180),
"hourly": random.sample(self.hourly_params, random.randint(3, 6)),
"timezone": "auto"
}
responses = self._fetch_weather_api(params)
entropy_values = []
for i in range(len(params["hourly"])):
var_values = responses[0].Hourly().Variables(i).ValuesAsNumpy()
entropy_values.extend(var_values.tolist())
weather_str = "".join([str(v) for v in entropy_values])
return hashlib.sha256(weather_str.encode()).hexdigest()
def get_weather_entropy(self):
"""Retrieves weather data as additional source of entropy"""
try:
return self._get_weather_data()
except Exception as e:
print(f"Error retrieving weather data: {e}")
fallback = f"weather_fallback_{time.time()}_{random.getrandbits(64)}"
return hashlib.sha256(fallback.encode()).hexdigest()