Proxy de Flowsery Analytics con FastAPI
Enruta Flowsery Analytics a través de tu servidor FastAPI para evitar la interferencia de los adblockers y capturar datos de visitantes más precisos.
1. Instala las dependencias
pip install fastapi uvicorn httpx2. Configura el proxy
Agrega lo siguiente a tu aplicación FastAPI:
from fastapi import FastAPI, Request
from fastapi.responses import Response
import httpx
app = FastAPI()
def get_client_ip(request: Request) -> str:
"""Resolve the actual visitor IP address"""
# Prefer Cloudflare's CF-Connecting-IP if available
if cf_connecting_ip := request.headers.get("cf-connecting-ip"):
return cf_connecting_ip
# Then X-Real-IP
if x_real_ip := request.headers.get("x-real-ip"):
return x_real_ip
# Fall back to X-Forwarded-For (first entry)
if x_forwarded_for := request.headers.get("x-forwarded-for"):
return x_forwarded_for.split(",")[0].strip()
# Last resort: direct connection host
return request.client.host if request.client else ""
@app.get("/js/main.js")
async def proxy_script():
async with httpx.AsyncClient() as client:
response = await client.get('https://cdn.flowsery.com/main.js')
return Response(
content=response.content,
media_type='application/javascript',
headers={
'Cache-Control': 'public, max-age=31536000'
}
)
@app.post("/api/track")
async def proxy_events(request: Request):
body = await request.json()
# Determine the origin from the request or construct it from the base URL
origin = request.headers.get('origin') or str(request.base_url).rstrip('/')
# Resolve visitor IP for accurate geolocation
client_ip = get_client_ip(request)
async with httpx.AsyncClient() as client:
headers = {
'Content-Type': 'application/json',
'User-Agent': request.headers.get('user-agent'),
'Origin': origin,
'x-forwarded-for': client_ip
}
if client_ip:
# CRITICAL: Flowsery reads this as the authoritative visitor IP. Without it, every visitor resolves to your server's region.
headers['x-flowsery-real-ip'] = client_ip
response = await client.post(
'https://analytics.flowsery.com/analytics/events',
json=body,
headers=headers
)
return Response(
content=response.content,
media_type='application/json',
status_code=response.status_code
)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)Nota: Si tu aplicación ya tiene un endpoint /api/track, usa el atributo data-api en la etiqueta del script de Flowsery Analytics para dirigir los eventos a otra ruta. Por ejemplo, data-api="/flowsery-events" enviará los datos a /flowsery-events.
Importante: Si todos los visitantes aparecen en la misma ubicación en tu panel, confirma que el encabezado x-flowsery-real-ip se esté estableciendo con la IP real del visitante, no con la del servidor proxy, al reenviar solicitudes al endpoint /events de Flowsery Analytics. Si FastAPI está detrás de otro proxy, como Cloudflare o Vercel, request.client.host será la IP del proxy ascendente, así que debes leer directamente cf-connecting-ip o x-real-ip.
3. Modifica la etiqueta del script
Reemplaza el snippet original de Flowsery Analytics por la versión con proxy:
<script defer data-fl-website-id="flid_******" src="/js/main.js"></script>4. Despliega
Después de desplegar tu servidor, la configuración del proxy se activa automáticamente.
Confirmar que funciona
Para validar que el proxy funciona correctamente:
- Navega a tu sitio web.
- Abre las herramientas de desarrollo del navegador y ve a la pestaña Network.
- Verifica que las solicitudes de analítica se sirvan desde tu dominio y no desde
analytics.flowsery.com.