import requests import json import time import os from pathlib import Path from dotenv import load_dotenv # Load environment variables from root .env file load_dotenv(Path(__file__).resolve().parent.parent / '.env') # Load API Key API_KEY = os.environ.get("ALPHAVANTAGE_API_KEY", "") if not API_KEY: print("⚠️ API key not found! Please set ALPHAVANTAGE_API_KEY in the root .env file.") SYMBOL = "AAPL" DATA_FILE = "aapl_data.json" def fetch_data(function, symbol=None): url = f"https://www.alphavantage.co/query?function={function}&apikey={API_KEY}" if symbol: url += f"&symbol={symbol}" print(f"Fetching {function}...") try: response = requests.get(url) if response.status_code == 200: data = response.json() # Check for rate limit message or error if "Information" in data and "rate limit" in data["Information"]: print(f"Rate limit hit for {function}") return None if "Error Message" in data: print(f"Error fetching {function}: {data['Error Message']}") return None return data else: print(f"Error fetching {function}: {response.status_code}") return None except Exception as e: print(f"Exception fetching {function}: {e}") return None def main(): if os.path.exists(DATA_FILE): with open(DATA_FILE, "r") as f: data = json.load(f) else: data = {} endpoints = [ ("OVERVIEW", SYMBOL), ("INCOME_STATEMENT", SYMBOL), ("BALANCE_SHEET", SYMBOL), ("CASH_FLOW", SYMBOL), ("TREASURY_YIELD", None) ] for function, sym in endpoints: # Check if we already have valid data if function in data and "Information" not in data[function]: print(f"Data for {function} already exists.") continue # Fetch data result = fetch_data(function, sym) if result: data[function] = result # Save immediately with open(DATA_FILE, "w") as f: json.dump(data, f, indent=4) print(f"Saved {function}") else: print(f"Failed to fetch {function}") # Wait to avoid rate limits (free tier is 5 calls/minute, so 12s delay is safe) print("Waiting 15 seconds...") time.sleep(15) if __name__ == "__main__": main()