import os import json import redis import requests from fastapi import FastAPI from fastapi.responses import JSONResponse # ๐ŸŒ Redis config REDIS_URL = os.environ.get("UPSTASH_REDIS_URL", "redis://localhost:6379") WHATSAPP_API_URL = os.environ.get("WHATSAPP_API_URL", "https://api.gupshup.io/sm/api/v1/msg") WHATSAPP_TOKEN = os.environ.get("WHATSAPP_TOKEN", "sk_e73f674b797549ed80c85105ded5a0d1") WHATSAPP_TO_NUMBER = os.environ.get("WHATSAPP_TO_NUMBER", "353899495777") # e.g., "91xxxxxxxxxx" GUPSHUP_SOURCE_NUMBER = os.environ.get("GUPSHUP_SOURCE_NUMBER", "+1 555-792-6439") # e.g., your WABA number GUPSHUP_APP_NAME = os.environ.get("GUPSHUP_APP_NAME", "NuseAI") # e.g., your Gupshup app name # โœ… Redis connection redis_client = redis.Redis.from_url(REDIS_URL, decode_responses=True) # ๐Ÿงพ Fetch and format headlines def fetch_cached_headlines() -> str: try: raw = redis_client.get("daily_news_headline_json") if not raw: return "โš ๏ธ No daily headlines found in cache." data = json.loads(raw) except Exception as e: return f"โŒ Error reading from Redis: {e}" message = ["๐Ÿ—ž๏ธ *Your Daily Digest* ๐ŸŸก\n"] for topic, stories in data.items(): title = topic.replace("_", " ").title() message.append(f"๐Ÿท๏ธ *{title}*") for ref, item in stories.items(): summary = item.get("summary", "") explanation = item.get("explanation", "") message.append(f"{ref}. {summary}\n_Why this matters_: {explanation}") message.append("") # spacing between sections return "\n".join(message) # ๐Ÿ“ค Send via Gupshup WhatsApp API def send_to_whatsapp(message_text: str) -> dict: headers = { "Content-Type": "application/x-www-form-urlencoded" } payload = { "channel": "whatsapp", "source": GUPSHUP_SOURCE_NUMBER, "destination": WHATSAPP_TO_NUMBER, "message": json.dumps({ "type": "text", "text": message_text }), "src.name": GUPSHUP_APP_NAME, } response = requests.post( WHATSAPP_API_URL, headers=headers, data=payload, auth=(WHATSAPP_TOKEN, '') # Gupshup uses Basic Auth (API key as username) ) if response.status_code == 200: return {"status": "success", "details": response.json()} else: return {"status": "failed", "error": response.text, "code": response.status_code} # ๐Ÿš€ FastAPI App app = FastAPI() @app.get("/send-daily-whatsapp") def send_daily_whatsapp_digest(): message = fetch_cached_headlines() if message.startswith("โŒ") or message.startswith("โš ๏ธ"): return JSONResponse(status_code=404, content={"error": message}) result = send_to_whatsapp(message) return result # ๐Ÿงช For local testing if __name__ == "__main__": msg = fetch_cached_headlines() print("--- WhatsApp Message Preview ---\n") print(msg) result = send_to_whatsapp(msg) print(result)