Lorsque vous mettez tout vos sites sur le même serveur, sans les cloisonner, il est possible que vous tombiez un jour sur une page qui ne ressemble pas à votre site. Ou plus vicieux, que la page que Google voit en crawlant votre site ne soit pas la page que les utilisateurs voient.
Les hacks sont plus ou moins vicieux, et contrairement à ce que l’on peut croire, le but n’est pas forcément d’exploser un site mais plutôt de se faire discret aussi longtemps que possible.
Je vous propose de créer un petit système qui permet de monitorer vos sites automatiquement et d’être alerté par email lorsqu’un problème survient. Tant qu’à faire, nous allons aussi vérifier que nos pages soient bien en statut 200.
Pour cela vous aurez besoin de trois choses :
- Un compte Google pour créer des Google Sheets
- Un compte Make pour créer les scénarios d’automatisation
- Votre site web, pour faire des tests (ou n’importe quel site)
Vous êtes prêt ?
Le plan d’attaque
Avant d’entrer dans la pratique, je vais vous décrire en quelques lignes ce que nous allons faire étape par étape.
- Tout d’abord nous allons créer un Google Sheets pour accueillir les pages que nous allons vouloir tester
- Ensuite, nous allons créer un scénario Make qui va récupérer toutes les pages de notre site internet. Cette étape est facultative, vous pourrez aussi le remplir à la main.
- Puis nous ferons un scénario Make permettant de tester chaque page de notre Google Sheets.
- Pour finir, nous ajouterons à notre dernier scénario une alerte email si l’une de nos page présente un problème.
Étape 1 : Création du Google Sheets
Cette étape est très rapide, créez un nouveau fichier sur Google Sheets et remplissez le ainsi :

Nommez le « TOOL : Suivi d’url« .
Nommez vos colonnes :
- Page : le nom de vos pages
- Date : la date à laquelle notre scénario est passé
- Status : le code de retour de la page (200, 404, 500, …)
- Cloaking : c’est ici que nous enregistrerons « Oui » / « Non » si on détecte un potentiel hack ou un problème. Je vous détaille ça plus tard, le vice est ici !
- Différence : cette colonne n’est pas forcément utile pour le fichier final, mais elle vous aidera à comprendre comment nous allons remplir la colonne « cloaking »
Pour plus de confort, vous pouvez figer la première ligne de votre tableau pour garder le header toujours visible en faisant un clique droit sur le « 1 » de la première ligne puis « Figer jusqu’à la ligne 1« .

Étape 2 : Récupérer les pages de son site
A cette étape vous avez deux choix :
- Vous choisissez de tester seulement la page d’accueil de vos sites ou seulement certaines pages, dans ce cas vous pouvez renseigner les urls dans la première colonne et vous pouvez passer directement à l’étape 3.
- Sinon, nous allons créer un scénario Make permettant de récupérer toutes les pages du sitemap de votre site pour remplir notre tableau automatiquement.
Si vous n’êtes pas passé à la suite, vous avez choisi le seconde option.
Ouvrez Make et créez un nouveau scénario.
- Ajoutez un premier module en cliquant sur le (+) violet et sélectionnez « HTTP » puis « Make a request »
- Dans le champ URL, collez l’url de votre sitemap. Si vous êtes sous WordPress il se trouve sur /sitemap.xml (vous allez être redirigé au bon endroit)

- Puis cliquez sur la petite horloge en bas à gauche de votre module et dans « Run scenario » sélectionnez « On demand ».
Comme ça notre scénario ne s’exécutera jamais seul, seulement en cliquant sur « Run Once ». - Cliquez sur « Run Once » puis sur la petite bulle contenant « 1 » en haut à droite de votre module. Nous pouvons voir ce qui a été envoyé et récupéré par notre module. Dans la partie OUTPUT si vous déroulez le Bundle 1 puis Data, vous pouvez voir que nous avons bien récupéré le contenu de notre fichier XML !

Comme vous pouvez le voir, notre site contient une deuxième couche de sitemap, qui elles contiennent des pages. Nous allons devoir aller chercher le contenu de ces sitemap pour récupérer les pages. Pour cela, il faut analyser le contenu XML, trouver les urls de chaque sitemap, et relancer une requête HTTP pour chaqune d’elle.
- Ajouter à la suite un module XML > Parse XML

- Pour pouvoir analyser notre XML notre système doit connaitre la structure des données qu’il reçoit. Pour cela il va falloir lui fournir un exemple. Pour cela, cliquez sur le module XML puis sur Add.
- Nommez le « XML : Sitemap de sitemap »
- Cliquez sur « generate », sélectionnez « XML » dans « content type » puis dans « sample data » collez le contenu de « Data » (screenshot précédent). Voilà à quoi ça doit ressembler :

- Cliquez ensuite sur « Generate » puis sur « Save ».
Dans « XML » de votre module, sélectionnez « Data » de votre module HTTP.
- Cliquez ensuite sur « Ok »
- Exécuter votre scénario. Si nécessaire, ensuite sur « Run anyway ».
- Notre module a bien récupéré les urls de nos sitemaps !

Il est temps d’explorer le contenu de nos sitemaps !
- Ajouter un « Flow Control » > « Iterator » et renseignez la partie « Array » comme ceci :

- A la suite, ajoutez un module HTTP de la même façon que le premier et renseignez l’url comme ceci (sélectionnez bien le [1]) :

- Comme la première fois, ajoutez à la suite un XML parser, mais cette fois-ci créez une structure de données avec les données de votre second module HTTP. Pour cela vous devrez relancer votre scénario pour les récupérer. Pensez aussi à renseigner le « Data » du second module HTTP et non celui du premier.
A ce stade, voici ce que vous devriez obtenir :

Maintenant, il ne nous reste plus qu’à faire une sauvegarder chacune des urls de nos pages dans notre Google Sheets. Pour cela nous allons à nouveau utiliser un Iterator.
- Après notre dernier Parser XML ajoutez un Flow Control > Iterator.
- Dans le champ « Array » indiquez l’array « url[] » de votre dernier parser xml

- Ajoutez ensuite un module « Google Sheets » > « Add a row »
- Si ce n’est pas déjà fait suivez les instructions pour paramétrer la connexion à votre compte Google (champ « Connection »)
- Ensuite, dans spreadsheet ID, sélectionnez le Google Sheets que nous avons créé à la première étape
- Dans « Sheet name » sélectionnez « Feuille 1 » si vous ne l’avez pas renommé
- Plus bas, dans « Page (A) » sélectionnez [1] dans loc[] de votre dernier Iterator

- Dans le champ Date en dessous, sélectionnez « now » qui se trouve dans l’onglet « calendrier »

- Cliquez sur « Ok » et sauvegardez votre scénario
Voici ce que vous devriez avoir :

Vous pouvez désormais exécuter votre scénario !
Allez ensuite jeter un oeil à votre Google Sheets 😉

Votre tableur est maintenant rempli avec toutes les pages de votre site !
Étape 3 : Tester les pages de son site
Il ne nous reste plus qu’à aller visiter chaque page et récupérer les données que l’on souhaite.
Voici exactement ce que nous allons récupérer :
- Le statut de la page : quel est le code de réponse ? (200, 404, 500, etc)
- Le poids de chaque page, en utilisant 2 user agents différents.
Le statut de la page va nous servir simplement à vérifier que les pages listées répondent correctement (code 200)
La seconde chose que j’ai eu envie d’analyser est : « est ce que ma page est cloakée » ? J’ai subit des hacks à plusieurs reprises sans même m’en rendre compte. Le hack consistait à garder ma page pour les utilisateurs mais présentait une version différente pour Google.
Parfois la version utilisateur était aussi modifiée avec un page du genre « Bravo vous avez gagné un iPhone 14 ».
En règle générale, quel que soit le User-Agent utilisé, les versions sont identiques et leur poids aussi. Parfois certaines classes CSS diffèrent, mais on va pouvoir se donner une petite marge d’erreur. Vous allez comprendre un peu plus tard.
Commencez par créer un nouveau scénario.
- Ajoutez un premier module « Google Sheets » > « Search rows »
- Dans Spreadsheet, sélectionnez votre Google Sheets, puis sélectionnez votre feuille
- Dans « Filter » renseignez « Page (1) » et « Exists » puis cliquez sur « Ok » pour valider
Jusque là, notre module va récupérer les différentes urls. Maintenant nous allons récupérer les éléments dont nous parlions plus haut.
- Ajouter à la suite un module « HTTP » > « Make a request »
- Dans l’url sélectionnez « Page (A) » de votre Google Sheets
- Juste en dessous, cliquez sur « Add a header » pour ajouter une en-tête et renseigner comme ceci :

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 - Dupliquez ensuite ce module et connectez son clone à celui que vous venez de créer.
- Dans ce nouveau module, modifier le User-Agent avec ceci :
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
Vous pouvez faire varier les User-Agent que nous avons renseigné, du moment que vous respectez le device simulé et que le second est bien un Google Bot. Grâce à ces deux modules HTTP nous allons voir la page retournée à un utilisateur lambda et la page retournée à Google.
Il nous reste une dernière chose à faire : mettre à jour notre spreadsheet.
Pour cela :
- Ajoutez un module « Google Sheets » > « Update a Row »
- Sélectionnez votre spreadsheet et votre sheet name
- Dans « Row number » sélectionnez le « Row number » de votre premier Google Sheets (le Search Rows)

- Plus bas, dans la colonne « Date (B) » faites ceci :

Le formatDate() permet de récupérer la date actuelle « now » et de l’afficher dans le format désiré. Ainsi nous saurons quand est passé la dernière vérification. - Dans la colonne « Status (C) », ajoutez y le « Status code » de votre premier module HTTP. Celui qui appelle la page comme un utilisateur.

Faisons une petite pause et exécutons le scénario, histoire d’être sur que tout fonctionne pour le moment. A ce stade, vous devriez avoir ceci dans votre tableur :

Si ce n’est pas le cas, reprenez un peu plus haut pour vérifier que votre configuration est correcte. Sinon laissez un commentaire sous cet article, je vous aiderai autant que possible.
Dans notre dernier module, dans la colonne « Différence (E) » insérez ceci : 
Le calcul ici est simple, c’est un produit en croix. Nous calculons la différence entre le poids du retour de la première requête et la seconde. Si le contenu n’est pas exactement identique, le poids peut varier dès qu’un seul caractère est modifié sur la page. Exécutez le scénario, vous allez voir !
Voici un exemple, j’ai remarqué de Frandroid n’affichait pas la même page si je me présentais comme un user ou comme un bot Google (à cause de certaines sécurités, mais ça nous arrange) :

Évidement leur site ne s’est pas fait hacké, il y a des dizaines voire centaines d’explications à faire ce genre de choses. Mais dans notre cas, c’est bien pratique pour faire nos tests !
Vous pouvez voir que la première page la différence est de 0 tandis que pour Frandroid, -99,99 ! Le poids de la page est complètement différent. On passe d’un article complet à une simple page de blocage presque vide. (Cette méthode n’est évidement pas infaillible)
La différence peut varier entre -100 et 100. Un coup ce sera notre première requête HTTP la plus lourde, un coup ce sera la seconde. Nous devrons donc vérifier le positif et le négatif.
On en arrive à notre vérification finale. Accrochez vous, dans un soucis d’optimisation des opérations Make, c’est peu digeste. Voici ce que vous devez insérez dans la colonne « Cloaking (D) » de votre dernier module :

Si on simplifie ce calcul cela revient à :
SI (différence < -0.05 OU différence > 0.05)
AFFICHE "Oui"
SINON
AFFICHE "Non"
Elle est la notre marge d’erreur, que vous pouvez adapter selon vos tests et vos sites.
Et voilà le résultat !

Il ne vous reste qu’une seule chose à faire : activer votre scénario ! Pour la fréquence, tout dépend du nombre de page que vous voulez tester. L’idéal est une fois par minute, mais à la fin du moins le nombre d’opération est très élevé. Commencez par une fois par jour, voire un peu moins, si votre site ne génère pas encore des millier de visites quotidiennes inutile d’avoir une fréquence trop élevée.
Étape 4 : Être alerté par email en cas de problème
Pour ne pas passer notre temps sur notre tableau, nous allons nous envoyer un email dès que l’un de ces deux cas se présente :
- Status (C) n’est pas égal à 200
- Cloaking (D) est égal à Oui
Commencez par créer un nouveau scénario puis :
- Ajoutez un premier module « Google Sheets » > « Search Rows »
- Sélectionnez votre fichier Google Sheet (le même que pour les étapes précédentes)
- Filtrez les résultats retournés pour ne garder que ce qui correspond à nos deux cas

Notre module va nous donner une liste de bundles, qui correspond aux lignes de notre tableau qui ont un problème.
- Ajoutez ensuite un module « Tools » > « Text aggregator » et paramétrez le ainsi :
- Pensez à activer les paramètres avancés
- Vous obtenez maintenant un texte contenant une liste des urls qui posent soucis
- Ajoutez ensuite un module « Gmail » > « Send an email » et complétez le sujet ainsi que le contenu

- Ajoutez votre email dans « To » > « Add a recipient » (c’est à cette adresse que vos alertes arriveront)
Si vous n’avez pas encore de connexion entre Make et votre Gmail, je vous recommande de suivre ces instructions, ce serait le sujet d’un article à part entière et je n’aurais aucune valeur ajoutée à vous faire un tuto la dessus, celui de Make est déjà parfait.
Voici ce que vous obtenez :
Et voici le mail que j’ai reçu en exécutant mon scénario, ainsi que le tableau pour que vous compreniez ce qu’il s’est passé :


Comme vous pouvez le voir, tout va bien sur la première ligne, en revanche les suivantes sont en statut 400 et 500, un mail est donc envoyé !
Une dernière chose importante : il ne faut pas envoyer d’alerte si tout est en ordre. Pour cela, ajoutez un filtre sur la liaison entre votre Text aggregator et le module Gmail, pour ne pas continuer si le texte est vide :

N’hésitez pas à me dire en commentaire si vous bloquez quelque part et ce que vous en avez pensé !


