Proxy do Flowsery Analytics com Flask
Encaminhe o Flowsery Analytics através da sua aplicação Flask para evitar interferência de bloqueadores de anúncios e capturar dados de visitantes mais precisos.
1. Instalar dependências
pip install flask requests2. Configurar o proxy
Adicione as seguintes rotas e função auxiliar à sua aplicação Flask:
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: Se a sua aplicação já tiver um endpoint /api/track, use o atributo data-api na tag de script do Flowsery Analytics para enviar eventos para outro caminho. Por exemplo, data-api="/flowsery-events" encaminha os dados para /flowsery-events.
Importante: Se todos os visitantes aparecerem na mesma localização no seu painel, confirme que o cabeçalho x-flowsery-real-ip está a ser definido com o IP real do visitante (e não com o IP do servidor proxy) ao encaminhar pedidos para o endpoint /events do Flowsery Analytics.
3. Modificar a tag de script
Substitua o snippet original do Flowsery Analytics pela versão com proxy:
<script defer data-fl-website-id="flid_******" src="/js/main.js"></script>4. Fazer deploy
Depois de fazer deploy do seu servidor, a configuração do proxy é ativada automaticamente.
Confirmar que funciona
Para validar que o proxy está a funcionar corretamente:
- Navegue até ao seu site
- Abra as ferramentas de desenvolvedor do navegador e mude para o separador Network
- Verifique que os pedidos de analytics são servidos a partir do seu domínio em vez de
analytics.flowsery.com
Resolução de problemas
Todos os visitantes aparecem da mesma localização
Quando todos os visitantes mostram uma única localização geográfica (normalmente a região do seu servidor), o proxy não está a encaminhar corretamente os IPs reais dos visitantes.
Resolução:
- Garanta que o seu proxy inclui o cabeçalho
x-flowsery-real-ipcom o endereço IP real do visitante (e não o IP do servidor) ao encaminhar pedidos para o endpoint/eventsdo Flowsery Analytics. - Se o Flask estiver atrás de outro proxy (Cloudflare, Vercel, etc.),
request.remote_addrserá o proxy a montante. Leia antesrequest.headers.get('CF-Connecting-IP')ourequest.headers.get('X-Real-IP').