Proxy Flowsery Analytics avec FastAPI
Faites transiter Flowsery Analytics via votre serveur FastAPI afin d'eviter les interferences des bloqueurs de publicites et de capturer des donnees visiteurs plus precises.
1. Installer les dependances
pip install fastapi uvicorn httpx2. Mettre en place le proxy
Ajoutez ce qui suit a votre application 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)Remarque : si votre application possede deja un endpoint /api/track, utilisez l'attribut data-api sur la balise script Flowsery Analytics pour envoyer les evenements vers un autre chemin. Par exemple, data-api="/flowsery-events" envoie les donnees vers /flowsery-events.
Important : si tous les visiteurs apparaissent au meme endroit dans votre tableau de bord, verifiez que l'en-tete x-flowsery-real-ip est bien defini sur la vraie IP du visiteur (et non celle du serveur proxy) lors du transfert des requetes vers le endpoint /events de Flowsery Analytics. Si FastAPI est derriere un autre proxy (Cloudflare, Vercel, etc.), request.client.host sera l'IP du proxy amont : lisez plutot cf-connecting-ip ou x-real-ip.
3. Modifier la balise script
Remplacez le snippet Flowsery Analytics par la version proxifiee :
<script defer data-fl-website-id="flid_******" src="/js/main.js"></script>4. Deployer
Apres le deploiement de votre serveur, la configuration proxy s'active automatiquement.
Verifier que cela fonctionne
Pour valider le bon fonctionnement du proxy :
- Ouvrez votre site web
- Ouvrez les outils de developpement de votre navigateur et passez a l'onglet Reseau
- Verifiez que les requetes analytics sont servies depuis votre domaine plutot que depuis analytics.flowsery.com