2

Я пытаюсь подключиться к своей личной учетной записи Google Диска и собрать список имен файлов.C# API-интерфейс Google Диска Список файлов с моего личного диска

То, что я сделал:

  1. установлены все пакеты NuGet требуется
  2. Добавлена ​​Google Drive Менеджеру API в консоли разработчика Google
  3. настроить Service Account и загрузить ключ P12 для аутентификации
  4. Написал следующий код, чтобы позвонить по API:

    string EMAIL = "[email protected]"; 
    string[] SCOPES = { DriveService.Scope.Drive }; 
    StringBuilder sb = new StringBuilder(); 
    
    X509Certificate2 certificate = new X509Certificate2(@"c:\\DriveProject.p12", 
               "notasecret", X509KeyStorageFlags.Exportable); 
    ServiceAccountCredential credential = new ServiceAccountCredential(
        new ServiceAccountCredential.Initializer(EMAIL) { 
        Scopes = SCOPES 
        }.FromCertificate(certificate) 
    ); 
    
    DriveService service = new DriveService(new BaseClientService.Initializer() { 
        HttpClientInitializer = credential 
    }); 
    
    FilesResource.ListRequest listRequest = service.Files.List(); 
    IList<Google.Apis.Drive.v3.Data.File> files = listRequest.Execute().Files; 
    if (files != null && files.Count > 0) 
        foreach (var file in files) 
         sb.AppendLine(file.Name); 
    

Этот код работает нормально. Проблема в том, что я получаю только один возвращаемый файл, он называется «Getting started.pdf», и я понятия не имею, откуда, черт возьми, он приходит. Я думаю, что проблема в том, что моя личная учетная запись Google Диска не подключена к этому коду. Как получить этот вызов, чтобы вернуть файлы из моей личной учетной записи Google Диска?

Единственная помощь, которую я смог найти, заключалась в том, чтобы получить доступ к любым конечным пользователям учетной записи Google Диска в вашем интерфейсе. Мой сценарий отличается от этого. Я хочу только подключиться к моим Google Drive за кулисами.

ответ

3

Вы подключаетесь к учетной записи службы, которая не подключитесь к вашей личной учетной записи Google. Подумайте о учетной записи службы как о ее собственном пользователе, она имеет собственную учетную запись Google. Который, запуская files.list, очевидно, прямо сейчас не имеет на нем никаких файлов.

Решение 1:

Загрузить несколько файлов службы учетных записей Google Диске

Решение 2:

Возьмите учетной записи службы электронной почты и общий доступ к папке на вашем Google диске учетной записи в учетной записи службы, как и любой другой пользователь. Я не уверен, может ли он поделиться полной учетной записью с накопителем или нет. Дайте мне знать, если вам удастся разделить корневую папку :)

Обновление для комментариев: Откройте Google Drive на веб-сайте. щелкните правой кнопкой мыши папку, чтобы поделиться ею с другими. Добавьте адрес электронной почты учетной записи службы. У стрелы есть доступ.

Решение 3:

Переключить на oauth2 аутентификация кода один раз, когда вы получаете от маркеров в любое время обновления вы запустите приложение там после того, как просто использовать этот маркер обновления, чтобы получить доступ к вашей личной учетной записи диска.

Обновление для комментариев: вам нужно будет аутентифицировать его вручную один раз. После этого клиентская библиотека загрузит токен обновления для вас. Его хранят на машине.

oauth2 Drive v3 Пример кода:

/// <summary> 
/// This method requests Authentcation from a user using Oauth2. 
/// Credentials are stored in System.Environment.SpecialFolder.Personal 
/// Documentation https://developers.google.com/accounts/docs/OAuth2 
/// </summary> 
/// <param name="clientSecretJson">Path to the client secret json file from Google Developers console.</param> 
/// <param name="userName">Identifying string for the user who is being authentcated.</param> 
/// <returns>DriveService used to make requests against the Drive API</returns> 
public static DriveService AuthenticateOauth(string clientSecretJson, string userName) 
{ 
    try 
    { 
     if (string.IsNullOrEmpty(userName)) 
      throw new Exception("userName is required."); 
     if (!File.Exists(clientSecretJson)) 
      throw new Exception("clientSecretJson file does not exist."); 

     // These are the scopes of permissions you need. It is best to request only what you need and not all of them 
     string[] scopes = new string[] { DriveService.Scope.Drive };     // View and manage the files in your Google Drive   
     UserCredential credential; 
     using (var stream = new FileStream(clientSecretJson, FileMode.Open, FileAccess.Read)) 
     { 
      string credPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); 
      credPath = Path.Combine(credPath, ".credentials/apiName"); 

      // Requesting Authentication or loading previously stored authentication for userName 
      credential = GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.Load(stream).Secrets, 
                    scopes, 
                    userName, 
                    CancellationToken.None, 
                    new FileDataStore(credPath, true)).Result; 
     } 

     // Create Drive API service. 
     return new DriveService(new BaseClientService.Initializer() 
     { 
      HttpClientInitializer = credential, 
      ApplicationName = "Drive Authentication Sample", 
     }); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("Create Oauth2 DriveService failed" + ex.Message); 
     throw new Exception("CreateOauth2DriveFailed", ex); 
    } 
} 
+0

Большое спасибо за Ваш ответ! Решение 1 - это не вариант, но два других звука идеальны. Предостережение для решения 2 не является проблемой для меня, потому что я не хочу проходить через корневой каталог Google Диска в любом случае. –

+0

Мне просто нужно немного больше советов. Для # 2 вы говорите: «Делитесь папкой на своей учетной записи Google в учетной записи службы, как и любой другой пользователь», и я не уверен, как это сделать. У меня нет никаких других пользователей *, поэтому, если бы вы могли прояснить это, я был бы признателен! Для # 3 я не уверен, как получить токен обновления, который вы упомянули. Поскольку мой код работает в сервисе, я не могу себе представить, как он может открыть интерфейс Google и позволить мне войти в систему в первый раз. Есть ли простой способ вручную захватить один из этих токенов? Если да, истекают ли они? Еще раз спасибо! –

+1

до тех пор, пока вы не измените имя пользователя, которое вы отправляете с помощью Oauth2, будут использовать те же учетные данные, но учетные данные все равно могут не работать. На самом деле я бы пошел с номером 2, если можно. – DaImTo