为了账号安全,请及时绑定邮箱和手机立即绑定

使用谷歌表格中的谷歌应用程序脚本从系统或 url 读取图像并将图像发布到 API

使用谷歌表格中的谷歌应用程序脚本从系统或 url 读取图像并将图像发布到 API

慕码人8056858 2023-02-24 17:42:19
我正在尝试使用 put 请求点击 api 来上传图像,我想使用 google 表格和 google apps 脚本来完成。我可以将 url 中的图像添加到工作表中,但不能添加到 api 中,因为它只接受 .png/.jpeg 格式,我认为目前它采用的是 blob 格式。没有把握。任何人都可以帮助我如何使用谷歌应用程序脚本和工作表将图像发送到 api。当我在参数中键入图像作为键(文件类型)然后从设备上传图像时,我能够使用邮递员获得成功响应。这是我用来实现上述目标的一些代码:function insertImageOnSpreadsheet() {  var ss = SpreadsheetApp.getActiveSpreadsheet();  var sheet = ss.getSheetByName('Sheet1');  var response = UrlFetchApp.fetch('Enter URL Here');  var binaryData = response.getContent();  // Insert the image in cell A1.  var blob1 = Utilities.newBlob(binaryData, 'image/png', 'MyImageName');  Logger.log(blob1)        var apiHeaders =     {      "Content-Type":"application/json",      "Authorization":"Enter Token here"    }    var formData= '{"image": "'+blob1+'"}'    var eventApiResponse = callApi('Enter API Here',"put",formData,apiHeaders,"insertImageOnSpreadsheet");    Logger.log(eventApiResponse)    sheet.insertImage(blob1, 1, 3);}function callApi(targetURL, method, formData, headers,functionName) {  var options = {    "method": method,    "payload":formData,    "headers":headers}  var response = UrlFetchApp.fetch(targetURL, options);  return response; }API: livestream.com/developers/docs/api/#update-event-logo-poster有人请求帮助
查看完整描述

1 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

我相信你的目标如下。

修改点:

  • 当我看到“更新活动标志(海报)”的示例curl命令时,如下所示。

      curl -X PUT \
        -u [API_SECRET_KEY] \
        -F logo='@<image file location>;type=<image type>' \
        --header 'Content-Type: multipart/form-data' \ 
           'https://livestreamapis.com/v3/accounts/18855759/events/5201483/logo'
    • 在这种情况下,请求主体是使用字节数组创建的,因为包含二进制数据。

    • 在这种情况下,使用基本授权。而且似乎请求主体需要{"logo": "data"}使用multipart/form-data.

    • 为了发送文件数据multipart/form-data,需要创建请求主体。

  • 在你的脚本中,

    • 我无法理解"Authorization":"Enter Token here"。但是从样本 curl 命令来看,我认为“API_SECRET_KEY”不是用 base64 编码的。

    • 在示例 curl 命令中,"Content-Type":"application/json"未使用。

修改脚本:

当您的脚本被修改后,它变成如下。

const url = "###";  // Please set URL you want to use. It's like "https://livestreamapis.com/v3/accounts/18855759/events/5201483/logo".

const API_SECRET_KEY = "###";  // Please set your API_SECRET_KEY

// var binaryData = UrlFetchApp.fetch('Enter URL Here').getContent();

const binaryData = DriveApp.getFileById("### fileId ###").getBlob().getBytes();  // Modified


let data = "--xxxxxxxxxx\r\n";

data += "Content-Disposition: form-data; name=\"logo\"; filename=\"sample.png\"\r\n";

data += "Content-Type: image/png\r\n\r\n";

const payload = Utilities.newBlob(data).getBytes()

  .concat(binaryData)

  .concat(Utilities.newBlob("\r\n--xxxxxxxxxx--").getBytes());

const options = {

  method : "put",

  contentType : "multipart/form-data; boundary=xxxxxxxxxx",

  payload : payload,

  headers: {authorization : "Basic " + Utilities.base64Encode(API_SECRET_KEY)},

};

const res = UrlFetchApp.fetch(url, options);

console.log(res.getContentText())


var blob1 = Utilities.newBlob(binaryData, 'image/png', 'MyImageName');

var ss = SpreadsheetApp.getActiveSpreadsheet();

var sheet = ss.getSheetByName('Sheet1');

sheet.insertImage(blob1, 1, 3);

  • 在我的环境中,我可以确认上述修改脚本的请求与 curl 命令的请求相同。

  • 在这种情况下,它假定UrlFetchApp.fetch('Enter URL Here');返回 PNG 或 JPEG 图像的二进制数据。请注意这一点。

笔记:

  • 请在启用 V8 运行时的情况下使用此脚本。

  • 在这种情况下,换行符data很重要。所以请注意这一点。

  • 当您的“API_SECRET_KEY”和 URL 不正确时,就会发生错误。请注意这一点。

  • 在示例 curl 命令中,我建议authorization : "Basic " + Utilities.base64Encode(API_SECRET_KEY)将其作为授权标头。但如果API_SECRET_KEY与 相同"Basic " + Utilities.base64Encode(API_SECRET_KEY),请尝试修改为authorization : "API_SECRET_KEY"


查看完整回答
反对 回复 2023-02-24
  • 1 回答
  • 0 关注
  • 131 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信