Geonode logo
Geonode Team

Geonode Team

Mis à jour : 7 octobre 2026

Publié : 2 septembre 2026

Comment définir un User-Agent personnalisé avec curl (+ exemples)

`curl -A "MyBot/1.0" https://example.com` définit l'en-tête User-Agent. Voilà pour la syntaxe ; la question intéressante est de savoir quelle valeur y inscrire. La réponse instinctive — copier une chaîne de caractères de Chrome — est souvent erronée, car elle crée une contradiction entre ce que vous prétendez être et ce que votre connexion est manifestement. Ce guide aborde la syntaxe, le cas de suppression et la stratégie plus utile consistant à s’identifier honnêtement.

Notre position, en toute simplicité : nous sommes Geonode et nous vendons des proxys ; les questions relatives à l'agent utilisateur accompagnent généralement celles du type « pourquoi suis-je bloqué ? ». La réponse honnête est que l’agent utilisateur est l’un des signaux les moins fiables qui soient, et qu’une chaîne de navigateur dans une requête dont l’empreinte TLS indique le contraire est pire que l’absence totale de dissimulation — vous avez créé une incohérence qu’un vrai navigateur ne produit jamais. Une section y est consacrée ci-dessous. La stratégie qui fonctionne plus souvent que ce que l’on pourrait croire est justement l’inverse : dites qui vous êtes, fournissez une URL de contact et comportez-vous de manière raisonnable. L’automatisation anonyme est bloquée bien plus facilement que l’automatisation identifiée, et s’identifier ne coûte rien.

La syntaxe

curl -A "MyBot/1.0" https://example.com

Le manuel de curl décrit l'option -A, --user-agent <name>

: « Spécifie la chaîne User-Agent à envoyer au serveur HTTP. Pour encoder les espaces dans la chaîne, encadrez-la de guillemets simples ou doubles. »

La valeur par défaut est également indiquée : « Par défaut, curl utilise curl/VERSION

, par exemple User-Agent: curl/8.22.0

. »

Ainsi, sans aucune option, chaque requête que vous effectuez s’identifie comme provenant de curl et indique sa version. Certains serveurs réagissent différemment en fonction de cela, ce qu’il est utile de savoir avant de conclure qu’un site ne fonctionne pas.

L’équivalent en utilisant un en-tête générique :

curl -H "User-Agent: MyBot/1.0" https://example.com

Les deux produisent le même résultat — le manuel précise que l’en-tête « peut également être défini à l’aide des options --header

ou --proxy-header

». -A

est plus court ; -H

est cohérent avec la manière dont vous définissez tous les autres en-têtes, ce qui est important si vous générez des commandes par programmation.

Si vous le spécifiez plusieurs fois, « la dernière valeur définie est utilisée ».

Suppression totale de l'en-tête

Il s'agit d'un cas dont beaucoup ignorent l'existence, et le manuel précise clairement la distinction :

Si vous passez un argument vide à la fonction --user-agent (« »), celle-ci supprime complètement l’en-tête de la requête. Si vous préférez un en-tête vide, vous pouvez le définir sur un seul espace (« »).

curl -A "" https://example.com          # no User-Agent header at all
curl -A " " https://example.com         # User-Agent: (empty value)

Il s’agit là de requêtes véritablement différentes. Ne pas envoyer d’en-tête n’est pas la même chose qu’en envoyer un vide, et les serveurs sont capables de les distinguer.

Ces deux cas sont inhabituels, et le fait même d’être inhabituel constitue un signal. Une requête ne comportant aucun agent utilisateur est plus rare qu’une requête s’identifiant comme « curl » ; par conséquent, supprimer l’en-tête pour paraître moins suspect produit généralement l’effet inverse.

Le même mécanisme s’applique via -H, et le manuel explique la syntaxe pour les deux cas : « Supprimez un en-tête interne en indiquant un remplacement sans contenu à droite des deux points, comme dans : -H "Host:" », tandis qu’un en-tête avec une valeur vide nécessite un point-virgule — -H "X-Custom-Header;" envoie X-Custom-Header:.

Pourquoi la valeur par défaut a son importance «

curl/8.22.0 » est une chaîne de caractères tout à fait honnête, mais elle a des conséquences.

Certains serveurs la bloquent purement et simplement. Une règle générale visant à bloquer les outils d’automatisation connus est facile à mettre en place et suffisamment courante pour que vous y soyez confronté.

Certains servent un contenu différent. Un balisage simplifié, aucune section dépendante de JavaScript, parfois même une page entièrement différente.

Certains l'enregistrent dans un journal sans rien faire d'autre. C'est de loin le cas le plus courant.

Certains CDN la considèrent comme un signal parmi d’autres plutôt que comme un critère de décision à part entière.

En pratique, cela signifie que le problème « ça fonctionne dans mon navigateur mais pas avec curl » peut avoir plusieurs causes possibles, et l’agent utilisateur n’en est qu’une parmi d’autres. Avant de le modifier, vérifiez si la différence est réellement due à JavaScript — curl ne l’exécute pas, donc une page assemblée côté client paraîtra presque vide à curl, quel que soit l’en-tête que vous envoyez. Ce n’est pas un problème bloquant et aucun agent utilisateur ne le résout.

Pourquoi se faire passer pour un navigateur se retourne souvent contre soi

La section à lire avant de coller une chaîne de caractères de Chrome.

Un agent utilisateur est une déclaration. Un système anti-bot moderne vérifie cette déclaration à l'aide de preuves, et celles-ci sont nombreuses :

Empreinte TLS. La manière dont un client négocie le protocole TLS — ordre des suites de chiffrement, extensions, groupes pris en charge — génère une signature généralement désignée par JA3 ou JA4. Celle de curl n’est pas celle de Chrome, et aucun en-tête ne peut la modifier. Une requête se faisant passer pour Chrome avec la poignée de main TLS de curl est plus identifiable qu’une requête se présentant honnêtement comme provenant de curl, car le vrai Chrome ne produit jamais cette combinaison.

Ensemble et ordre des en-têtes. Les navigateurs envoient un ensemble caractéristique d’en-têtes dans un ordre caractéristique — Accept, Accept-Language, Accept-Encoding, Sec-Fetch-*, et bien d’autres. curl n’en envoie que trois ou quatre. Se faire passer pour Chrome tout en envoyant l’ensemble d’en-têtes de curl constitue une contradiction flagrante.

Version HTTP et comportement. Réutilisation des connexions, multiplexage, détails sur la compression des en-têtes.

Comportement. Les véritables navigateurs récupèrent les feuilles de style CSS, les images et les scripts. Un client qui récupère un seul document HTML et rien d’autre ne ressemble pas à un navigateur, quoi qu’il en dise.

La hiérarchie honnête est donc la suivante : un agent utilisateur précis est cohérent et passe inaperçu ; un agent utilisateur fabriqué de toutes pièces est incohérent et se remarque. Si vous avez véritablement besoin de requêtes ressemblant à celles d’un navigateur, vous avez besoin d’un navigateur — Playwright ou un outil similaire — et non d’un en-tête. Nous avons abordé les compromis associés dans la prise de captures d’écran avec Playwright.

Il existe un juste milieu légitime, bien que restreint : tester la gestion de l’agent utilisateur de votre propre site, ou récupérer du contenu qu’un site sert différemment aux clients mobiles. Il s’agit là de vérifications par rapport à vos propres systèmes ou d’une négociation de contenu inoffensive, et cela ne pose aucun problème.

Que faut-il envoyer à la place ?

Pour les clients automatisés, la chaîne de caractères la moins susceptible d’être bloquée est celle qui indique ce que vous êtes :

curl -A "AcmePriceBot/1.2 (+https://acme.example.com/bot)" https://example.com

. Cette convention comporte trois parties : un nom, une version et une URL où l’on peut découvrir ce que vous êtes et comment vous contacter. Elle fonctionne car elle offre à l’administrateur du site d’autres options que le blocage. Un flux de requêtes inexpliqué est un problème qu’il faut bloquer ; un robot d’indexation identifié disposant d’une page de contact est un cas qui nécessite une décision, et souvent, cette décision est de l’autoriser.

Trois avantages pratiques, tous bien réels :

**robots.txt

permet de s’adresser spécifiquement à vous.** Les règles sont appliquées en fonction du jeton d’agent utilisateur ; ainsi, un site peut accorder à votre robot un accès qu’il n’accorde pas à tout le monde. Cela ne peut pas se produire si vous êtes anonyme.

Les opérateurs peuvent vous contacter avant de vous bloquer. Cela arrive plus souvent qu’on ne le pense, et c’est une issue bien plus favorable que de découvrir un blocage trois semaines plus tard.

Cela facilite la demande d’accès. « Nous sommes le robot identifié comme AcmePriceBot ; voici ce que nous faisons » est une conversation qui peut mener à quelque chose. « Nous sommes un script non identifié », en revanche, ne l’est pas.

Accompagnez cette démarche d’un comportement cohérent avec vos affirmations : respectez les directives robots.txt

, Crawl-delay

et Retry-After

, maintenez un débit modéré et utilisez la mise en cache afin de ne jamais récupérer deux fois la même ressource inchangée.

Configuration cohérente dans les scripts

Pour tout ce qui dépasse une seule commande, placez la chaîne de caractères à un seul endroit.

UA="AcmePriceBot/1.2 (+https://acme.example.com/bot)"

curl -sS --fail --location \
     --user-agent "$UA" \
     --connect-timeout 5 --max-time 30 \
     "$URL"

Vous pouvez également la définir une seule fois dans un fichier de configuration curl, ce qui garantit la cohérence de chaque invocation sans avoir à répéter l’option :

# bot.conf
--user-agent "AcmePriceBot/1.2 (+https://acme.example.com/bot)"
--location
--show-error
curl -K bot.conf "$URL"

Une mise en garde concernant spécifiquement ~/.curlrc

: cela s’applique à chaque invocation de curl effectuée par cet utilisateur, y compris les commandes que vous n’avez pas écrites. Définir un agent utilisateur de bot à cet endroit signifie que chaque requête ponctuelle que vous effectuez sera identifiée comme provenant de votre robot d’indexation, ce qui produira des résultats prêtant à confusion plusieurs mois plus tard. Utilisez un fichier de configuration nommé avec -K

pour tout ce qui est spécifique à une charge de travail.

Si vous avez besoin de plusieurs agents utilisateur au sein d’une charge de travail, conservez-les dans un tableau et sélectionnez-les de manière délibérée plutôt qu’au hasard — une rotation aléatoire au sein d’une même session donne l’impression que le client change de navigateur en cours de visite, ce qui constitue une incohérence supplémentaire plutôt qu’un moyen de se dissimuler.

Vérifier ce que vous avez réellement envoyé

C'est une habitude qu'il vaut la peine de prendre, car les hypothèses concernant les en-têtes sont étonnamment souvent erronées.

curl -v -A "MyBot/1.0" https://example.com 2>&1 | grep -i '^> user-agent'

Les messages détaillés sont envoyés vers stderr, d'où l'utilisation de 2>&1. Les lignes commençant par > correspondent à ce que curl a transmis.

Vous pouvez également demander à un service de vous renvoyer ces informations :

curl -sS -A "MyBot/1.0" https://httpbin.org/user-agent

C’est plus important qu’il n’y paraît en raison d’un comportement spécifique décrit dans le manuel : « si vous ajoutez un en-tête personnalisé portant le même nom que l’un des en-têtes internes utilisés par curl, c’est votre en-tête défini en externe qui sera utilisé à la place de l’en-tête interne ». Ainsi, combiner -A avec -H "User-Agent: ..." signifie que l’un des deux l’emporte sans que l’on s’en rende compte, et pour savoir lequel, il faut vérifier. Le conseil donné par le manuel lui-même mérite d’être répété : « Vous ne devriez pas remplacer les en-têtes définis en interne sans savoir parfaitement ce que vous faites. »

La même vérification s’applique via un proxy, où --proxy-header définit les en-têtes sur la connexion au proxy plutôt que sur la requête cible — une distinction qui peut dérouter les utilisateurs lorsqu’un en-tête qu’ils ont défini semble ne pas arriver à destination.

Lecture d’une chaîne User-Agent

Il est utile de comprendre ce concept, à la fois parce que vous pourriez avoir besoin d’en créer une et parce que son format explique pourquoi les chaînes des navigateurs semblent si étranges.

Une chaîne Chrome moderne ressemble à peu près à ceci :

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36

Presque rien de tout cela n’est vrai. Ce n’est ni Mozilla, ni Safari, et AppleWebKit/537.36 est figé depuis des années. Cette chaîne est un vestige de deux décennies de négociation de contenu : chaque navigateur a ajouté les identifiants de ses prédécesseurs afin que les serveurs, en détectant un concurrent, lui fournissent la bonne version de la page. Il en résulte un format qui ne contient pratiquement aucune information fiable, mais qui est néanmoins analysé par un grand nombre de logiciels.

La grammaire structurelle sous-jacente est simple : une séquence de jetons de type « Product/Version », chacun pouvant être suivi d’un commentaire entre parenthèses. C’est là toute la spécification, et c’est pourquoi une chaîne telle que AcmePriceBot/1.2 (+https://acme.example.com/bot) est bien formée — un jeton de produit, une version et un commentaire contenant une URL. Le préfixe + de l’URL relève davantage d’une convention que d’une exigence, et il est largement reconnu.

La question du mobile. De nombreux sites proposent un balisage différent aux clients mobiles, et le marqueur distinctif est généralement « Mobile » quelque part dans la chaîne. Si vous vérifiez légitimement comment une page s’affiche pour les visiteurs mobiles, l’envoi d’un agent utilisateur mobile relève d’une simple négociation de contenu plutôt que d’une usurpation d’identité — bien que la même mise en garde s’applique comme toujours : une chaîne « mobile » sur une connexion de type ordinateur de bureau avec une fenêtre d’affichage de bureau ne constitue qu’une demi-affirmation, et un véritable navigateur mobile se distinguerait à plusieurs autres égards.

Et la tendance au gel des versions. Les navigateurs réduisent progressivement le niveau de détail qu’ils exposent dans cet en-tête, transférant les informations de capacités vers des indications client structurées. En pratique, cela signifie que l’analyse de l’agent utilisateur est une source d’informations de moins en moins fiable pour tout le monde — y compris pour les sites qui décident de la manière de traiter vos requêtes, ce qui constitue une raison supplémentaire pour laquelle il s’agit d’un signal trop faible pour élaborer une stratégie autour de celui-ci.

Quand l'agent utilisateur n'est pas en cause

Cas où le modifier ne servira à rien, répertoriés car c'est souvent la première solution que les gens essaient.

Lorsque le contenu est généré par JavaScript. curl n’exécute pas les scripts. Une réponse quasi vide signifie que la page est assemblée côté client, et la solution réside dans le navigateur ou l’API sous-jacente, et non dans un en-tête.

Lorsque vous êtes soumis à une limitation de débit. Une 429 concerne le volume, pas l’identité. Ralentir le débit aide ; changer d’agent utilisateur n’y change rien.

Lorsque l’adresse est en cause. Si une plage d’adresses entière est bloquée, toutes les requêtes provenant de cette plage échoueront, quels que soient les en-têtes.

Lorsque l’authentification est requise. Un site 401 exige des identifiants.

Lorsque l’empreinte TLS vous trahit. Ce point a été abordé plus haut, et c’est la raison pour laquelle l’usurpation d’identité d’un navigateur via les en-têtes seules a tendance à s’avérer décevante.

Lorsque le site refuse tout simplement le trafic automatisé. Certains sites l’indiquent dans leurs conditions d’utilisation et veillent à leur respect. Modifier un en-tête ne change pas les conditions, et un site qui vous a demandé de ne pas l’explorer vous a fourni une information plutôt qu’une énigme.

Le test qui permet de distinguer rapidement ces cas : envoyez la même requête vers la même URL depuis un navigateur classique sur la même connexion. Si le navigateur fonctionne et que curl ne fonctionne pas, comparez les deux requêtes en détail, enche-tête par en-tête — et si la seule différence significative s’avère être un élément que vous ne pouvez pas modifier depuis la ligne de commande, vous avez votre réponse.

Questions fréquentes

Comment définir un User-Agent dans curl ?

curl -A "MyBot/1.0" URL, ou de manière équivalente curl -H "User-Agent: MyBot/1.0" URL. Mettez la chaîne entre guillemets si elle contient des espaces. Si plusieurs valeurs sont fournies, c'est la dernière qui prévaut.

Quel est l'User-Agent par défaut de curl ?

curl/VERSION — par exemple curl/8.22.0. Il est envoyé à chaque requête, sauf si vous le remplacez ou le supprimez, et certains serveurs réagissent différemment en fonction de celui-ci.

Comment supprimer l’en-tête User-Agent dans curl ?

curl -A "" URL supprime complètement l’en-tête. curl -A " " URL l’envoie avec une valeur vide, ce qui correspond à une requête différente. Notez que ne pas envoyer d’agent utilisateur est plus inhabituel que d’envoyer celui par défaut de curl ; cela attire donc davantage l’attention plutôt que de la détourner.

Dois-je simuler un User-Agent de navigateur avec curl ?

En général, non. Une chaîne de navigateur dans une requête dont l’empreinte TLS, l’ensemble des en-têtes et l’ordre de ceux-ci sont tous ceux de curl constitue une incohérence que les vrais navigateurs ne produisent jamais, ce qui vous rend plus identifiable plutôt que moins. Si vous avez besoin de requêtes ressemblant à celles d’un navigateur, utilisez un navigateur.

Le fait de modifier l’en-tête User-Agent m’empêchera-t-il d’être bloqué ?

Rarement à lui seul. Cela aide à contourner les règles générales qui rejettent les outils connus, mais ne sert à rien contre les limitations de débit, les blocages basés sur l’adresse, l’empreinte TLS ou l’analyse comportementale. S’identifier honnêtement avec une URL de contact fonctionne souvent mieux que de se déguiser.

À quoi doit ressembler l’User-Agent d’un bot ?

Un nom, une version et une URL de contact : AcmePriceBot/1.2 (+https://acme.example.com/bot). Cela permet à robots.txt de s’adresser à vous spécifiquement, aux opérateurs de vous contacter au lieu de vous bloquer, et vous donne le droit de demander un accès.

Puis-je définir un User-Agent différent pour chaque requête ?

Oui — -A s’applique à l’appel ; vous pouvez donc fournir une valeur différente à chaque fois, ou utiliser --next pour exécuter plusieurs opérations avec des options différentes en une seule commande. Évitez de faire tourner les valeurs de manière aléatoire au cours d’une même session, car cela donne l’impression que le client change de navigateur en cours de visite.

Pourquoi mon User-Agent personnalisé n’apparaît-il pas ?

Vous l’avez très probablement défini deux fois par des moyens différents, car curl utilise l’en-tête que vous avez défini en externe plutôt que son en-tête interne, et c’est la dernière définition qui prévaut. Vérifiez avec curl -v ... 2>&1 | grep -i '^> user-agent' pour voir ce qui a réellement été transmis.

Conclusion

La configuration d'un agent utilisateur dans curl se fait à l'aide d'un seul indicateur, et le choix de la valeur importe davantage que la syntaxe.

La valeur par défaut identifie honnêtement curl, et cette honnêteté est une position défendable : cohérente, banale, et parfois la raison pour laquelle un site vous traite de manière raisonnable. Il est possible de supprimer cet en-tête — un argument vide le supprime entièrement, un simple espace le laisse vide — et ces deux options sont plus inhabituelles que la valeur par défaut, ce qui est à l’opposé de ce que les utilisateurs visent généralement.

Copier une chaîne de navigateur est le réflexe courant et l’option la plus faible, car cette affirmation est vérifiable. Les empreintes TLS, la composition et l’ordre des en-têtes, ainsi que le fait de récupérer ou non les sous-ressources de la page, contredisent tous cette affirmation, et une contradiction est plus facile à repérer qu’un simple aveu. Si des requêtes ressemblant à celles d’un navigateur sont véritablement nécessaires, un navigateur est l’outil qu’il faut.

L’approche qui fonctionne mieux que la plupart des gens ne s’y attendent ne coûte rien : un nom, une version et une URL où l’on peut découvrir qui vous êtes. Cela permet à robots.txt de s’adresser à vous, à un opérateur de vous envoyer un e-mail au lieu de vous bloquer, et transforme le « trafic inexpliqué » en « un robot d’indexation ayant un propriétaire » — ce qui constitue une bien meilleure position lorsque quelqu’un doit décider de la suite à donner à votre cas.