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.
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

Créer un compte de service
- Rendez-vous sur https://console.developers.google.com
- Allez dans la partie « API » située à gauche sous « API et authentification »
- Recherchez « Drive Api »
- Cliquez sur Drive API
- Vous pourrez alors cliquer sur « Activer l’API »
- Une fois cette étape effectuée, rendez-vous dans la partie « Identifiants » sous API et authentification
- Un écran vous propose d’en créer, dont un compte de service, sélectionnez celui-ci
- Vous aurez ensuite à choisir le type de clé que vous désirez, au format JSON ou P12, ici nous avons choisi le dernier
- 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.
- 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.
- Assurez-vous d’être administrateur du domaine Google Apps et rendez-vous sur la plateforme d’administration de google
- Cliquez sur la section Sécurité
- Cliquez ensuite sur « Plus d’éléments » pour accéder à la partie « Paramètres avancés »
- Dans la partie « Paramètres avancés », allez sur la section « Gérer l’accès au client API »
- 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
- Install-Package Google.Apis
- Install-Package Google.Apis.Drive.v2
Ajouter les 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
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
DriveService service = new DriveService(new BaseClientService.Initializer { HttpClientInitializer = cred, ApplicationName = "GoogleDriveToOneDrive", });
Récupérer les données de vos premiers fichiers
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; }
- Enfants d’un dossier (IDParent IN parents)
- Type des fichiers (mime-type)
- Etc
Télécharger sur votre poste les fichiers parcourus
[JsonProperty("downloadUrl")] public virtual string DownloadUrl { get; set; }
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
[JsonProperty("exportLinks")] public virtual IDictionary<string, string> ExportLinks { get; set; }
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; } }
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); } } }
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?
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?