import os import requests from fastapi import FastAPI, Request from datetime import datetime, timezone, timedelta app = FastAPI() # Load Supabase environment variables SUPABASE_URL = os.getenv("SUPABASE_URL") SUPABASE_API_KEY = os.getenv("SUPABASE_API_KEY") @app.post("/webhook") async def receive_webhook(request: Request): payload = await request.json() print("📥 Webhook received:") gmt_plus_3 = timezone(timedelta(hours=3)) # Top-level fields print(f"Request ID: {payload.get('request_id')}") print(f"Object: {payload.get('object')}") print(f"Time (Unix): {payload.get('time')}") try: formatted_time = datetime.fromtimestamp(payload.get('time'), gmt_plus_3).strftime('%Y-%m-%d %H:%M:%S GMT+3') print(f"Time (Formatted): {formatted_time}") except Exception: print("Time (Formatted): Invalid timestamp") print("----") # Loop through entries for entry in payload.get('entry', []): lead_id = entry.get('id') campaign_id = entry.get('campaign_id') campaign_name = entry.get('campaign_name') adset_id = entry.get('adgroup_id') adset_name = entry.get('adgroup_name') ad_id = entry.get('ad_id') ad_name = entry.get('ad_name') advertiser_id = entry.get('advertiser_id') create_ts = entry.get('create_time') print(f"Lead ID: {lead_id}") print(f"Campaign ID: {campaign_id}") print(f"Campaign Name: {campaign_name}") print(f"Ad Group ID: {adset_id}") print(f"Ad Group Name: {adset_name}") print(f"Ad ID: {ad_id}") print(f"Ad Name: {ad_name}") try: formatted_create_time = datetime.fromtimestamp(create_ts, gmt_plus_3).isoformat() print(f"Create Time: {formatted_create_time}") except Exception: formatted_create_time = None print("Create Time: Invalid") # Extract lead fields field_map = {} for change in entry.get('changes', []): field = change.get('field').lower() value = change.get('value') field_map[field] = value print(f"{field}: {value}") print("----") # Prepare data for Supabase insertion insert_data = { "platform": "tiktok", "campaign_id": campaign_id, "campaign_name": campaign_name, "adset_id": adset_id, "adset_name": adset_name, "ad_id": ad_id, "lead_id": lead_id, "full_name": field_map.get("name"), "email": field_map.get("email"), "phone": field_map.get("phone_number"), "city": field_map.get("city"), "lead_timestamp": formatted_create_time } headers = { "apikey": SUPABASE_API_KEY, "Authorization": f"Bearer {SUPABASE_API_KEY}", "Content-Type": "application/json" } supa_resp = requests.post( f"{SUPABASE_URL}/rest/v1/binrushdleads", headers=headers, json=insert_data ) print("💾 Supabase insert status:", supa_resp.status_code) if supa_resp.status_code == 201: print("✅ Lead inserted successfully.") else: try: print("❌ Supabase Error:", supa_resp.json()) except Exception: print("❌ Supabase Response:", supa_resp.text) return {"status": "ok"}