# weatherr.py import requests import os from dotenv import load_dotenv load_dotenv() # Replace with your API keys OPENCAGE_API_KEY = os.getenv("OPENCAGE_API_KEY") OPENWEATHER_API_KEY = os.getenv("OPENWEATHER_API_KEY") def get_weather( latitude: float = None, longitude: float = None, address: str = None, district: str = None, state: str = None, units: str = "metric" # "metric" or "imperial" ) -> dict: """ Fetch current weather using coordinates or location name (address/district/state). Returns structured weather info from OpenWeatherMap. """ # Step 1: Determine coordinates if latitude is None or longitude is None: if address: query = address elif district and state: query = f"{district}, {state}" elif district: query = district else: return {"error": "Provide either coordinates or location name (address/district+state)."} # Use OpenCageData geocoding geocode_url = "https://api.opencagedata.com/geocode/v1/json" params = { "q": query, "key": OPENCAGE_API_KEY, "limit": 1, "no_annotations": 1 } try: resp = requests.get(geocode_url, params=params, timeout=10) resp.raise_for_status() data = resp.json() if data["results"]: latitude = data["results"][0]["geometry"]["lat"] longitude = data["results"][0]["geometry"]["lng"] else: return {"error": f"Location not found: {query}"} except Exception as e: return {"error": f"Geocoding error: {e}"} # Step 2: Fetch weather from OpenWeatherMap weather_url = "https://api.openweathermap.org/data/2.5/weather" params = { "lat": latitude, "lon": longitude, "appid": OPENWEATHER_API_KEY, "units": units } try: resp = requests.get(weather_url, params=params, timeout=10) resp.raise_for_status() return {"success": True, "data": resp.json()} except Exception as e: return {"error": f"Weather API error: {e}"} # Example usage: if __name__ == "__main__": res = get_weather(district="Bilaspur", state="Chhattisgarh") res2 = get_weather(latitude=22.0934, longitude=82.1564) res3 = get_weather(address="Bilaspur, Chhattisgarh") print(res) print(res2) print(res3)