Faire du SEO local est une réalité de plus en plus présente, tant Google use et abuse de la géolocalisation pour proposer des résultats pertinents aux utilisateurs. Après être passé par Google Places et Google+ Local, Google semble avoir trouvé la bonne formule en créant l'outil Google My Business. Ce centre de gestion des informations autour des entreprises locales est bien ancré et ne cesse d'évoluer. S'il est possible d'effectuer toutes les actions dans l'outil en ligne, l'API Google My Business peut réellement permettre d'automatiser certaines tâches et de faciliter la vie de nombreux SEO…

Par Mathieu Chartier

Nous avons déjà traité de plusieurs API utiles pour les SEO dans les précédentes lettres d'Abondance, que ce soit pour mener des actions simples, obtenir des statistiques, voire même pour créer des outils de référencement à part entière. Nous terminons ce premier tour d'horizon des API avec l'API Google My Business, un an après avoir commencé notre découverte de ce monde technique et mystérieux. Bien que Google limite pour le moment l'accès à l'API, elle offre de nombreuses possibilités fort intéressantes pour gérer les adresses des business locaux ou pour obtenir des statistiques sur l'activité locale.

Google My Business en 2018, qu'est-ce que ça vaut ?

Lancé le 12 juin 2014 en France (source : http://bit.ly/2CcowKz), Google My Business est venu stabiliser la série d'outils qui le précédait dans le cœur de Google et des utilisateurs. Au préalable, seules quelques informations géographiques pouvaient être indiquées, mais cela a bien changé. Voici un panel des possibilités actuelles de l'outil, dont certaines sont nées en 2018 et prouvent que Google mise beaucoup sur Google My Business :

  • Gestion des informations locales d'une entreprise : adresse, numéro de téléphone, raison sociale, description, titre, horaires d'ouverture, photos (…) et même des horaires d'ouverture ou fermeture exceptionnelle.
  • Création de publications. Elles s'affichent directement dans la section locale des entreprises au sein des pages de résultats et permettent de faire vivre la page locale. Depuis début 2018, Google a même ajouté deux nouveaux types de publications : « produit » et « offre promotionnelle » en plus des publications classiques.
  • Avis des utilisateurs. Cette fonctionnalité semble de plus en plus utilisée et de nombreuses entreprises bénéficient d'avis positifs ou négatifs à leur encontre.
  • Gestion de multiples adresses d'une même enseigne ou d'un même groupe directement dans l'outil. Si cela était limité à 100 entreprises auparavant, ce n'est plus le cas depuis le 5 juin 2018 grâce à Agency Dashboard, une fonctionnalité qui ouvre l'accès à des milliers d'adresses pour un même établissement d'origine.
  • Possibilité de recevoir des questions qui s'afficheront dans la section locale des SERP, à l'instar d'une F.A.Q. ouverte au public.
  • Ajout des périodes d'affluence afin de prévenir les utilisateurs sur les meilleurs moments pour se rendre dans une entreprise locale ou un magasin (calculées à partir des comportements utilisateurs, etc.).
  • Création d'une page web personnalisable pour aider les entreprises qui n'ont pas de sites web. Cela reste encore très simpliste et sobre, mais l'idée de Google est d'offrir un pack complet de fonctionnalités pour les entreprises locales.


Fig. 1. Section locale d'Abondance dans les SERP de Google.

Google My Business est également un outil intéressant pour suivre l'intérêt des utilisateurs pour les adresses d'une entreprise. En effet, la section « Statistiques » offre plusieurs données fiables sur les recherches locales, comme le nombre de recherches directes (nom ou adresse de l'entreprise qui permet d'afficher la fiche Google My Business) ou indirectes (recherche par activité, service…). Mais le plus intéressant est surtout d'obtenir une liste de requêtes qui ont permis d'afficher les données locales. Quand on sait que Google Analytics est le meilleur ami du « not provided », ces informations ne sont pas négligeables et fournissent un aperçu vraiment valable.


Fig.2. Statistiques et mots-clés utilisés pour des recherches locales.

Et en SEO local, est-ce utile ?

Sur le plan du SEO local, l'objectif des utilisateurs est de remplir au maximum la fiche Google My Business pour qu'elle ressorte dans les SERP. En effet, le taux de remplissage est un facteur, mais surtout, il permet de profiter de la force de chaque donnée. Il convient donc de remplir un bon titre et une bonne description, puis de choisir les bonnes catégories.

Petite astuce : si vous vous inscrivez à Google My Business la première fois, Google ne propose en général qu'une seule catégorie d'intégration pour l'entreprise. Après validation de l'adresse, il faut se rendre dans l'édition de la fiche dans l'outil pour ajouter de nouvelles catégories.

Obtenir des avis (aussi bons que possible idéalement), des questions et poster des publications peut également aider à booster l'affichage de la fiche entreprise. Ajoutons à cela que la liaison avec le site web de l'entreprise peut permettre également d'aider le site à mieux ressortir dans certaines situations.
Dans l'idée, il faut donc utiliser au maximum les possibilités offertes par Google My Business pour ressortir dans les SERP, et ne rien négliger. N'hésitons pas à observer ce que font de grandes enseignes comme Leroy Merlin ou Darty par exemple, qui profitent de chacune des fonctionnalités de l'outil. Cela pourrait nous donner des idées…

Quid de l'API Google My Business ?

L'API Google My Business n'est pas ouverte par défaut dans la console des API de Google (source : http://bit.ly/2LRjnXO). Il faut passer par une demande via un formulaire, et il faut bien admettre que l'accord pour utiliser l'API n'est pas toujours évident à obtenir. Il faut donc cliquer sur le lien « Access Request Form » dans la page http://bit.ly/2ozwkN5 pour accéder au formulaire (un identifiant unique de session est créé pour ce formulaire, c'est pourquoi nous ne pouvons fournir le lien direct).

Pour l'anecdote, il aura fallu quatre demandes dans ce formulaire pour obtenir l'accès à l'API permettant l'écriture de cet article. Il semblerait que Google soit très à cheval sur le fait que l'adresse email proposée dans le formulaire porte le nom de l'entreprise dans le nom de domaine. Par conséquent, si votre domaine est site.fr, alors il faudra fournir une adresse comme contact@site.com par exemple, et non une adresse Gmail.

Une fois le graal obtenu (une confirmation par email), l'API Google My Business est ajoutée dans la console des API de Google (source : http://bit.ly/2LPG1A0). Il suffit donc de l'activer pour pouvoir utiliser ses fonctionnalités.

Google a limité les quotas d'utilisation de l'API à 100 000 appels en lecture par jour, et à 1 000 créations ou éditions par jour pour la fiche Google My Business. Toutefois, il est possible de demander une augmentation des quotas en remplissant un énième formulaire.

Depuis le 29 août 2018, l'API Google My Business est en version 4.2, et offre de nombreuses possibilités aux développeurs (source :  http://bit.ly/2CcUbf7). Il sera difficile d'en faire le tour complet donc nous procèderons à des choix. Mais voici un condensé des possibilités :

  • Obtenir la liste des établissements ;
  • Créer/modifier des établissements (attention, les adresses créées n'apparaîtront dans Google qu'après une vérification manuelle des propriétaires, cela n'est pas possible via l'API) ;
  • Gérer les notes des utilisateurs (obtenir la liste, répondre, supprimer une réponse) ;
  • Obtenir des informations statistiques (recherches directes et indirectes mais aussi des informations sur les itinéraires des usagers) ;
  • Gérer des menus de restaurants pour les afficher dans la fiche locale ;
  • Créer des publications (dont les produits depuis l'API 4.2) ;
  • Gérer les notifications en direct (depuis l'API 4.2) ;
  • Gérer les administrateurs d'un compte Google My Business ;
  • Ajouter des photos à une fiche d'entreprise.

Comment utiliser l'API Google My Business ?

Google fournit des librairies d'exemples, mais cela est limité à trois langages à l'heure d'écrire ces lignes : Java, C# et PHP. Heureusement, nous pouvons également trouver un exemple en Javascript natif également. Cela semble judicieux puisque l'API Google My Business tourne essentiellement autour d'une API REST, donc d'URL faisant des actions classiques comme GET, POST, PUT, PATCH et DELETE (source : http://bit.ly/2LQvrZJ).

Nous utiliserons ici la librairie Google PHP API Client 2.2.2 pour faire fonctionner l'API, bien que des versions précédentes peuvent suffire. En effet, l'API Google My Business ayant un accès restreint par défaut, il faut télécharger un fichier MyBusiness.php (source : http://bit.ly/2NIj6Iu) et l'ajouter manuellement dans la librairie PHP pour pouvoir utiliser toutes les possibilités de l'API 4.2 (il faut l'ajouter dans « vendorgoogleapiclient-servicessrcGoogleService » de la librairie, avec la liste des autres API en PHP). Pour ce qui est du Javascript, rien n'est à télécharger en revanche, il convient juste d'effectuer les tests en ligne car cela ne fonctionne pas en local.

L'utilisation de l'API demande une autorisation (OAuth notamment) de la part de Google et un scope d'utilisation (https://www.googleapis.com/auth/plus.business.manage) afin d'avoir un accès aux méthodes de la librairie, que ce soit en Javascript ou en PHP. Nous vous invitons à revoir les précédents articles au sujet des API si vous n'êtes pas familiers avec l'usage des API de Google.

Premiers pas avec l'API Google My Business

Les premières fonctionnalités de l'API se résument à obtenir des informations sur les comptes existants dans Google My Business. Pour les comptes pro, il est également possible de mettre à jour les champs de base (nom du compte, photo de profil…) mais cela reste assez limité. Et enfin, depuis la version 4.2 de l'API, nous pouvons aussi gérer les notifications relatives à un compte, très facilement (obtention, mise à jour et suppression).

Le code suivant est très simple et sert uniquement de mise en bouche. Tout a été mis ensemble afin de pouvoir tester plusieurs des fonctionnalités citées, à l'exception de la mise à jour qui ne fonctionnera qu'avec des comptes pros. La première partie du code sera reprise dans tous les codes suivants (voir commentaires), ne la perdez pas pour les prochains tests.

<?php
/*===============================*/
/*=== API Client et authentification obligatoire ===*/
/*===============================*/

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

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

// Rédirection pour la connexion OAuth
$client->setAuthConfig('client_secret_xxx.json'); // À adapter à notre compte !
$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/plus.business.manage");

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

// Ajouter un Guzzle (pour cURL en PHP)
$http = new GuzzleHttpClient(['verify' => false]);
$client->setHttpClient($http);
$client->authorize($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();
  }
}

/*==========================*/
/*=== Utilisation des fonctions de l'API ===*/
/*==========================*/

// Appel de la méthode de connexion à l'API Google My Business
$api_mb = new Google_Service_MyBusiness($client);

// Liste des informations relatives aux comptes Google My Business
$mb_accounts = $api_mb->accounts;

// 1. Liste des comptes
$list_accounts = $mb_accounts->listAccounts();
            $affichage = "<table>";
            $affichage.= "<tr>";
            $affichage.= "<th>Compte</th>";
            $affichage.= "<th>Nom du compte</th>";
            $affichage.= "<th>Type de compte</th>";
            $affichage.= "<th>Photo de profil (optionnel)</th>";
            $affichage.= "<th>Numéro de compte (pro)</th>";
            $affichage.= "</tr>";
            foreach($list_accounts as $account) {
                       $affichage.= "<tr>";
                       $affichage.= "<td>".$account['accountName']."</td>";
                       $affichage.= "<td>".$account['name']."</td>";
                       $affichage.= "<td>".$account['type']."</td>";
                       $affichage.= "<td><img src='".$account['profilePhotoUrl']."' alt=''/></td>";
                       $affichage.= "<td>".$account['accountNumber']."</td>";
                       $affichage.= "</tr>";
            }
            $affichage.= "</table>";
            print $affichage;

// 2. Obtenir un compte
$name = "accounts/102468592139657070914"; // Exemple de nom de compte (accounts/ID_compte)
$get_account = $mb_accounts->get($name);
            $affichage = "<table>";
            $affichage.= "<tr>";
            $affichage.= "<th>Compte</th>";
            $affichage.= "<th>Nom du compte</th>";
            $affichage.= "<th>Type de compte</th>";
            $affichage.= "<th>Photo de profil (optionnel)</th>";
            $affichage.= "<th>Numéro de compte (pro)</th>";
            $affichage.= "</tr>";
            $affichage.= "<tr>";
            $affichage.= "<td>".$get_account['accountName']."</td>";
            $affichage.= "<td>".$get_account['name']."</td>";
            $affichage.= "<td>".$get_account['type']."</td>";
            $affichage.= "<td><img src='".$get_account['profilePhotoUrl']."' alt=''/></td>";
            $affichage.= "<td>".$get_account['accountNumber']."</td>";
            $affichage.= "</tr>";
            $affichage.= "</table>";
            print $affichage;

// 3. Obtenir les notifications d'un compte --> Depuis l'API 4
$get_account_notifications = $mb_accounts->getNotifications($name);
            $affichage = "<table>";
            $affichage.= "<tr>";
            $affichage.= "<th>Nom du compte</th>";
            $affichage.= "<th>Type de notification</th>";
            $affichage.= "<th>Sujet de la notification</th>";
            $affichage.= "</tr>";
            $affichage.= "<tr>";
            $affichage.= "<td>".$get_account_notifications['name']."</td>";
            $affichage.= "<td>".$get_account_notifications['notificationTypes']."</td>";
            $affichage.= "<td>".$get_account_notifications['topicName']."</td>";
            $affichage.= "</tr>";
            $affichage.= "</table>";
            print $affichage;

Nous ne nous attarderons pas sur ces premières possibilités qui offrent des données relativement limitées, elles surtout intéressantes si vous gérez beaucoup d'adresses pour sélectionner un compte ou faire remonter les notifications en direct.

Contrôler les données d'un compte Google My Business

Le premier écueil nous a permis de récupérer la liste des comptes existants mais aussi les noms de comptes utiles pour l'API (sous la forme « accounts/ID_COMPTE »). D'autres fonctionnalités permettent d'aller bien plus loin et d'administrer l'ensemble des données d'une fiche Google My Business.
Nous ne pourrons pas faire le tour de toutes les possibilités tant elles sont nombreuses, mais nous allons présenter quelques exemples qu'il suffirait de quelque peu modifier pour réaliser d'autres fonctions usuelles avec l'API.

Nous allons devoir nous concentrer sur la section « accounts_locations » de l'API (source : http://bit.ly/2PxhZvV). Cette dernière contient actuellement 14 méthodes qui offrent diverses possibilités. Tout d'abord, utilisons la méthode « listAccountsLocations(account_name) » pour lister l'ensemble des données d'un compte donné (le vrai nom de la méthode est « list » mais Google renomme parfois les appels originels dans la librairie PHP).

La liste des données est tellement vaste qu'il est parfois complexe de s'y retrouver (voir un échantillon dans la figure 3), c'est pourquoi nous allons créer une fonction d'affichage récursif automatique des données. L'idée est de pouvoir lister très rapidement toutes les données publiques qui concernent un compte Google My Business, sans avoir à chercher manuellement le nom des clés des objets et tableaux proposés par l'API.

Construisons donc une fonction que nous appellerons print_recursive() qui va permettre de lire l'ensemble des données fournie par l'API sans effort, en parcourant niveau de profondeur par niveau de profondeur et en excluant les données privées. Cette fonction prend en premier argument le tableau à parcourir, puis deux booléens (true/false) : le premier sert à autoriser l'affichage des données directement (print/echo en PHP) avec chaque niveau de profondeur distingué par une tabulation ; le second permet de retourner un tableau de données complet puis pour chaque niveau de profondeur, si vous souhaitez obtenir les données d'un niveau en particulier.

Voici la fonction à recopier dans le code utilisant l'API Google My Business (ou ailleurs si vous séparez en plusieurs fichiers) :

function print_recursive($tab = array(), $echo = true, $return = false, $niveau = 0, $first = true) {
            $tab = (array) $tab; // Conversion si nécessaire (object en array)

            if($return === true) {
                       static $new_tab = array();
            }

            foreach($tab as $key => $value) {
                       if(strpos($key, "*") === false) {
                                   if($echo == true) {
                                               if($first !== true) {
                                                          echo "<br/>";
                                               }
                                               echo str_repeat("&nbsp;", $niveau * 4).$key.' => ';
                                   }

                                   if((is_array($value) || is_object($value))) {
                                               print_recursive((array) $value, $echo, $return, $niveau + 1, false);
                                   } else {
                                               if($echo == true) {
                                                          echo $value;
                                               }
                                               $first = false;
                                   }

                                   if($return === true) {
                                               $new_tab[$niveau][$key] = $value;
                                   }
                       }
            }

            if($return === true) {
                       return $new_tab;
            }
}

Ensuite, il ne nous reste plus qu'à obtenir la liste des données et à les afficher de manière brute. Si vous désirez obtenir des données précises, il suffira alors de cibler les clés précises comme « additionalCategories » pour les catégories complémentaires, « regularHours » pour les heures d'ouverture d'un business local, « profile » pour obtenir la description, etc.

$mb_accounts_locations = $api_mb->accounts_locations;

// 1. Liste des données
$account_name = "accounts/100977166597331529578"; // Nom du compte My Business (accounts/ID_compte)
$list_accounts_locations = $mb_accounts_locations->listAccountsLocations($account_name);
            foreach($list_accounts_locations['locations'] as $location) {
                       print_recursive($location, true, false);
            }


Fig. 3. Obtention de l'ensemble des données d'une entreprise locale.

Plus intéressant, nous pouvons éditer les champs existants pour une entreprise locale d'un compte Google My Business choisi. Cela est quelque peu plus technique, mais avec un ou deux exemples, nous pouvons nous en sortir aisément.

Retenons qu'il faut créer une requête PATCH pour mettre à jour les données et que cette dernière demande quelques spécifications :

  • Il faut créer un instance de Google_Service_MyBusiness_Location() pour créer une « nouvelle » liste de données. Cette dernière nous permettra d'éditer des champs en particulier (ou de créer une nouvelle fiche complète si vous préférez faire « create » plutôt que « patch »).
  • Il faut utiliser les méthodes de l'instance pour mettre à jour les champs. Elles sont en général de la forme setChamp(nouvelle_valeur). Par exemple, setPrimaryPhone() édite le numéro de téléphone principal, tout comme setProfile() permet d'éditer le profil (dont la description de la fiche), etc.
  • Il faut ajouter absolument des FieldMasks, c'est-à-dire les champs que vous souhaitez modifier. Sans eux, une erreur 400 sera levée ou pire, toutes les données seront écrasées. Malheureusement, la documentation est absolument inutile pour trouver les FieldMasks et certains forums de Google vous induisent même en erreur avec de mauvais noms de champs. Si vous modifiez plusieurs champs, il faudra indiquer les masques les uns après les autres, séparés par une virgule. Dans l'idée, vous devez remonter hiérarchiquement les champs pour indiquer ceux que vous voulez modifier. Prenons l'exemple des champs de la figure 3. Si nous voulons créer un masque de modification pour les champs « primaryCategory », « websiteUrl » et « regularHours/periods », le FieldMask ressemblera à « primary_category, website_url, regular_hours.periods ». On passe donc des lowerCamelCase aux snake_case pour que cela fonctionne bien…

Voyons désormais un exemple de code qui va mettre à jour le numéro de téléphone principal ainsi que les horaires d'ouverture. Attention tout de même lorsque nous mettons à jour les horaires, la mise à jour s'effectue pour TOUS les horaires, donc si vous ne précisez qu'un jour, les autres jours seront remis par défaut (donc vides). C'est le cas dans notre exemple, l'idée étant juste de montrer le fonctionnement de la mise à jour.

$mb_accounts_locations = $api_mb->accounts_locations;

// 2. Modifier/Ajouter des données
$local_name = "accounts/100977166597331529578/locations/4439508959585189683"; // accounts/ID_compte/locations/ID_location

            // Modifier le numéro de téléphone principal (exemple)
            $location = new Google_Service_MyBusiness_Location();
            $location->setPrimaryPhone("0676342991");
            $location->setLanguageCode("fr");

            // Modifier une date d'ouverture
            $regularHours = new Google_Service_MyBusiness_BusinessHours();
            $timePeriod = new Google_Service_Mybusiness_TimePeriod();
            $timePeriods = array();
            $timePeriod->setOpenDay("SATURDAY");
            $timePeriod->setOpenTime("9:00");
            $timePeriod->setCloseTime("17:00");
            $timePeriod->setCloseDay("SATURDAY");
            $timePeriods[] = $timePeriod;
            $regularHours->setPeriods($timePeriods);
            $location->setRegularHours($regularHours);

            // Mise à jour des données
            $optparams = array(
                       "updateMask" => "primary_phone,regular_hours.periods"
            );
            $update = $mb_accounts_locations->patch($local_name, $location, $optparams);

Ce code va affecter directement les données de la fiche Google My Business. Certes, une validation sera attendue par défaut comme le montre la figure 4 (mention « en attente » pour la vérification), mais la mise à jour est déjà effective dans l'outil.


Fig. 4. Mise à jour des données avec l'API Google My Business.

Nous n'avons montré ici qu'un bref échantillon des possibilités pour gérer la fiche locale, mais les autres méthodes ont un fonctionnement similaire. Vous pourrez donc aisément créer une fiche complète, supprimer une fiche, remettre les données à jour ou obtenir les données d'une ou plusieurs fiches d'un établissement.

Et ce n'est que le début…

L'API Google My Business nous réserve encore bien des surprises, c'est pourquoi nous vous invitons à lire la suite de cet article dans une prochaine lettre d'Abondance. Vous pourrez découvrir d'autres fonctionnalités alléchantes comme la mise en place de publications ou encore la lecture de statistiques relatives à une fiche locale… A très bientôt !


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