Google Drive API, télécharger et convertir ses fichiers par la programmation

Dans le cadre d’un projet récent, j’ai eu à effectuer la migration des documents utilisateur de Google Apps vers la plateforme Office 365.

Chacune des plateformes dispose d’une API sur laquelle il est possible d’effectuer des actions de CRUD sur les fichiers / dossiers.
Dans ce billet, nous allons traiter de la partie Google Drive, qui est le client fourni par Google Apps pour assurer la gestion électronique documentaire (GED).

A la fin de celui-ci, vous serez capable de vous connecter à l’API Google Drive via une application .NET et de parcourir et télécharger les fichiers de votre choix.

Google Apps

Google Apps est la plateforme de Google dédiée principalement aux entreprises regroupant un grand nombre de fonctionnalités de collaboration : Mails, Documents, Calendriers, Discussion instantanée, Etc.

Créer un compte de service

Afin de pouvoir se connecter à l’ensemble de nos utilisateurs pour récupérer leurs documents via l’API Google, vous aurez dans un premier temps besoin de créer un projet Google Drive.
Pour cela
  1. Rendez-vous sur https://console.developers.google.com
  2. Allez dans la partie « API » située à gauche sous « API et authentification »
  3. Recherchez « Drive Api »
  4. Cliquez sur Drive API
  5. Vous pourrez alors cliquer sur « Activer l’API »
  6. Une fois cette étape effectuée, rendez-vous dans la partie « Identifiants » sous API et authentification
  7. Un écran vous propose d’en créer, dont un compte de service, sélectionnez celui-ci 
  8. Vous aurez ensuite à choisir le type de clé que vous désirez, au format JSON ou P12, ici nous avons choisi le dernier
  9. Une fois la création terminée, vous recevrez une clé au format désiré, ici p12, et vous aurez accès aux informations concernant le compte de service créé. Il vous donne également le pass générique utilisé : notasecret.
  10. Gardez-bien ces informations ainsi que le fichier, vous aurez besoin de ceux-ci pour vous connecter plus tard. Et vous ne pourrez plus le retélécharger, il faudra forcément recréer un nouveau fichier P12.

Autoriser l’API Drive à se connecter sur votre environnement d’entreprise

De base, l’accès vous sera refusé si vous essayez de vous connecter avec l’API à votre environnement d’entreprise.

En effet, il y a une sécurité supplémentaire à outrepasser afin de donner le droit à l’API Drive d’interagir avec les documents de votre entreprise.

Pour cela,
  1. Assurez-vous d’être administrateur du domaine Google Apps et rendez-vous sur la plateforme d’administration de google
  2. Cliquez sur la section Sécurité 
  3. Cliquez ensuite sur « Plus d’éléments » pour accéder à la partie « Paramètres avancés »
  4. Dans la partie « Paramètres avancés », allez sur la section « Gérer l’accès au client API »
  5. Ici, vous pourrez ajouter le compte de service afin que l’API Drive puisse accéder aux documents de vos utilisateurs. Pour cela, remplissez le champ « nom du client » avec le nom du compte de service « XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.apps.googleusercontent.com » et dans le second champ, il faudra rentrer « https://www.googleapis.com/auth/drive » et cliquer sur Autoriser

Installer le client .NET

Google fourni une interface .NET d’accès aux données pour faciliter l’accès à son API.
Celle-ci est accessible via un package nuget : Google APIs Client Library
 
  • Install-Package Google.Apis
Celui-ci va vous installer un bon nombre de dlls qui vont vous permettre de communiquer directement en .NET avec l’API de Google.
Vous aurez également besoin d’un autre paquet nuget, spécifique à l’API Drive cette fois : Google Drive API V2
  • Install-Package Google.Apis.Drive.v2

Ajouter les références

Afin de pouvoir utiliser ces nouvelles dlls, vous aurez besoin dans un premier temps d’ajouter ces références :
using Google.Apis.Auth.OAuth2;
using Google.Apis.Drive.v2;
using Google.Apis.Drive.v2.Data;
using Google.Apis.Http;
using Google.Apis.Services;
using File = Google.Apis.Drive.v2.Data.File;

S’authentifier

Une fois le package nuget installé et les dlls référencées, la première étape est de se connecter à l’API.
Pour cela, lors de l’initialisation de votre service, vous aurez besoin de récupérer des identifiants au format IConfigurableHttpClientInitializer.

Munissez vous du fichier P12 précédemment récupéré ainsi que du nom de votre compte de service.

Une fois ceux-ci en main, vous pourrez récupérer vos identifiants de connexion de la façon suivante :

private static IConfigurableHttpClientInitializer Authenticate()
{
    X509Certificate2 cert = new X509Certificate2(@"CheminVersVotreFichierP12.p12""notasecret"X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
 
    ServiceAccountCredential cred = new ServiceAccountCredential(
        new ServiceAccountCredential.Initializer("nomDeVotreCompteDeService@developer.gserviceaccount.com")
        {
            User = "emailBidon@clt-services.com"// Vous pouvez spécifier un utilisateur spécifique ici
            Scopes = new[] { DriveService.Scope.Drive },
        }.FromCertificate(cert));
    return cred;
}

Scopes

A noter que lors de l’authentification au service, il est possible de définir plusieurs différents scopes, dans notre cas, vous pouvez voir Scopes = new[] { DriveService.Scope.Drive }, celui-ci correspond aux droits les plus élevés, écriture et lecture sur tout le contenu.

Cependant, vous pouvez ne vouloir autoriser que certains accès à votre application, dans notre cas nous pourrions par exemple, ne mettre que le scope Readonly.

Vous pourrez retrouver l’ensemble des scopes qu’il est possible d’utiliser depuis la documentation de l’API fournie par Google.

Instancier le service Drive

Vos identifiants prêts, il ne vous reste plus qu’à définir votre service :
DriveService service = new DriveService(new BaseClientService.Initializer
{
    HttpClientInitializer = cred,
    ApplicationName = "GoogleDriveToOneDrive",
});

Récupérer les données de vos premiers fichiers

La configuration et l’installation étant terminées, il ne vous reste plus qu’à tirer parti de l’API et du client .NET pour faire ce que vous voulez avec l’API Google Drive.

Par exemple, si vous voulez récupérer l’ensemble des fichiers dont EmailBidon est propriétaire, il vous faudra faire :

public static List<File> RetrieveAllFiles(DriveService service)
{
    List<File> result = new List<File>();
    FilesResource.ListRequest request = service.Files.List();
    request.MaxResults = 1000;
    const string ownerToFilter = "emailbidon@clt-services.com";
    request.Q = (ownerToFilter + " IN owners");
    int i = 0;
    do
    {
        try
        {
            using (var client = new WebClient())
            {
                FileList files = request.Execute();
 
                result.AddRange(files.Items);
                request.PageToken = files.NextPageToken;
                i++;
                foreach (File file in files.Items)
                {
                        // Faites ce que vous voulez ici dans les fichiers récupérés
                        // Dans notre cas, nous appelons une méthode permettant de traiter & télécharger les fichiers concernés
                        Task<Stream> test = DownloadFile(file, service, ownerToFilter);
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("An error occurred: " + e.Message);
            request.PageToken = null;
        }
    } while (!String.IsNullOrEmpty(request.PageToken) || i < 11);
    return result;
}

 

A l’inverse de cela, si vous voulez récupérer tous les fichiers, il vous suffira de retirer request.Q = (ownerToFilter +  » IN owners »);
Il est également possible de filtrer sur un grand nombre de données grâce à cette requête :
  • Enfants d’un dossier (IDParent IN parents)
  • Type des fichiers (mime-type)
  • Etc
L’ensemble des filtres qu’il est possible d’utiliser sont répertoriés sur la documentation : https://developers.google.com/drive/web/search-parameters

Télécharger sur votre poste les fichiers parcourus

Si vous regardez les attributs publics dont dispose la classe File issue de la dll Google.Apis.Drive.v2.Data, vous retrouverez « DownloadUrl »
[JsonProperty("downloadUrl")]
public virtual string DownloadUrl { getset; }
Celui-ci est présent sur les fichiers de type « fichiers (pas les dossiers) », qui ne sont pas au format propriétaire Google.

En revanche, celui-ci ne sera pas mis à disposition lorsqu’ils sont au format propriétaire de Google, c’est le cas pour les documents de type : 
 
  • Google Sheets
  • Google Docs
  • Google Slides
  • Google Forms
  • Etc
Ainsi, pour ceux-là, il vous faudra choisir le type de format dans lequel vous souhaitez les exporter. Différents liens sont présents via la propriété ExportLinks
[JsonProperty("exportLinks")]
public virtual IDictionary<stringstring> ExportLinks { getset; }

Dans celle-ci, vous retrouverez différentes urls avec le format d’export que vous désirez.

Par exemple, si vous désirez convertir une feuille de calcul Google au format Excel (.xlsx), vous pourrez obtenir l’url du document au format .xlsx :



if (file.MimeType == "application/vnd.google-apps.spreadsheet")
{
    string excelFile = file.ExportLinks.SingleOrDefault(f => f.Value.Contains("exportFormat=xlsx")).Value;
    if (excelFile != null && !String.IsNullOrWhiteSpace(excelFile))
    {
        url = excelFile;
    }
}
 
Une fois l’URL obtenue, il ne vous reste plus qu’à télécharger le fichier de la façon qu’il vous plaît de le faire.

Par exemple avec ce bout de code :

if (!String.IsNullOrEmpty(url)) 
{
    HttpResponseMessage response = await service.HttpClient.GetAsync(new Uri(url));
    if (response.StatusCode == HttpStatusCode.OK)
    {
        Stream stream = await response.Content.ReadAsStreamAsync();
        var filePath = @"cheminDuFichierLocal";
 
        using (var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
        {
            stream.CopyTo(fileStream);
        }
    }
}
Le prochain billet traitera de sa contrepartie en explicitant la mise à disposition de documents sous OneDrive en utilisant le modèle client object CSOM de SharePoint Online.

Plus loin

Pour les curieux, une solution est mise à disposition sur GitHub permettant de télécharger une arborescence Google Drive à partir d’un id de dossier parent pour la retranscrire sous OneDrive :
Pour plus de détails sur ce que l’API ou le client .NET Google Drive est capable de vous apporter, je vous invite à visiter la documentation officielle de Google, accessible via les liens ci-dessous :

2 réflexions sur “Google Drive API, télécharger et convertir ses fichiers par la programmation

  1. Max

    Bonjour , je travail actuellement sur un projet de ce type, comment avait vous géré les dossiers ou fichiers disposant de plusieurs « parent ids » dans GDrive afin de les retranscrire dans OneDrive?

    J'aime

  2. Max

    Bonjour , je travail actuellement sur un projet de ce type, comment avez vous géré les dossiers ou fichiers disposant de plusieurs « parent ids » dans GDrive afin de les retranscrire dans OneDrive?

    J'aime

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s