Api Google photos добавление фотографий не работает, загрузка, кажется, работает - PullRequest
1 голос
/ 24 февраля 2020

Попытка использовать Google Apps Script и Google Photos API для добавления фотографий в Google Photos. Кажется, что загрузка работает / возвращает токен, но затем не удается добавить фотографию в библиотеку. Процесс состоит из двух этапов: 1. Загрузите данные фотографии, как описано здесь , затем 2. Добавьте фотографию в библиотеку фотографий, как описано здесь .

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

{
  "error": {
    "code": 400,
    "message": "Request must have at least one newMediaItem.",
    "status": "INVALID_ARGUMENT"
  }
}

Мой код после шага загрузки ниже. Я попытался структурировать тело запроса и передал его в полезную нагрузку вместо тела, но ничего не получалось. Поскольку ошибка кажется достаточно точной c, у меня такое чувство, что я просто пропускаю крошечную вещь, но что ??? У кого есть рабочий кусок кода, предпочтительно в скрипте приложений, на который я могу взглянуть?

    requestHeader = {
      "authorization": "Bearer " + photos.getAccessToken(),
      "Content-Type": "application/json"
    }

    var requestBody = {
      "newMediaItems": [
        {
          "description": "Photo description",
          "simpleMediaItem": {
            "fileName": fileName,
            "uploadToken": uploadToken
          }
        }
      ]
    }

    var options = {
      "muteHttpExceptions": true,
      "method" : "post",
      "headers": requestHeader,
      "body" : requestBody
    };


      var response = UrlFetchApp.fetch("https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate", options);

      Logger.log("raw: " + response);

Ответы [ 2 ]

3 голосов
/ 24 февраля 2020
  • Вы хотите добавить файл изображения в альбом, используя Photo API с помощью Google Apps Script.
  • Вы уже включили Google Photo API на консоли API. И ваш токен доступа может быть использован для использования метода mediaItems.batchCreate.

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

Использование:

1. Связывание проекта облачной платформы с проектом сценариев Google Apps:

Об этом вы можете увидеть подробный поток в здесь .

2. Добавьте область действия:

В этом случае добавьте область действия https://www.googleapis.com/auth/photoslibrary в файл манифеста (appsscript.json).

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

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

В вашем сценарии я не вижу деталей uploadToken. Но в вашем вопросе я могу подтвердить, что вы уже получили значение uploadToken. Поэтому, если вы хотите использовать свой скрипт для получения uploadToken, замените uploadToken на ваш. Как точка модификации вашего скрипта: 1. Включите идентификатор альбома. 2. У UrlFetchApp нет свойства body. 3. Пожалуйста, используйте JSON.stringify() для полезной нагрузки.

function getUplaodToken_(imagefileId) {
  var headers = {
    "Authorization": "Bearer " + ScriptApp.getOAuthToken(),
    "X-Goog-Upload-File-Name": "sampleFilename",
    "X-Goog-Upload-Protocol": "raw",
  };
  var options = {
    method: "post",
    headers: headers,
    contentType: "application/octet-stream",
    payload: DriveApp.getFileById(imagefileId).getBlob()
  };
  var res = UrlFetchApp.fetch("https://photoslibrary.googleapis.com/v1/uploads", options);
  return res.getContentText()
}

// Please run this.
function myFunction() {
  var imagefileId = "###";  // Please set the file ID of the image file.
  var albumId = "###";  // Please set the album ID.
  var uploadToken = getUplaodToken_(imagefileId);

  var requestHeader = {Authorization: "Bearer " + ScriptApp.getOAuthToken()};
  var requestBody = {
    "albumId": albumId,
    "newMediaItems": [{
      "description": "Photo description",
      "simpleMediaItem": {
      "fileName": "sampleName",
      "uploadToken": uploadToken
    }}]
  };
  var options = {
    "muteHttpExceptions": true,
    "method" : "post",
    "headers": requestHeader,
    "contentType": "application/json",
    "payload" : JSON.stringify(requestBody)
  };
  var response = UrlFetchApp.fetch("https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate", options);
  Logger.log(response);
}
  • В этом сценарии предполагается, что файл изображения помещен в Google Drive.

Примечание:

  • Если возникает ошибка No permission to add media items to this album., создайте альбом по сценарию. В официальном документе говорится следующее.

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

    • В этом случае, пожалуйста, создайте новый альбом по следующему сценарию и, пожалуйста, получите идентификатор альбома.

      function createNewAlbum() {
        var options = {
          headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()},
          payload: JSON.stringify({album: {title: "sample title"}}),
          contentType: "application/json",
          method: "post"
        };
        var res = UrlFetchApp.fetch("https://photoslibrary.googleapis.com/v1/albums", options);
        Logger.log(res);
      }
      

Ссылки:

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

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

Нашли это! Не показано в представленном мною коде, но все еще добавляю исправление, поскольку это может помочь другим сделать ту же ошибку, что и я. Я непосредственно назначил ответ от UrlFetchApp в качестве токена загрузки, например:

uploadToken = UrlFetchApp.fetch("https://photoslibrary.googleapis.com/v1/uploads", options);

, но для его получения необходимо было вызвать .getContentText () как строка, вот так:

uploadToken = UrlFetchApp.fetch("https://photoslibrary.googleapis.com/v1/uploads", options).getContentText();

...