Ошибка «Предоставленное изображение в неподдерживаемом формате» при попытке вставить изображение в презентацию Google Slides - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь вставить изображение (PNG) в презентацию Google Slide с помощью API Slides. Я делаю это, сначала загружая изображение на диск пользователя, получая URL, передавая его в Slide API через правильный запрос, а затем удаляя файл изображения.

То, что раньше работало в течение нескольких недель a go:

image_url = '%s&access_token=%s' % (
          drive_service.files().get_media(fileId=image_file_id).uri,
          creds.token)

Однако в API накопителя произошли изменения, так что URL-адреса, созданные таким образом, больше не работают.

У меня возникло Трудно найти новый правильный URL для использования здесь. Варианты в соответствии с do c, который описывает изменение:

  1. Использовать webContentLink - Загрузки
  2. Использовать webViewLink - Просмотр
  3. Использовать exportLinks - Экспорт

Я использую код, похожий на этот, чтобы получить эти ссылки:

 upload = drive_service.files().create(
          body={'name': 'My Image File'},
          media_body=media_body,
          fields='webContentLink, id, webViewLink').execute()
 image_url = upload.get('webContentLink')

Я пробовал и # 1, и # 2 и получаю следующую ошибку:

"Invalid requests[0].createImage: The provided image is in an unsupported format."

Я также периодически получал следующую ошибку: "Invalid requests[0].createImage: Access to the provided image was forbidden."

Я подтвердил, что могу загрузить / просмотреть изображение с URL-адресов, созданных в # 1, и # 2. Я не пробовал №3, поскольку не пытаюсь экспортировать в другой формат.

Как лучше всего go определить правильный URL-адрес для использования?

Ответы [ 2 ]

3 голосов
/ 11 февраля 2020

Из вашего скрипта я думаю, что причина вашей проблемы в этом . При этом параметр запроса access_token не может быть использован. В этой ситуации, когда используется image_url = '%s&access_token=%s' % (drive_service.files().get_media(fileId=image_file_id).uri,creds.token), страница входа возвращается. При этом возникает такая ошибка. Итак, как обходной путь, как насчет следующего потока?

Поток:

  1. Загрузить файл PNG.
  2. Публичный доступ к файлу PNG путем создания разрешения.
  3. Вставьте файл PNG в слайды.
  4. Закройте общий файл PNG, удалив разрешение.

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

Пример сценария:

Для вышеописанного потока пример сценария python выглядит следующим образом. Пожалуйста, установите переменные uploadFilename, presentation_id и pageObjectId

uploadFilename = './sample.png'  # Please set the filename with the path.
presentation_id = '###'  # Please set the Google Slides ID.
pageObjectId = '###'  # Please set the page ID of the Slides.

drive = build('drive', 'v3', credentials=creds)
slides = build('slides', 'v1', credentials=creds)

# 1. Upload a PNG file from local PC
file_metadata = {'name': uploadFilename}
media = MediaFileUpload(uploadFilename, mimetype='image/png')
upload = drive.files().create(body=file_metadata, media_body=media, fields='webContentLink, id, webViewLink').execute()
fileId = upload.get('id')
url = upload.get('webContentLink')

# 2. Share publicly the uploaded PNG file by creating permissions.
drive.permissions().create(fileId=fileId, body={'type': 'anyone', 'role': 'reader'}).execute()

# 3. Insert the PNG file to the Slides.
body = {
    "requests": [
        {
            "createImage": {
                "url": url,
                "elementProperties": {
                    "pageObjectId": pageObjectId
                }
            }
        }
    ]
}
slides.presentations().batchUpdate(presentationId=presentation_id, body=body).execute()

# 4. Delete the permissions. By this, the shared PNG file is closed.
drive.permissions().delete(fileId=fileId, permissionId='anyoneWithLink').execute()

Примечание:

  • Я думал, что из вашего скрипта вы можете использовать google-api- python -клиент с python. Поэтому я предложил пример сценария для python.
  • . В этом случае требуются области для использования Slides API и Drive API. Пожалуйста, будьте осторожны с этим.
  • В случае скрипта Служб Google вы можете увидеть пример скрипта по адресу здесь .

Ссылки:

Если я неправильно понял ваш вопрос, и это было не то направление, которое вы хотите, прошу прощения.

0 голосов
/ 11 февраля 2020

Я столкнулся с той же ошибкой даже при использовании потока, предусматривающего предоставление доступа к временным разрешениям и удаление разрешений после вызова .createImage() или .replaceAllShapesWithImage()

Я также столкнулся с этой ошибкой при создании разрешений для папки, содержащей эти изображения: "Invalid requests[0].replaceAllShapesWithImage: Access to the provided image was forbidden." Не уверен, почему разрешения не распространяются на изображения ...

После Kos 'комментарий, переход на тип файла jpg работал для меня.

Редактировать:

Похоже, мне также необходимо установить область действия на 'https://www.googleapis.com/auth/drive', чтобы она работала, что не идеально, но достаточно на данный момент.

Редактировать 2:

Не имеет значения, что это кажется противоречивым. Я снова сталкиваюсь с ошибкой доступа прав доступа. Удаление моего token.pickle, похоже, тоже не исправляет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...