La Google Search Console est un outil phare du moteur de recherche qui offre pléthore de fonctionnalités aux webmasters et référenceurs. Si son usage est désormais bien connu des spécialistes, comment pourrions-nous procéder pour automatiser des tâches ou gagner du temps dans nos actions quotidiennes en termes de SEO ? C’est dans ce cas qu’interviennent les diverses API de Google, et comme nous sommes chanceux, il en existe une parfaitement conçue pour nous, l’API Search Console…

Par Mathieu Chartier

Nous avons mis un premier pied à l’étrier lors de l’introduction aux API de Google présentées dans la Lettre d’Abondance du mois de septembre 2017. Nous vous conseillons de vous référer aux conseils prodigués à ce moment-là si vous n’êtes pas familiers avec les API de Google et surtout avec la librairie officielle Google PHP API Client en PHP qui permet de s’interfacer sans aucun problème avec les différentes applications ouvertes du moteur de recherche (source : https://github.com/google/google-api-php-client). Toute notre attention va aujourd'hui être portée sur l’API Search Console, mais retenons que nous n’aurons fait le tour que d’un minimum des possibilités offertes par cette API à la fin de cet article tant elle est vaste et intéressante…

Quelles données administrer avec l’API Search Console ?

L’API Search Console ne permet pas d’accéder à l’ensemble des données de l’outil, au grand dam des plus passionnés d’entre nous. Néanmoins, sa couverture demeure assez vaste et les principales préoccupations des référenceurs peuvent être atteintes par ce biais. Si nous résumons, voici ce que l’API permet de faire par défaut :

  • Gérer la liste des sites présents dans la Search Console (récupération des données d’un site ou de la liste des sites ajoutés, ajout ou suppression de sites) ;
  • Administrer les fichiers Sitemaps XML (ajout ou mise à jour des fichiers, ou récupération de données associées à ces Sitemaps) ;
  • Utiliser l’outil Search Analytics pour suivre les données relatives aux sites ;
  • Suivre les erreurs de crawl de Google.

Nous allons donc faire le tour de ces diverses fonctionnalités et données que nous pouvons utiliser à notre compte. Mais il nous faut d’abord réussir à nous connecter et à nous identifier pour pouvoir profiter de la plateforme ouverte de Google.

Comment s’authentifier auprès de Google avec PHP ?

Dans notre précédent article, nous avions insisté sur l’API Custom Search, mais cette dernière ne demande qu’une clé d’authentification, à l’instar de l’API URL Shortener. Malheureusement, rares sont les API qui offrent un tel confort d’utilisation, et pour la Search Console, il faut s’identifier avec OAuth ou une clé de compte de service.
Voici comment procéder pour arriver à nos fins :


Fig. 1. Activation de l’API Search Console.

  • Créez une clé OAuth dans la section « Identifiants » (si ce n’est pas déjà fait) et téléchargez le « client secret » en JSON. Attention à bien préciser l’URL du script PHP utilisé dans le champ « URI de redirection autorisés » lorsque vous créez l’application web avec OAuth (voir Figure 2). Si vous utilisez un serveur local comme Mamp ou Wamp Server, il faudrait préciser http://localhost/CHEMIN_SCRIPT_API.php.


Fig. 2. Mise en place de l’OAuth et des URI de redirection autorisés.

  • Dans de nombreux cas, Google demande ce qu’il appelle un Guzzle, à savoir une authentification particulière propre à la librairie cURL pour PHP. Il faut alors télécharger un fichier cacert.pem que l’on collera à côté de notre script par exemple ou dans le répertoire SSL de notre installation d’Apache (source : https://curl.haxx.se/ca/cacert.pem).
  • Recopions le code suivant pour créer l’authentification totale en OAuth pour utiliser les API de Google. Il ne reste qu’à adapter certains champs selon nos propres données (tout ce qui est noté en majuscules).

<?php
// Autoload des classes PHP pour utiliser les API de Google
require_once('google-api-php-client-2.2.0/vendor/autoload.php');

// Création d'une connexion aux API
$client = new Google_Client();

// Définition d'un nom d'application (optionnel)
$client->setApplicationName("API_Search_Console");

// Authentification par fichier JSON pour OAuth
$client->setAuthConfig('CLIENT_SECRET.json'); // À adapter à notre compte !

// Rédirection pour la connexion OAuth
$redirect_uri = "http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
$client->setRedirectUri($redirect_uri);

// Ajout de la portée du service (autorisation -> scope) => URL Search Console
$client->setIncludeGrantedScopes(true);
$client->addScope("https://www.googleapis.com/auth/webmasters");
$client->addScope("https://www.googleapis.com/auth/webmasters.readonly");

// Accès hors-ligne autorisé et approbation forcée (optionnel)
$client->setAccessType("offline");
$client->setApprovalPrompt('consent');

// Ajouter un Guzzle (pour cURL en PHP)
$http = new GuzzleHttpClient([
            'verify' => 'URL_LOCALE_OU_NONcacert.pem' // à adapter (sinon, tenter « false »)
]);
$client->setHttpClient($http);

// Validation de l'authentification (redirection pour se connecter et obtenir un token valide)
session_start();

if(!isset($_GET['code'])) {
  // Génère une URL pour autoriser l'utilisateur OAuth 2
  $authUrl = $client->createAuthUrl();
  header('Location:'.filter_var($authUrl, FILTER_SANITIZE_URL));
} else {
  // Authentification du client
  $client->authenticate($_GET['code']);

  if(isset($_SESSION['access_token']) && $_SESSION['access_token']) {
    $client->setAccessToken($_SESSION['access_token']);
  } else {
    $_SESSION['access_token'] = $client->getAccessToken();
  }
}

Nous pouvons constater que le plus difficile dans l’usage des API de Google est sûrement l’authentification, et ce n’est pas la documentation de Google qui peut vous être d’une grande aide dans bien des cas (car elle est obsolète sur bien des points). En soi, utiliser les fonctionnalités des API est simple, mais s’authentifier est toujours complexe (parfois, cela prend même la majorité du programme en termes de lignes de code…). Soyons rassurés, le plus dur est fait, il ne reste plus qu’à profiter de l’API Search Console maintenant, n’est-ce-pas ça le bonheur ? 🙂

Gestion des sites connectés à la Search Console

Comme Google est un peu fourbe par moment, la librairie Google PHP API Client ne donne pas accès aux fonctionnalités avec les mêmes règles de nommage qu’à l’accoutumée. En effet, il faut généralement instancier les classes sous la forme Google_Service_NomApi() pour utiliser chaque API, mais ici, ce n’est pas Google_Service_SearchConsole() qu’il faut appeler. La raison est simple en réalité, l’API a été créée à l’époque des Webmaster Tools, c’est donc le service Webmasters que nous appelons, et non SearchConsole. Ce n’est pas dérangeant mais sans une recherche approfondie au sein des nombreux fichiers de la librairie PHP de Google, il serait impossible de le savoir ou de le deviner…

Maintenant que nous savons l’essentiel, il ne reste plus qu’à lister dans un premier temps les sites inscrits dans la Google Search Console. Pour ce faire, Google a prévu la méthode listSites(). À la suite de l’authentification précédemment présentée, nous n’avons donc qu’à lister ce qui nous intéresse avec ces quelques lignes de codes :

 

// Appel de la méthode de connexion à l'API Search Console (Webmasters)
$api_sc = new Google_Service_Webmasters($client);

// Liste des sites connectés à l'API Search Console
$targetSites = $api_sc->sites;
$sitesList = $targetSites->listSites();

// Affiche la liste des sites dans un tableau HTML (exemple)
echo "<table>";
echo "<tr>";
echo "<th>Type de propriété</th>";
echo "<th>URL de la propriété</th>";
echo "</tr>";
foreach($sitesList->siteEntry as $site) {
            // Retrouve le type de propriété
            $type = "Site (URL unique)";
            if(strpos($site->siteUrl, "sc-set:") === 0) {
                       $type = "Groupe de sites";
            }

            // Affichage
            echo "<tr>";
            echo "<td>".$type."</td>";
            echo "<td>".$site->siteUrl."</td>";
            echo "</tr>";
}
echo "</table>";

Il ne s’agit que d’un exemple qui liste les propriétés ou groupes de propriétés, mais c’est déjà un bon début. Nous pouvons ensuite ajouter ou supprimer un site par le biais de l’API sans avoir à nous rendre dans la Search Console manuellement. Il suffit d’utiliser la méthode add() avec l’URL d’un site à ajouter en paramètre. Si nous reprenons le programme juste après l’authentification OAuth, il ne faut que trois lignes (hors commentaires) pour arriver à nos fins :

// Appel de la méthode de connexion à l'API Search Console (Webmasters)
$api_sc = new Google_Service_Webmasters($client);

// Liste des sites connectés à l'API Search Console
$targetSites = $api_sc->sites;
$addSite = $targetSites->add("https://www.exemple-ajout.fr/");

Une fois que nous savons ajouter, la suppression est un jeu d’enfant, il convient juste de remplacer la méthode add() par la méthode delete()…

$deleteSite = $targetSites->delete("https://www.exemple-ajout.fr/");

Comme nous ne serions pas complet sans présenter la méthode get(), retenons que cette dernière permet d’obtenir des informations (très peu) sur une URL précise. En soi, elle est bien moins intéressante que la méthode listSites() que nous avons étudiée précédemment.

$getSite = $targetSites->get("https://www.exemple-ajout.fr/"); // Retourne un objet de données

Pour trouver des informations sur les méthodes disponibles avec l’API Search Console, le mieux reste encore de se rendre dans la documentation officielle de Google et d’observer les possibilités offertes par l’API. La bibliothèque Google PHP API Client reprend tout ce qu’il est possible de faire : https://developers.google.com/webmaster-tools/.

Obtenir des statistiques avec Search Analytics

Il est possible d’obtenir quelques données statistiques issues de la section Search Analytics de la Search Console, notamment le nombre de clics sur une période donnée, la position moyenne des pages indexées et cliquées, le taux de clics moyen ou encore le nombre d’impressions. Pour mener à bien cette mission, il faut modifier un peu le code que nous avons vu pour lister les propriétés des outils pour webmasters.

Tout d’abord, nous n’appelons plus « sites » mais « searchanalytics ». Mais à cela, nous devons également instancier la classe Google_Service_Webmasters_SearchAnalyticsQueryRequest(). Cette dernière permet de modifier les paramètres de la section « Analyse de la recherche ». Nous devons notamment modifier la période de suivi des statistiques en définissant une date de début et de fin. Toutes les autres possibilités sont optionnelles, comme le choix du type de recherche (web, vidéo ou image), ou encore le choix des filtres (appelés « dimensions » dans l’API). Nous pouvons donc cibler un pays particulier, une requête spécifique, etc. La documentation nous permet de faire le tour des possibilités (source : https://goo.gl/nGzDNf).

Voici comment cela s’exécute en termes de programmation :

 

// Appel de la méthode de connexion à l'API Search Console (Webmasters)
$api_sc = new Google_Service_Webmasters($client);
$targetStats = $api_sc->searchanalytics; // Rapport « Analyse de la recherche »

// Suivi des statistiques de la Search Console
$siteUrl = "URL_PROPRIETE_SEARCH_CONSOLE "; // Obligatoire
$instanceSA = new Google_Service_Webmasters_SearchAnalyticsQueryRequest();
$instanceSA->setStartDate("2017-01-01"); // Obligatoire
$instanceSA->setEndDate("2017-10-20"); // Obligatoire
$instanceSA->setSearchType("web"); // Optionnel ("web", "video" ou "image")
$statsFollow = $targetStats->query($siteUrl, $instanceSA);

Ici, les données sont enregistrées dans la variable $statsFollow, mais les informations qui nous intéressent sont stockées dans l’objet $statsFollow->rows. Il ne nous reste alors qu’à afficher les clés pour chaque type, comme ceci :

foreach($statsFollow->rows as $rows) {
            echo "Clics : ".$rows->clicks.'<br/>';
            echo "CTR moyen : ".$rows->ctr.'<br/>';
            echo "Impressions : ".$rows->impressions.'<br/>';
            echo "Position (moyenne) : ".$rows->position.'<br/>';
}

Il est possible ensuite d’ajouter des filtres avec des méthodes spécifiques beaucoup plus complexes à utiliser. Nous n’irons pas dans les méandres de ces fonctionnalités mais retenons que nous pouvons aisément obtenir la position moyenne d’une URL spécifique par exemple.

Analyser les erreurs de crawl avec l’API Search Console

L’analyse des erreurs est assez vaste avec l’API et permet de vraiment creuser dans les chiffres pour savoir quel est le type d’erreur le plus courant, le nombre d’erreurs obtenu, etc. Comme pour le rapport « Analyse de la recherche », Google fournit une documentation plutôt complète sur les requêtes que l’on peut résoudre (source : https://goo.gl/xgRF93). Ainsi, nous pouvons trouver le nombre d’erreurs par type d’erreur, que Google classe ainsi :

  • "authPermissions"
  • "flashContent"
  • "manyToOneRedirect"
  • "notFollowed"
  • "notFound"
  • "other"
  • "roboted"
  • "serverError"
  • "soft404"

L’API retourne également le support utilisé pour lequel des erreurs potentielles sont trouvées (« web », « mobile » et « smartphoneOnly »). Par le code, nous pouvons obtenir un tableau de l’ensemble des erreurs visant un site web. Voici comment avoir un résultat propre :

// Appel de la méthode de connexion à l'API Search Console (Webmasters)
$api_sc = new Google_Service_Webmasters($client);

// Suivi des erreurs de crawl
$targetErrors = $api_sc->urlcrawlerrorscounts;
$siteUrl = "URL_PROPRIETE_SEARCH_CONSOLE "; // Obligatoire
$statsErrors = $targetErrors->query($siteUrl);

// Affiche la liste des erreurs par type d'erreurs et plateforme
echo "<table>";
echo "<tr>";
echo "<th>Plateforme</th>";
echo "<th>Type d'erreur</th>";
echo "<th>Nombre d'erreur</th>";
echo "</tr>";
foreach($statsErrors->countPerTypes as $errors) {
            echo "<tr>";
            echo "<td>".$errors->platform."</td>";
            echo "<td>".$errors->category."</td>";
            echo "<td>".$errors->entries[0]->count."</td>";
            echo "</tr>";
}

L’API ne permet pas uniquement de retrouver ces informations générales. Il est également possible d’utiliser la classe Google_Service_Webmasters_Resource_Urlcrawlerrorssamples() pour obtenir des informations sur les URL qui génèrent des erreurs de crawl. Nous ne nous arrêterons pas en détail sur ce point mais retenons qu’il existe une méthode « get » pour obtenir les informations relatives à une URL donnée, ou une méthode « list » qui récupère la liste des pages provoquant des erreurs de crawl.

L’exemple suivant montre comment obtenir un tableau PHP des erreurs « soft 404 » pour un site donné. Les résultats intéressants se trouvent dans la clé urlCrawlErrorSample, notamment la liste des URL qui ont généré ce type d’erreur. Il ne s’agit que d’un exemple non détaillé, il nous faudrait aller un peu plus loin pour afficher les résultats proprement.

// Appel de la méthode de connexion à l'API Search Console (Webmasters)
$api_sc = new Google_Service_Webmasters($client);

// Obtention d'informations sur les erreurs de crawl
$targetErrorsPages = $api_sc->urlcrawlerrorssamples;
$siteUrl = "URL_PROPRIETE_SEARCH_CONSOLE "; // Obligatoire
$category = "soft404" ; // Obligatoire (soft404, notFound, serverError...)
$platform = "web" ; // Obligatoire (web, image ou video)
$statsErrorsPages = $targetErrorsPages->listUrlcrawlerrorssamples($siteUrl, $category, $platform);

// Affiche les résultats rapidement
var_dump($statsErrorsPages);

Gestion automatisée des Sitemaps XML

L’administration des fichiers Sitemaps XML est un réel bonheur avec l’API Search Console. Nous avons la possibilité d’ajouter ou supprimer des plans de site, de récupérer les informations relatives à un Sitemap et de liste l’ensemble de ces fichiers. Tout est donc possible en quelques lignes de code…

La bibliothèque Google PHP API Client offre quatre méthodes après avoir instancié la classe « sitemaps » :

  • listSitemaps($urlPropriete) : retourne la liste des sitemaps relative au site visé ;
  • get($urlPropriete, $cheminSitemap) : retourne les informations relatives pour un sitemap XML en particulier ;
  • delete($urlPropriete, $cheminSitemap) : supprimer un fichier Sitemap ;
  • submit($urlPropriete, $cheminSitemap) : ajoute un fichier Sitemap.

Voyons tout d’abord comment ajouter et supprimer un fichier Sitemap. Les deux méthodes sont aussi simples à utiliser, c’est pourquoi nous les présentons ensemble. De toute évidence, l’exemple présenté a peu d’intérêt puisque le Sitemap XML ajouté sera supprimé dans la foulée… 🙂

// Appel de la méthode de connexion à l'API Search Console (Webmasters)
$api_sc = new Google_Service_Webmasters($client);

// Gestion des fichiers Sitemaps
$targetSitemaps = $api_sc->sitemaps;

// Ajoute un Sitemap
$propertyUrl = "URL_PROPRIETE_SEARCH_CONSOLE"; // Obligatoire
$sitemapUrl = "URL_PROPRIETE_SEARCH_CONSOLE/NOM_SITEMAP.XML"; // Obligatoire
$addSitemap = $targetSitemaps->submit($propertyUrl, $sitemapUrl);

// Supprime un Sitemap (celui ajouté ici)
$deleteSitemap = $targetSitemaps->delete($propertyUrl, $sitemapUrl);

Nous savons déjà comment gérer des Sitemaps à distance. Maintenant, voyons rapidement comment obtenir des informations sur les Sitemaps XML existants. En soi, les méthodes « get » et « listSitemaps » offrent des résultats équivalents, la seule différence est que la première citée ne vise qu’un fichier en particulier. Nous allons donc utiliser la seconde pour obtenir des informations intéressantes sur les plans de sites existants, notamment le nombre d’URL soumises et indexées par Google.

// Appel de la méthode de connexion à l'API Search Console (Webmasters)
$api_sc = new Google_Service_Webmasters($client);

// Liste des informations relatives aux Sitemaps XML
$targetSitemaps = $api_sc->sitemaps;
$propertyUrl = "URL_PROPRIETE_SEARCH_CONSOLE ";
$getListSitemaps = $targetSitemaps->listSitemaps($propertyUrl);

// Affichage : on parcoure la liste des Sitemaps
echo "<table>";
echo "<tr>";
echo "<th>URL du Sitemap XML</th>";
echo "<th>Nom du fichier</th>";
echo "<th>URL soumises</th>";
echo "<th>URL indexées</th>";
echo "</tr>";
foreach($getListSitemaps as $sitemap) {
            // Récupère l'URL du fichier Sitemap
            $sitemapUrl = $sitemap->getPath();

            // Récupère le nom du fichier Sitemap
            $name = parse_url($sitemapUrl, PHP_URL_PATH);
            $name = ltrim($name, "/");

            // Récupère les contenus utiles du fichier Sitemap
            $sitemapContents = $sitemap->getContents();
            $nbSubmittedPages = $sitemapContents[0]['submitted'];
            $nbIndexedPages = $sitemapContents[0]['indexed'];

            // Affichage
            echo "<tr>";
            echo "<td>".$sitemapUrl."</td>";
            echo "<td>".$name."</td>";
            echo "<td>".$nbSubmittedPages."</td>";
            echo "<td>".$nbIndexedPages."</td>";
            echo "</tr>";
}

Voici (figure 3) le tableau (sans mise en forme) rendu par la fonction. Nous obtenons d’un seul coup d’œil le nombre d’URL soumises et réellement indexées par Google pour chaque Sitemap.


Fig. 3. Obtention du nombre d’URL soumises et indexées par Google.

Si nous voulons analyser en profondeur un Sitemap index par exemple, il est possible d’ajouter des paramètres optionnels en second argument de la méthode listSitemaps(). Ainsi, nous pouvons lister les fichiers « enfants » du Sitemap index, de la même manière que dans le code précédent. Il convient juste de changer l’appel à la méthode comme ceci :

 

$propertyUrl = "URL_PROPRIETE_SEARCH_CONSOLE";
$sitemapIndex = array("sitemapIndex" => "URL_PROPRIETE_SEARCH_CONSOLE/NOM_SITEMAP_INDEX.XML");
$getListSitemaps = $targetSitemaps->listSitemaps($propertyUrl, $sitemapIndex);

Conclusion

Nous maîtrisons désormais l’ensemble des fonctionnalités de l’API Search Console de Google, nous allons pouvoir nous amuser avec pendant des heures pour gagner du temps dans nos démarches courantes. Comme notre aventure autour des API du moteur de recherche n’est pas encore terminée, voici un teasing alléchant en vue des prochaines lettres d’Abondance. Nous utiliserons certainement à terme l’API PageSpeed ou encore URL Testing Tool pour obtenir des informations intéressantes sur nos sites. Et si la sagesse nous emporte, peut-être que nous utiliserons un jour Javascript pour effectuer les appels plutôt que PHP, et nous pourrons tous y trouver notre compte… 😉


Mathieu Chartier
Consultant-Formateur et webmaster indépendant, Internet-Formation (https://www.internet-formation.fr)