0

我正在尝试使用 GoogleChatAPI 创建一个机器人。

这是我正在尝试做的事情:

  1. 如果用户添加了我正在创建的机器人,我希望机器人显示使用该机器人的警告消息。

  2. 如果用户在 bot 中发布消息,则 bot 会将该消息发布到另一个聊天室。发布消息的方法是“UrlFetchApp.fetch”(同时添加一个OAUTH范围)

为了完成任务 1,我使用了代码onAddToSpace。为了实现任务 2,我使用了代码onMessage

但是当用户添加机器人时,onAddToSpace不会被点燃。此事件不在执行列表中。但是当我删除代码UrlFetchApp.fetch(并同时删除 OAUTH 范围)时,就会onAddToSpace被点燃。

我如何编写代码来同时实现我想要做的两件事?或者甚至有可能吗?

代码:

function onMessage(event) {
  var name = "";
  var message = "ご依頼承りました!情シスからご連絡いたしますので少々お待ち下さい。";
  postICTRoom(event);
  return { "text": message };
}

function onAddToSpace(event) {
  var message = "情シスへ質問、依頼ができるbotです。送信したメッセージは、ユーザー名付きですべて情シスチームチャットに送信されます。遊びが一切ないbotです、ご利用の際は十分ご注意ください。ここは万事屋ではありません。";
  return { "text": message };(*1)
}

function onRemoveFromSpace(event) {
  console.info("Bot removed from ",
      (event.space.name ? event.space.name : "this chat"));
}

function postICTRoom(event){
  var messageDate = new Date()  
  var url = "https://chat.googleapis.com/v1/spaces/...";
  var thread = "spaces/..."
  var payload = {
    "text" : event.user.displayName + " " + Utilities.formatDate(messageDate, "JST", 'yyyy/MM/dd_HH:mm:ss') + "\n" + event.message.text,
    "thread": {
    "name": thread
    }
  }
  var json = JSON.stringify(payload);
  var options = {
    'method': 'POST',
    'contentType': 'application/json; charset=UTF-8',
    "payload" : json
  };
  var response = UrlFetchApp.fetch(url, options);

显现:

{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "chat": {
  }
}

OAuthScope

https://www.googleapis.com/auth/script.external_request

更新

  1. onAddToSpace当我添加机器人时没有执行。
  2. 我发布了一条消息并批准了 OAuth,然后onMessage被执行。
  3. 在我批准 OAuth 之后,我曾经删除了该机器人,然后我再次添加了它,onAddToSpace已经按照我的预期执行了......

onAddToSpace我想知道这是否可能,如果可能,在我必须批准 OAuth 之前如何执行。

更新2

成功案例onAddToSpace(1)

  1. 设置范围script.external_requestchat.
  2. 添加了机器人。onAddToSpace当时没有执行,因为日志没有显示在屏幕上并且机器人没有发布消息(代码中的 (*1) 点)。
  3. 发了一条消息。onMessage成功了。当时我批准了 OAuth。
  4. 删除了机器人并再次添加。onAddToSpace第一次被处决。

成功案例onAddToSpace(2)

  1. 删除了范围script.external_requestchat. 并删除了“UrlFetchApp.fetch”。
  2. 添加了机器人。onAddToSpace从头开始执行。当然,这不是 OAuth。
  3. 发了一条消息。onMessage成功了。

我想onAddToSpace在successed(1)-Step2 的时候被执行。我不知道如何才能使这项工作。

更新3

清单(修改):

{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "chat": {
    "addToSpaceFallbackMessage": "情シスへ質問、依頼ができるbotです。送信したメッセージは、ユーザー名付きですべて情シスチームチャットに送信されます。遊びが一切ないbotです、ご利用の際は十分ご注意ください。ここは万事屋ではありません。"
  }
}
4

1 回答 1

0

为了使您的代码正常运行,您需要在清单中包含必要的 OAuth 范围

为此,请按以下方式修改您的清单:

{
"timeZone": "Asia/Tokyo",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "oauthScopes": ["https://www.googleapis.com/auth/chat", "https://www.googleapis.com/auth/script.external_request"],
  "runtimeVersion": "V8",
  "chat": {
  }
}

更新

我了解到您想在配置机器人之前显示自定义消息


在此处输入图像描述


在此处输入图像描述


在此处输入图像描述


出于安全原因,这是不可能的

  • 这是 Google OAuth 身份验证概念的一部分,您的机器人在获得用户授权之前不能做任何事情(甚至不能写消息)
  • 正如他在文档中所说的那样

onAddToSpace(e)

当您的机器人添加到空间时,将执行此功能。

  • 在您授权访问之前,您的机器人不会添加到空间中

解决方法

  • 您可以在 GCP 控制台中自定义 OAuth2 浓度屏幕

在此处输入图像描述


在此处输入图像描述


  • 不幸的是,无法将自定义消息添加到同意屏幕,但您可以将其包含/设置为应用程序名称:

在此处输入图像描述


  • 这样做之后,您的内容屏幕将如下所示:

在此处输入图像描述


如何测试

为了再次触发授权

在此处输入图像描述


在此处输入图像描述


  • 删除你的机器人

在此处输入图像描述


  • 现在您可以使用新的同意屏幕测试授权
于 2020-08-12T07:57:29.370 回答