Как исправить ситуацию, если мои файлы на Google Диске не отображаются через API?

Почему мой сервисный аккаунт Google API не видит файлы на диске, хотя они присутствуют? Я создал сервис-аккаунт из-под своего основного аккаунта и использую его для работы с Google Диск через PythonAnywhere. Мои попытки поиска информации по этой проблеме не увенчались успехом. Когда я пишу "обратная проблема", я имею в виду, что пользователь не видит файлы, добавленные на Google Диск через сервисный аккаунт. 

Это мой код:

```python
from google.oauth2 import service_account
from googleapiclient.discovery import build

SCOPES=['https://www.googleapis.com/auth/drive.metadata.readonly']
SERVICE_ACCOUNT_FILE = '12345.json'

credentials=service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE,scopes=SCOPES)
service=build("drive", "v3", credentials=credentials)

items=(
        service.files()
        .list(pageSize=10, fields="nextPageToken, files(id, name)")
        .execute()
).get("files", [])

if not items:
    print("No files found.")
else:
    print("Files:")
    for item in items:
        print(f"{item['name']} ({item['id']})")
```

Я создал этот код, чтобы получить доступ к Google Диску на PythonAnywhere.
  • 23 января 2024 г. 22:08
Ответы на вопрос 2
Сервисные аккаунты в Google Cloud Platform работают немного иначе, чем обычные пользовательские аккаунты. Сервисный аккаунт ассоциирован с приложением, а не с конкретным пользователем и имеет собственное хранилище файлов в Google Диск.

Вот несколько возможных причин, почему сервисный аккаунт не видит файлы:

1. Сервисный аккаунт ищет файлы в своем собственном пространстве Google Диска, а не в вашем личном. Таким образом, файлы, загруженные через ваш основной аккаунт Google, не будут видны сервисному аккаунту, если вы явно не предоставили ему доступ к этим файлам или если вы не делитесь файлами со специально созданным `shared drive`.

2. Если вы хотите предоставить сервисному аккаунту доступ к файлам на вашем личном Google Диске, вам нужно "делиться" (share) файлами или папками с этим сервисным аккаунтом. Это можно сделать через интерфейс Google Диска, добавив электронный адрес сервисного аккаунта в список пользователей с правом доступа к файлу или папке.

Вы можете сделать следующее:
   - Перейдите к файлу или папке на своем Google Диске, которым хотите поделиться.
   - Кликните правой кнопкой мыши и выберите «Делиться» (Share).
   - Введите email адрес сервисного аккаунта и предоставьте нужные разрешения.

3. Перед тем, как использовать API, убедитесь, что сервисный аккаунт добавлен в список допущенных аккаунтов для API в вашем проекте на платформе Google Cloud Platform.

4. Убедитесь, что область действия (scope) API правильно установлена. В вашем случае вы используете только `drive.metadata.readonly`, который позволяет вам получать метаданные файлов, но, возможно, вам потребуется расширенный доступ, например `https://www.googleapis.com/auth/drive.readonly` для получения доступа к содержимому файло.

5. Если после всех этих шагов проблема не решена, проверьте код на наличие ошибок и убедитесь, что файл ключей для сервисного аккаунта корректный и доступен в вашем окружении на PythonAnywhere.

Если ни одно из вышеперечисленных решений не помогло, вам стоит обратить внимание на настройки разрешений и квоты API в консоли GCP для вашего проекта. Проверьте, не превысили ли вы квоты, и проверьте журналы вашего API на наличие ошибок доступа.
Так сервисный аккаунт пустой же создаётся. Что загрузишь через него - то и будет видно. Ну и доступ к файлам получаешь только через тот же сервисный акк, через который загружал. Разве нет?
Похожие вопросы