Robots
Un bot Internet, un robot web, un robot ou simplement un bot, est une application logicielle qui exécute des tâches automatisées sur Internet, généralement dans le but d’imiter une activité humaine.
Un bot Internet joue le rôle de client dans un modèle client-serveur. Les robots Internet sont capables d’effectuer des tâches simples et répétitives beaucoup plus rapidement qu’une personne ne pourrait le faire. L’utilisation la plus répandue des robots est l’exploration de sites web, dans laquelle un script automatisé récupère, analyse et classe des informations à partir de serveurs web.
Plus de la moitié du trafic web est généré par des robots !!
Quelques types de robots :
Les robots d’indexation, tels que le Googlebot, sont la principale utilisation des robots informatiques. Ils parcourent le web en indexant les pages pour le compte de moteurs de recherche.
Des bots dialogueur, communément appelés chatbot, permettent aux clients de communiquer avec les entreprises, des administrations ou d’autres entités, sans avoir à communiquer avec une personne physique.
Un spambot est un bot informatique conçu pour assister ou envoyer du spam. Un spambot peut par exemple collecter des adresses email sur les pages web, ou bien envoyer du spam sur différents supports Internet : boites mail, commentaire de forums, messagerie instantanée, …
Pour tester les pages web de cet article et réaliser les activités, il sera nécessaire d’utiliser les outils de développement du navigateur web utilisé.
Il est également conseillé d’utiliser VSCodium avec un plugin tel que Live Server (voir documentation du plugin).
Un premier robot
Une façon de réaliser un robot est d’utiliser Javascript (coté client), qui propose des méthodes pour agir sur les éléments du DOM, et déclencher des événements.
Avec une unique case à cocher
Voici un exemple avec une case à cocher (checkbox) :
<!DOCTYPE html>
<html lang="fr-FR">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Robot</title>
</head>
<body>
<div>
<input type="checkbox" id="checkbox" name="chk" />
<label for="chk">Case pour bot</label>
<p id="info"></p>
</div>
</body>
<script>
var chk = document.getElementById("checkbox");
chk.addEventListener("click", (event) => {
let info = document.getElementById("info");
info.innerHTML = `Case : ${chk.checked}`;
});
</script>
</html>
Quelques explications :
- on récupère l’objet du DOM correspondant à une case à cocher par son identifiant :
var chk = document.getElementById("checkbox"); - afin de vérifier que cela déclenche bien un événement, on attache une fonction à appeler chaque fois que la case est cliquée :
chk.addEventListener...
(ici, on modifie le contenu d’une balise<p>pour afficher un message)
Et voici le code Javascript d’un robot rudimentaire, qui simule un clic de souris toutes les 3 secondes sur la case à cocher :
- à intervalle de temps régulier (grâce à la fonction
setInterval), on clique sur la case :chk.click();
var per = 3; // periode des clicks
setInterval(function() {
chk.click();
}, 1000*per);
<script> pour constater son action sur la page.Résultat :


Avec plusieurs cases à cocher
Voici un autre exemple qui permet de cliquer aléatoirement sur chacune des cases à cocher du document (tout le document !) :
<!DOCTYPE html>
<html lang="fr-FR">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Robot</title>
</head>
<body>
<div>
<input type="checkbox" id="checkbox1" name="chk1" />
<label for="chk1">Case pour bot 1</label></br>
<input type="checkbox" id="checkbox2" name="chk2" />
<label for="chk2">Case pour bot 2</label></br>
<input type="checkbox" id="checkbox3" name="chk3" />
<label for="chk3">Case pour bot 3</label></br>
<p id="info"></p>
</div>
</body>
<script>
var chks = document.querySelectorAll("input[type=checkbox]");
var per = 1; // période des clics (en secondes)
var info = document.getElementById("info");
setInterval(function() {
let n = Math.floor(Math.random()*chks.length);
chks[n].click();
}, 1000*per);
for (const chk of chks) {
chk.addEventListener("click", (event) => {
info.innerHTML = `Dernière case cliquée : ${chk.name}`;
});
}
</script>
</html>

Un robot autonome
Un robot est sensé être un programme autonome, qui s’exécute sur un document HTML déjà chargé dans le navigateur.
Reprenons une page web avec une case à cocher associée à un événement :
<!DOCTYPE html>
<html lang="fr-FR">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Page</title>
</head>
<body>
<div>
<input type="checkbox" id="checkbox" name="chk" />
<label for="chk">Case pour bot</label>
<p id="info"></p>
</div>
</body>
<script>
var chk = document.getElementById("checkbox");
chk.addEventListener("click", (event) => {
let info = document.getElementById("info");
info.innerHTML = `Case : ${chk.checked}`;
});
</script>
</html>
Et un robot, sous la forme d’un fichier robot.js :
var chk = document.getElementById("checkbox");
var per = 3; // periode des clicks
setInterval(function() {
chk.click();
}, 1000*per);
Une fois la page chargée dans le navigateur, on peut lancer le robot en copiant/collant le script dans la console du navigateur.
Application à une « vraie » page web
Voici une case à cocher « authentique » :
Créer un robot (un fichier robot_choix.js) dont le rôle est de cocher la 2ème case du formulaire (à cliquer uniquement si elle n’est pas déjà cochée !).
Pour exécuter ce script sur la page actuelle :
- Copier le code Javascript du fichier
robot_choix.js, - Le coller dans la console du navigateur,
- Appuyer sur Entrée.
Se prémunir des robots
Les robots d’indexation
Pour empêcher les robots d’indexation de visiter tout ou partie d’un site web, il suffit d’ajouter à la racine du site un fichier robots.txt.
Voir les détails sur https://robots-txt.com/
Les robots indésirables
On entend par robots indésirables (ou « mauvais » robots) les spam bots, les aspirateurs de site, …
Pour s’en prémunir, il est possible de configurer le serveur web, au moyen par exemple du fichier .htaccess.
Pour en savoir plus : https://dinogeek.me/FR/htaccess/Comment-empecher-les-bots-indesirables-de-crawler-votre-site-.html
La technique du « pot de miel »
Comme nous l’avons vu plus haut, un robot programmé pour agir sur une page web (cliquer un bouton, remplir un formulaire, …) doit auparavant effectuer des « recherches » dans le DOM.
Imaginons une page web proposant un formulaire (enregistrement d’utilisateur, envoi de commentaires, …). Si ce formulaire doit donner lieu à l’ajout d’enregistrements dans une base de données, il faut impérativement l’interdire aux robots !!
La technique du « pot de miel » consiste à leurrer le robot en lui proposant un champ de formulaire « attrayant » (avec un nom explicite), mais qui serait invisible pour un utilisateur humain.
Le robot, lui, le verrait et le compléterait … dévoilant ainsi au serveur qu’il s’agit d’un robot et pas d’un humain.
Toute la difficulté de cette technique est de dissimuler ce champ sans que le robot ne s’aperçoive qu’il est invisible pour un humain … et donc que le remplir le trahirait !
Voici un petit formulaire simple :
<!DOCTYPE html>
<html lang="fr-FR">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Formulaire</title>
</head>
<body>
<form>
<label for="nom">Qui es-tu ?</label><br/>
<input type="text" id="nom" name="nom" /><br/>
<input type="submit" onclick="clic(event)" value="Envoyer">
</form>
<p id="info"></p>
</body>
<script>
function clic(event) {
let nom = document.getElementById('nom').value;
let info = document.getElementById("info");
info.innerHTML = `Bonjour ${nom}`;
event.preventDefault(); // pour éviter la réelle soumission du formulaire (pas de serveur dans cet exercice)
}
</script>
</html>
Remarque importante : en principe les informations fournies dans un formulaire sont destinées au serveur. C’est lui qui au final les traite (interaction avec la base de donnée, renvoi de ressources, …).
Dans le cas présent, pour des raisons de simplicité, nous n’utilisons pas de serveur, mais il faut bien garder à l’esprit que ce doit être lui qui traite ces informations !
ATTENTION : le robot est sensé ignorer les identifiants des champs du formulaire. Il doit procéder par une recherche par balise : utiliser des sélecteurs CSS avec
document.querySelectorAll.
Nous allons à présent essayer de leurrer ce robot…
Pour que le leurre soit le plus efficace possible, il faut que le champ de texte (<input type="text" />) :
- porte un nom/id qui paraisse cohérent (
"email","name", …) - soit vide par défaut :
value="" - ne puisse pas être remplie par l’auto-complétion :
autocomplete="off" - ne puisse pas être accessible par la touche Tab :
tabindex="-1" - et soit bien caché (voir plus bas) !!
Et les autres champs, ceux qui doivent être complétés, doivent au contraire porter des noms « étranges » : "emailfkxa", "aanomaa", …
<script> de la page du formulaire) de sorte qu’il détecte l’action d’un robot et affiche "Je ne réponds pas aux bots" au lieu de "Bonjour ...".
Je ne suis pas un robot
D’une manière plus générale, supposons que l’on souhaite interdire aux robots l’accès à une ressource. Il existe plusieurs moyens pour vérifier que le client n’est pas un robot :
- CAPTCHA (acronyme anglais de Completely Automated Public Turing test to tell Computers and Humans Apart) est une famille de tests de Turing permettant de différencier de manière automatisée un utilisateur humain d’un ordinateur.
- reCAPTCHA est un service de test CAPTCHA proposé par Google aux éditeurs de sites webs pour leur permettre de différencier de manière automatisée les utilisateurs humains des robots. Le système se différencie des CAPTCHA classiques en mettant à profit les capacités de reconnaissance que le test mobilise chez les utilisateurs humains, (pour entraîner par la même occasion les intelligences artificielles que Google développe !).
La deuxième version de reCAPTCHA propose à l’utilisateur humain de cliquer sur une case à cocher :

Le système repose en partie sur l’enregistrement des mouvements de la souris, suivi d’une analyse par une IA servant à déterminer s’il s’agit de l’action d’un humain ou bien d’un robot.
Essayons de reproduire simplement cela …
Voici une case à cocher destinée à détecter si un robot ou un humain la clique :
<!DOCTYPE html>
<html lang="fr-FR">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>NoRobot</title>
</head>
<body>
<div>
<input type="checkbox" id="norobot" name="nr" />
<label for="nr">Interdit aux robots</label><br/>
<p id="info"></p>
</div>
</body>
</html>
On lui rajoute, dans une balise <script> du code Javascript chargé de détecter les mouvements de la souris dans la case.
var chk = document.getElementById("norobot");
chk.addEventListener("mousemove", (event) => {
console.log(event.clientX, event.clientX); // les coordonnées relatives de la position du curseur de la souris
// Choses à faire quand la souris se déplace sur la case à cocher ...
} );
Pour mémoriser les n dernières positions du curseur de la souris sur la case à cocher, on a besoin d’une file. Pour cela on utilise un tableau (array en Javascript) :
var lastpts = []; // file
et une constante entière pour la taille de la file :
const npts = 10;
Pour ajouter un point dans la liste, on utilise la méthode push(), et pour tronquer sa taille à npts, on peut utiliser la méthode slice().
Lorsque le curseur quitte la case, il faut vider la file.
Et en cas de clic sur la case, le programme doit vérifier que la « trace » enregistrée prouve qu’il s’agit d’un humain et pas d’un robot.
En première approche, on considérera que si la file est pleine, cela signifie qu’un humain a effectivement déplacé, manuellement, le curseur de la souris jusqu’au centre de la case.
RAPPEL : en principe, ce rôle de vérification doit se faire coté serveur !!
