Spaces:
Running
Running
| 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") | |
| 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"} |