Soporte/Guías de proxy
Guías de proxy

Proxy de Flowsery Analytics con Flask

Enruta Flowsery Analytics a través de tu aplicación Flask para evitar la interferencia de los adblockers y capturar datos de visitantes más precisos.

1. Instala las dependencias

Terminal
pip install flask requests

2. Configura el proxy

Agrega las siguientes rutas y la función auxiliar a tu app de Flask:

Python
from flask import Flask, request, Response
import requests
 
app = Flask(__name__)
 
 
def get_client_ip():
    """
    Determine the actual visitor IP address.
    When behind Cloudflare, prefer CF-Connecting-IP. Then X-Real-IP.
    Then X-Forwarded-For's first entry. Finally fall back to request.remote_addr.
    """
    cf_ip = request.headers.get("CF-Connecting-IP")
    if cf_ip:
        return cf_ip
    real_ip = request.headers.get("X-Real-IP")
    if real_ip:
        return real_ip
    xff = request.headers.get("X-Forwarded-For")
    if xff:
        # Comma-separated list: "client, proxy1, proxy2"
        parts = [ip.strip() for ip in xff.split(",")]
        if parts:
            return parts[0]  # the leftmost entry is the original client
    return request.remote_addr
 
 
@app.route("/js/main.js")
def proxy_script():
    response = requests.get("https://cdn.flowsery.com/main.js")
    return Response(
        response.content,
        content_type="application/javascript",
        headers={"Cache-Control": "public, max-age=31536000"},
    )
 
 
@app.route("/api/track", methods=["POST"])
def proxy_events():
    # Copy incoming headers but omit those that should match the target
    excluded = {"host", "content-length"}
    headers = {
        key: value
        for key, value in request.headers.items()
        if key.lower() not in excluded
    }
 
    # The Origin header is required by the Flowsery Analytics API
    if "Origin" not in headers:
        scheme = request.scheme
        host = request.host
        headers["Origin"] = f"{scheme}://{host}"
 
    # Attach the real visitor IP for accurate geolocation
    client_ip = get_client_ip()
    headers["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
 
    # Forward the request body and headers to Flowsery Analytics
    response = requests.post(
        "https://analytics.flowsery.com/analytics/events",
        data=request.get_data(),
        headers=headers,
        timeout=5,
    )
 
    # Return the upstream response to the browser
    return Response(
        response.content,
        status=response.status_code,
        content_type=response.headers.get("Content-Type", "application/json"),
    )

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 enviar los eventos a otra ruta. Por ejemplo, data-api="/flowsery-events" dirigirá 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.

3. Modifica la etiqueta del script

Reemplaza el snippet original de Flowsery Analytics por la versión con proxy:

HTML
<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:

  1. Navega a tu sitio web.
  2. Abre las herramientas de desarrollo del navegador y ve a la pestaña Network.
  3. Verifica que las solicitudes de analítica se sirvan desde tu dominio y no desde analytics.flowsery.com.

Solución de problemas

Todos los visitantes aparecen desde la misma ubicación

Cuando todos los visitantes muestran una única ubicación geográfica, normalmente la región de tu servidor, el proxy no está reenviando correctamente las IP reales.

Resolución:

  1. Asegúrate de que tu proxy incluya el encabezado x-flowsery-real-ip con la IP real del visitante, no con la IP del servidor, al reenviar solicitudes al endpoint /events de Flowsery Analytics.
  2. Si Flask está detrás de otro proxy, como Cloudflare o Vercel, request.remote_addr será la IP del proxy ascendente, así que usa directamente request.headers.get('CF-Connecting-IP') o request.headers.get('X-Real-IP').