> ## Documentation Index
> Fetch the complete documentation index at: https://docs.qwairy.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Cloudflare Worker

> Déployez le collecteur edge généré par Qwairy sur une route Cloudflare Worker et vérifiez la livraison des crawlers en toute sécurité.

Utilisez le collecteur Cloudflare Worker lorsque le site suivi passe par le proxy de Cloudflare mais que Cloudflare Logpush n’est pas la source de livraison choisie. Le Worker filtre les User-Agents de crawlers d’IA connus, transmet la requête à l’origine et signale à Qwairy les réponses de pages éligibles.

<Warning>
  Utilisez la clé **Cloudflare Worker** créée par cette configuration. Une clé Cloudflare Logpush ou HTTP générique relève d’un autre contrat de fournisseur et est rejetée ou écartée par ce point de terminaison.
</Warning>

## Avant de commencer

Il vous faut :

* un accès à **Measure > Analytics des crawlers > Paramètres** pour la marque ;
* un Cloudflare Worker rattaché au nom d’hôte configuré pour cette marque ;
* l’autorisation de créer un secret Worker chiffré et de rattacher une route de production ;
* une page de test qui renvoie `text/html` ou `text/plain`.

N’activez qu’une seule source de livraison par marque. Faire fonctionner ce Worker en parallèle d’un autre collecteur actif peut dupliquer les observations.

## Créer et protéger la clé

1. Dans les paramètres d’Analytics des crawlers, sélectionnez **Cloudflare Worker**.
2. Sélectionnez **Créer une clé**.
3. Saisissez un nom descriptif et le fuseau horaire IANA utilisé pour les analytics quotidiennes.
4. Copiez le secret en clair lorsqu’il apparaît. Qwairy n’en affiche ensuite que le préfixe.
5. Enregistrez-le comme secret Worker chiffré `QWAIRY_API_KEY`.

Ne placez la clé ni dans le code source du Worker, ni dans des variables d’environnement ordinaires, ni dans des URL de requête, ni dans du code exécuté dans le navigateur, ni dans des logs. Laissez `QWAIRY_ENDPOINT` non défini, sauf si Qwairy vous indique explicitement un autre point de terminaison.

## Déployer le Worker généré

Créez `worker.js` avec la recette générée par la configuration actuelle de Qwairy :

```javascript theme={null}
/**
 * Qwairy Crawler Analytics - Cloudflare Worker
 *
 * Setup:
 * 1. Create a new Worker in Cloudflare dashboard
 * 2. Set environment variables: QWAIRY_API_KEY, QWAIRY_ENDPOINT (optional)
 * 3. Deploy to a route (e.g., yourdomain.com/*)
 */

const IGNORE_EXTENSIONS = /\.(?:png|jpe?g|gif|svg|webp|ico|mp4|webm|css|js|json|xml|woff2?|ttf|eot|map)$/i;
const IGNORE_PATHS = [/^\/api\//i, /^\/dashboard\//i, /^\/_next\//i, /^\/favicon/i];
const AI_CRAWLER_UA = /(?:^|[^a-z0-9_-])(?:Claude-SearchBot|MistralAI-Index|OAI-SearchBot|PerplexityBot|ChatGPT-User|Google-GeminiNotebook|Google-NotebookLM|Google-Agent|MistralAI-User|Perplexity-User|Claude-User|Google-CloudVertexBot|ClaudeBot|GPTBot|GrokBot|meta-webindexer|Amzn-User|Meta-ExternalFetcher|AI2Bot|Ai2Bot-Dolma|Amazonbot|Bytespider|CCBot|Meta-ExternalAgent|DuckAssistBot|KimiBot|Kimi-SearchBot|YouBot|Kimi-User|Diffbot|Kangaroo Bot|omgili|omgilibot|PanguBot|Timpibot|Webzio-Extended)(?=$|[^a-z0-9_-])/i;

export default {
  async fetch(request, env, ctx) {
    const url = new URL(request.url);
    const pathname = url.pathname;
    const userAgent = request.headers.get('User-Agent') || '';

    if (!AI_CRAWLER_UA.test(userAgent) || IGNORE_EXTENSIONS.test(pathname) || IGNORE_PATHS.some(r => r.test(pathname))) {
      return fetch(request);
    }

    const response = await fetch(request);
    const contentType = response.headers.get('content-type')?.split(';')[0];
    if (!contentType || !['text/html', 'text/plain'].includes(contentType)) {
      return response;
    }

    const apiKey = env.QWAIRY_API_KEY;
    const endpoint = env.QWAIRY_ENDPOINT || 'https://www.qwairy.co/api/v1/logs/cloudflare';
    if (!apiKey) return response;

    ctx.waitUntil(
      fetch(endpoint, {
        method: 'POST',
        headers: { 'Content-Type': 'application/json', 'X-API-Key': apiKey },
        body: JSON.stringify({
          status_code: response.status,
          request_method: request.method,
          request_path: pathname,
          hostname: request.headers.get('Host') || url.hostname,
          user_agent: userAgent,
          timestamp: new Date().toISOString(),
        }),
      }).catch(err => console.error('Qwairy: Failed to send log', err))
    );

    return response;
  },
};
```

Ensuite :

1. Collez la recette dans le Worker.
2. Ajoutez `QWAIRY_API_KEY` comme secret chiffré avec la valeur Qwairy affichée une seule fois.
3. Rattachez le Worker à la route de production exacte à suivre, par exemple `www.example.com/*`.
4. Déployez le Worker et vérifiez que les requêtes normales reçoivent toujours la réponse de l’origine.

La recette générée n’envoie que le chemin, pas la chaîne de requête. Vérifiez la structure de vos chemins et ajoutez des exclusions dans Qwairy si des segments peuvent contenir des identifiants sensibles.

## Vérifier la livraison

Utilisez une page dédiée qui renvoie du HTML et remplacez le nom d’hôte d’exemple. Cette requête synthétique crée une observation de crawler dans le jour analytique en cours :

```bash theme={null}
curl --user-agent "Mozilla/5.0 (compatible; GPTBot/1.1)" \
  --output /dev/null \
  --write-out "%{http_code}\n" \
  "https://www.example.com/docs/qwairy-collector-check"
```

1. Vérifiez que la commande renvoie le statut attendu de l’origine.
2. Dans Qwairy, attendez que le connecteur passe de l’état en attente à connecté une fois l’événement accepté intégré à un agrégat quotidien.
3. Ouvrez le jour analytique en cours et cherchez `/docs/qwairy-collector-check`.
4. Si le connecteur reste en attente, cherchez `Qwairy: Failed to send log` dans les logs du Worker, puis vérifiez la route, le secret, le nom d’hôte, le User-Agent et le type de contenu de la réponse.

Une réponse de l’origine prouve seulement que le chemin proxy du Worker fonctionne. Elle ne prouve pas que Qwairy a accepté et agrégé l’événement.

## Limites et comportement

* La recette ne signale que les User-Agents correspondants, sur des chemins non ignorés, dont la réponse d’origine est `text/html` ou `text/plain`.
* La recette peut tenter une livraison pour d’autres méthodes HTTP, mais Qwairy n’accepte que les enregistrements `GET` et `HEAD` pour l’agrégation.
* Les extensions de fichiers statiques et les chemins `/api/`, `/dashboard/`, `/_next/` et `/favicon` sont ignorés par le code généré.
* Le Worker envoie une requête à Qwairy par réponse d’origine correspondante. Il n’a ni file d’attente de livraison ni boucle de renvoi : des pannes réseau peuvent créer des trous.
* La route d’intégration accepte une rafale de 120 requêtes d’ingestion par minute. Elle peut accuser réception de livraisons du Worker au-delà de cette limite sans les agréger : vérifiez les alertes de couverture après des pics de trafic.
* Qwairy applique après réception son registre de crawlers, les vérifications de nom d’hôte, les exclusions, la fenêtre d’arrivée tardive et les plafonds d’ingestion.
* Les plafonds techniques partagés sont de 10 000 000 événements par intégration et par jour, et de 200 000 000 événements par équipe facturée et par jour.
* Le collecteur observe des requêtes. Il ne prouve ni l’indexation, ni l’entraînement d’un modèle, ni l’utilisation en citation.

## Renouveler ou revenir en arrière

Pour renouveler la clé, créez une clé de remplacement dans Qwairy, mettez à jour le secret Worker chiffré, déployez, vérifiez une nouvelle observation acceptée, puis supprimez l’ancienne clé.

Pour retirer le collecteur :

1. Détachez la route du Worker ou désactivez son déploiement.
2. Vérifiez que l’origine sert toujours le trafic normal et qu’aucune nouvelle observation du Worker n’arrive.
3. Supprimez le secret du Worker.
4. Révoquez la clé Qwairy correspondante.

Désactiver la livraison crée un trou de couverture dans les analytics. Vérifiez les alertes de continuité de livraison avant de comparer des périodes qui encadrent ce retour en arrière.

## Pages associées

* [Analytics des crawlers](/fr/documentation/measure/crawler-analytics)
* [Cloudflare Logpush](/fr/documentation/measure/crawler-analytics/connectors/cloudflare)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.