Как создать, а затем вставить файл изображения из Google Drive в вызов скрипта Google Apps UrlFetchApp.fetch для внешнего API? - PullRequest
2 голосов
/ 22 февраля 2020

Я использую Google Apps Script для вызова внешнего API, чтобы опубликовать как текст, так и изображение для контакта во внешней системе. Я разместил текст хорошо, много раз, без проблем. Я не работал с отправкой или даже использованием изображений в Apps Script, поэтому я не уверен, как отправить изображение в виде файла. Я провел немало исследований по переполнению стека и в других местах, но пока не нашел ответа на этот вопрос.

В документации API для внешней системы сказано, что ей необходимо следующее:

contactId - Тип: String

Сообщение:

text - Тип: String ... Описание: Текст сообщения (требуется носитель или текст).

upload - Тип: Файл ... Описание: Изображение сообщения (требуется мультимедиа или текст). Медиа должна быть меньше 1,5мб. Используйте jpg, jpeg, png или gif.

«Загрузить», тип «Файл» (изображение / изображение jpg) - это то, что я не могу понять, как захватить, отформатировать и отправить. В настоящее время у меня есть изображение на Google Диске, я поделился им с кем-либо для доступа по URL-адресу, и его размер меньше 1,5 МБ.

Вот большая часть моего тестового кода (отмечена как JS, но на самом деле Google Apps Script), с изменением идентифицирующей информации, несколькими различными способами, которые я пробовал. В этот момент я просто бьюсь головой о стену! Любая помощь с благодарностью! Спасибо!

function TestAPI() {
  
  var apiKey2 = '9xxxxx-xxxx2-xxxxx-bxxx-3xxxxxxa'; //API Key for the external system
  
  var url4 = 'https://www.externalsystem.com/api/v1/[contactID]/send';
  var pic = DriveApp.getFileById("1yyyyyy_Nyyyyxxxxxx-_xxxxxxx_xyyyy_");  // I Tried this
  //  var pic = driveService.files().get('1yyyyyy_Nyyyyxxxxxx-_xxxxxxx_xyyyy_');  //And tried this
  //  var pic = DriveApp.getFileByID('1yyyyyy_Nyyyyxxxxxx-_xxxxxxx_xyyyy_').getAs(Family.JPG);  //And this
  //  var pic = { "image" : { "source": {"imageUri": "https://drive.google.com/file/d/1yyyyyy_Nyyyyxxxxxx-_xxxxxxx_xyyyy_" } } };  //And this
  //  var pic = { file : DriveApp.getFileById("1yyyyyy_Nyyyyxxxxxx-_xxxxxxx_xyyyy_") };  //And this
  
  var formData = {
    'contactID': '[contactID]',
    'text': "Text here to send to external system through API",   // This works fine every time!
    'upload': pic       // Tried this
//  'upload': DriveApp.getFileByID("1yyyyyy_Nyyyyxxxxxx-_xxxxxxx_xyyyy_").getBlob()  // And tried this
//  'upload': { "image" : { "source": {"imageUri": "https://drive.google.com/file/d/1yyyyyy_Nyyyyxxxxxx-_xxxxxxx_xyyyy_" } } }  // And this
  };
  
  var options4 = {
    "headers":{"x-api-key":apiKey2},
    'method' : 'post',
    'payload': formData
  };
  
  var response4 = UrlFetchApp.fetch(url4, options4);

}

Еще раз, все работает нормально (текст и т. Д. c.), За исключением изображения («загрузка»), которое не проходит. Я уверен, что это потому, что я не знаю, как «упаковать» изображение с Google Диска через вызов UrlFetchApp к API.

1 Ответ

1 голос
/ 22 февраля 2020

Официальный документ гласит, что Message text (Media or Text is required) и Message image (Media or Text is required). Исходя из этого, пожалуйста, попробуйте выполнить следующие изменения.

Модифицированное тело запроса:

var formData = {
  upload: DriveApp.getFileById("###").getBlob()
};
  • Я думал, что из официального документа, когда оба 'upload' и 'text' используются, может использоваться только 'text'.
  • А также из результатов вашего тестирования было установлено, что тело запроса необходимо отправить в качестве данных формы.

Ссылка:

...