Реализовать поддержку общего диска

В этом документе описывается, как реализовать поддержку общих дисков в вашем приложении с помощью API Google Drive.

Общие диски используют иные модели организации, совместного доступа и владения, чем «Мой диск». Если ваше приложение будет создавать и управлять файлами на общих дисках, вам необходимо реализовать поддержку общих дисков в самом приложении. Сложность реализации зависит от функциональности вашего приложения.

Для начала необходимо добавить параметр запроса supportsAllDrives=true в запросы, выполняемые вашим приложением при выполнении следующих операций:

Drive API v3

  • files.get
  • files.list
  • files.create
  • files.update
  • files.copy
  • files.delete
  • changes.list
  • changes.getStartPageToken
  • permissions.list
  • permissions.get
  • permissions.create
  • permissions.update
  • permissions.delete

Drive API v2

  • files.get
  • files.list
  • files.insert
  • files.update
  • files.patch
  • files.copy
  • files.trash
  • files.untrash
  • files.delete
  • files.touch
  • children.insert
  • parents.insert
  • changes.list
  • changes.getStartPageToken
  • changes.get
  • permissions.list
  • permissions.get
  • permissions.insert
  • permissions.update
  • permissions.patch
  • permissions.delete

Параметр supportsAllDrives=true сообщает Google Drive, что ваше приложение предназначено для работы с файлами на общих дисках.

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

Поиск контента на общем диске

Используйте метод list ресурса files для поиска пользовательских файлов на общих дисках. Для поиска на общем диске см. раздел «Поиск на общих дисках» .

Метод list содержит следующие общие параметры запроса, специфичные для каждого диска:

  • driveId : Идентификатор общего диска для поиска.

  • corpora : Наборы элементов (файлов или документов), к которым применяется запрос. Поддерживаются типы данных: user , domain , drive и allDrives . Для повышения эффективности предпочтительнее использовать user или drive вместо allDrives . По умолчанию для параметра corpora установлено значение user .

  • includeItemsFromAllDrives : Указывает, следует ли включать в результаты как элементы "Мой диск", так и элементы общего диска. Если параметр отсутствует или имеет значение false, элементы общего диска не возвращаются.

  • supportsAllDrives : Указывает, поддерживает ли запрашивающее приложение одновременно «Мой диск» и общий диск. Если значение равно false, элементы общего диска не включаются в ответ.

Следующие режимы запросов характерны именно для общих дисков:

includeItemsFromAllDrives corpora Описание запроса
true user Выполняет поиск файлов, к которым пользователь обращался, включая файлы как на общем диске, так и в разделе «Мой диск».
true domain Выполняет запросы к файлам, предоставленным в общий доступ в домене, включая файлы как на общих дисках, так и в разделе «Мой диск».
true drive Выполняет запрос ко всем элементам на указанном общем диске. driveId должен быть указан в запросе.
true allDrives Выполняется запрос к файлам, к которым пользователь обращался, и ко всем общим дискам, в которых он зарегистрирован. Обратите внимание, что ответ может содержать incompleteSearch:true , указывающее на то, что поиск по некоторым корпусам не проводился.

Приведенные ниже примеры кода показывают, как осуществлять поиск файлов на всех общих дисках, а также на диске «Мой диск»:

Python

files = []
page_token = None
while True:
    response = drive_service.files().list(
        q="mimeType='application/vnd.google-apps.folder'",
        spaces='drive',
        corpora='allDrives',
        supportsAllDrives=True,
        includeItemsFromAllDrives=True,
        fields='nextPageToken, files(id, name)',
        pageToken=page_token
    ).execute()
    files.extend(response.get('files', []))
    page_token = response.get('nextPageToken', None)
    if not page_token:
        break

Node.js

let files = [];
let pageToken = null;
do {
  const response = await drive_service.files.list({
    q: "mimeType='application/vnd.google-apps.folder'",
    spaces: 'drive',
    corpora: 'allDrives',
    supportsAllDrives: true,
    includeItemsFromAllDrives: true,
    fields: 'nextPageToken, files(id, name)',
    pageToken: pageToken
  });
  files = files.concat(response.data.files);
  pageToken = response.data.nextPageToken;
} while (pageToken);

Java

List<File> files = new ArrayList<>();
String pageToken = null;
do {
  FileList result = driveService.files().list()
      .setQ("mimeType='application/vnd.google-apps.folder'")
      .setSpaces("drive")
      .setCorpora("allDrives")
      .setSupportsAllDrives(true)
      .setIncludeItemsFromAllDrives(true)
      .setFields("nextPageToken, files(id, name)")
      .setPageToken(pageToken)
      .execute();
  files.addAll(result.getFiles());
  pageToken = result.getNextPageToken();
} while (pageToken != null);

локон

curl -X GET \
  'https://www.googleapis.com/drive/v3/files?corpora=allDrives&includeItemsFromAllDrives=true&supportsAllDrives=true&fields=nextPageToken%2Cfiles(id%2Cname)' \
  -H 'Authorization: Bearer ACCESS_TOKEN' \
  -H 'Accept: application/json'

Замените ACCESS_TOKEN на токен OAuth 2.0 вашего приложения.

Отслеживание изменений на общем диске

Используйте метод list для ресурса changes , чтобы отслеживать изменения на общем диске. Дополнительную информацию см. в разделе «Отслеживание изменений для пользователей и общих дисков» .

Метод list содержит следующие общие параметры запроса, специфичные для каждого диска:

  • driveId : Общий диск, с которого возвращаются изменения. Если указано, идентификаторы изменений относятся к изменениям элементов на общем диске, определяя текущее состояние файла. Для ссылки на конкретное изменение на общем диске необходимо использовать как идентификатор общего диска, так и идентификатор изменения в качестве идентификатора.

  • includeItemsFromAllDrives : Следует ли включать файлы или изменения, внесенные на общий диск, в список изменений.

  • supportsAllDrives : Указывает, поддерживает ли запрашивающее приложение общие диски. Если значение равно false, то элементы общих дисков, включая как сами общие диски, так и файлы внутри них, не возвращаются.

Следующие режимы запросов характерны именно для общих дисков:

includeItemsFromAllDrives driveId Описание запроса
true Нет Изменения отражают изменения файлов внутри или вне общих дисков, к которым пользователь обращался, а также изменения в общих дисках, участником которых является пользователь.
true Да Изменения отражают изменения, внесенные в указанный общий диск и в содержимое этого диска.

Приведенные ниже примеры кода демонстрируют, как отслеживать изменения на общем диске:

Python

# 1. Get the start page token for the shared drive.
response = drive_service.changes().getStartPageToken(
    supportsAllDrives=True,
    driveId='SHARED_DRIVE_ID'
).execute()
start_page_token = response.get('startPageToken')

# 2. List changes starting from the page token.
response = drive_service.changes().list(
    pageToken=start_page_token,
    supportsAllDrives=True,
    includeItemsFromAllDrives=True,
    driveId='SHARED_DRIVE_ID'
).execute()
changes = response.get('changes', [])

Node.js

// 1. Get the start page token for the shared drive.
const tokenResponse = await drive_service.changes.getStartPageToken({
  supportsAllDrives: true,
  driveId: 'SHARED_DRIVE_ID'
});
const startPageToken = tokenResponse.data.startPageToken;

// 2. List changes starting from the page token.
const response = await drive_service.changes.list({
  pageToken: startPageToken,
  supportsAllDrives: true,
  includeItemsFromAllDrives: true,
  driveId: 'SHARED_DRIVE_ID'
});
const changes = response.data.changes;

Java

// 1. Get the start page token for the shared drive.
StartPageToken tokenResult = driveService.changes().getStartPageToken()
    .setSupportsAllDrives(true)
    .setDriveId("SHARED_DRIVE_ID")
    .execute();
String startPageToken = tokenResult.getStartPageToken();

// 2. List changes starting from the page token.
ChangeList changesResult = driveService.changes().list(startPageToken)
    .setSupportsAllDrives(true)
    .setIncludeItemsFromAllDrives(true)
    .setDriveId("SHARED_DRIVE_ID")
    .execute();
List<Change> changes = changesResult.getChanges();

локон

# 1. Get the start page token for the shared drive.
curl -X GET \
  'https://www.googleapis.com/drive/v3/changes/startPageToken?supportsAllDrives=true&driveId=SHARED_DRIVE_ID' \
  -H 'Authorization: Bearer ACCESS_TOKEN' \
  -H 'Accept: application/json'

# 2. List changes starting from the page token.
curl -X GET \
  'https://www.googleapis.com/drive/v3/changes?pageToken=START_PAGE_TOKEN&supportsAllDrives=true&includeItemsFromAllDrives=true&driveId=SHARED_DRIVE_ID' \
  -H 'Authorization: Bearer ACCESS_TOKEN' \
  -H 'Accept: application/json'

Замените следующее:

  • SHARED_DRIVE_ID : Идентификатор общего диска.
  • ACCESS_TOKEN : Токен OAuth 2.0 вашего приложения.
  • START_PAGE_TOKEN : Токен начальной страницы для общего диска.

Замените SHARED_DRIVE_ID на идентификатор общего диска.

Включите поддержку общих дисков в пользовательском интерфейсе Google Диска.

Чтобы получить доступ к содержимому общих дисков через пользовательский интерфейс Google Диска, убедитесь, что на вкладке «Интеграция с пользовательским интерфейсом Google Диска» в консоли Google Cloud установлен флажок « Поддержка общих дисков ». Дополнительную информацию см. в разделе «Настройка интеграции с пользовательским интерфейсом Google Диска» .

Используйте Google Picker для работы с общими дисками.

Инструмент Google Picker поддерживает выбор элементов на общих дисках. Подробную информацию о включении поддержки общих дисков и добавлении представлений общих дисков в инструмент выбора см. в API Google Picker .