使用 REST API 向 Google 聊天发送消息(Google 示例在 2020 年不起作用)

Send message to Google Chat using the REST API (Google example not working in 2020)

我什至从哪里开始...(Google,你为什么要这样伤害我?)

背景信息

我创建了一个新的聊天机器人 using Google Apps Script, which receives messages from users in Google Chat同步 回复了一条消息(每条消息只能有来自聊天机器人的一个回复)。

现在我需要一种发送异步消息的方法,以便机器人可以自己发送消息,或者一次发送多个单独的响应。

问题

Google Chat REST API has a method to create a message asynchronously但是这个方法(spaces.messages.create)不行!从 2020 年开始没有此方法的工作示例。

这里是 Google 的 example code,用于使用 REST API 创建消息。

问题是在他们的示例中,SCOPE 设置为 a URL that no longer exits:

var SCOPE = 'https://www.googleapis.com/auth/chat.bot';

如果您导航到 URL,您将看到此 404 错误:

Not Found
Error 404

此外,如果您查看 list of available OAuth2 scopes,您会发现没有与环聊 聊天相关的范围,也没有提及 chat.bot 示例代码中使用的范围。

我尝试了什么?

我已通读 Whosebug 上与此聊天相关的所有问题 API,以及 REST 的所有教程 API。

总结

如何发送消息来自 Google Apps Script to Google 使用聊天 Google Chat REST API?

Google 的文档似乎已过时,并且此 API 的示例中的 none 截至 2020 年 8 月有效。他们要么没有意识到他们的 REST API 不起作用,或者他们在没有告诉任何人的情况下弃用了 REST API。

答案:

我可以确认 chat.bot 作用域确实存在。要使用 REST API 设置聊天机器人,您 必须 使用 service account.

更多信息:

根据您 link 在 Developing bots with Apps Script 上编辑的文档,用于在触发器上发送异步消息:

...the only way to achieve this currently is via the external HTTP API (see documentation). This requires the use of a Cloud service account (see documentation) via the OAuth2 for Apps Script library.

这意味着,您必须首先在 GCP 控制台中设置服务帐户,以便 chat.bot 范围可用于这些消息。整个过程对于不熟悉的人来说可能是相当艰巨的,所以我将在这里提供从开始到结束的步骤。

过程:

正在创建服务帐户:

  • 导航到 Google Cloud Console 并创建一个新的 GCP 项目。点击页面顶部的 Select a project,然后单击 NEW PROJECT
    • 您需要提供 Project name,其他字段会自动为您填写。
  • CREATE - 新的 pop-up 将出现在屏幕的 top-right 中,确认正在创建新项目。加载后,您可以单击 VIEW
  • 单击 top-left 中的 图标,然后进入 APIs & Services > Credentials 菜单项。
  • 在此页面的顶部,单击 + CREATE CREDENTIALS > Service Account
    • 为服务帐户提供名称和描述,然后按 CREATE,然后按 CONTINUE,最后按 DONE

您的服务帐户现已创建。

正在创建服务帐户凭据:

使用 Apps 脚本开发机器人 页面中的示例中提供的代码需要这些。

  • 创建服务帐户后,您将被重定向回可用于 GCP 项目的凭据列表。在 Service Accounts 部分下,单击您的 newly-created 服务帐户。这将被称为 service-account-name@project-name-XXXXXX.iam.gserviceaccount.com
  • 点击ADD KEY > Create new key
  • 保持 JSON selected,然后按 CREATE
    • 这将开始下载凭据文件,您需要使用该文件作为此服务帐户访问 API。 请勿丢失或共享此文件。如果丢失,您将需要删除并为此帐户创建新凭据。

启用环聊API:

  • 回到 ☰ > APIs & Services,然后 select Library
  • 搜索 Hangouts Chat API 并单击唯一的结果。
  • 单击 ENABLE。这将为您的项目启用 API。

注意:先不要关闭这个标签!稍后我们仍然需要使用 GCP 控制台。

设置 Apps 脚本项目:

  • 创建一个新的 Apps 脚本项目。
  • 现在,您可以将 Async messages 页面中的示例复制并粘贴到新项目中。
  • 打开您从 GCP 控制台下载的凭据文件。
    • 复制 private_key 值(以 -----BEGIN PRIVATE KEY----- 开头的值并将其粘贴到 Apps 脚本项目中 SERVICE_ACCOUNT_PRIVATE_KEY 的值中。
    • 同时从凭据文件中复制 client_email 值,并将其粘贴到 Apps 脚本项目的 SERVICE_ACCOUNT_EMAIL 中。

为了像示例中那样使用 Google Apps Script OAuth2 库,您需要使用库的脚本 ID 将库添加到项目中。

  • 在 Apps 脚本项目 UI 中,点击 Resources > Libraries... 菜单项,将 OAuth2 脚本 ID 复制粘贴到 Add a library 框中
  • 确保 select 库的最新稳定版本(在撰写本文时,这是版本 38)
  • Save

接下来,您需要将 Apps 脚本项目 link 到您之前创建的 GCP 项目。

  • 返回 GCP Console 选项卡,然后点击 ☰ > IAM & Admin > Settings 菜单项。
  • 复制本页定义的Project number
  • 在您的 Apps 脚本项目中,点击 Resources > Cloud Platform project... 菜单项,并将项目编号粘贴到 Enter Project Number here 对话框中。
  • 单击Set Project

设置项目清单: 要在 Apps 脚本中使用聊天机器人,您必须在项目的清单中包含 chat 键。

  • 在 Apps 脚本 UI 中,点击 View > Show manifest file
  • 在最后一个 key-value 对之后,添加以下内容:
  "chat": {
    "addToSpaceFallbackMessage": "Thank you for adding me!"
  }

您的完整清单文件现在看起来像这样:

{
  "timeZone": "Europe/Paris",
  "dependencies": {
    "enabledAdvancedServices": [{
      "userSymbol": "Drive",
      "serviceId": "drive",
      "version": "v2"
    }],
    "libraries": [{
      "userSymbol": "OAuth2",
      "libraryId": "1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF",
      "version": "38"
    }]
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "chat": {
    "addToSpaceFallbackMessage": "Thank you for adding me!"
  }
}
  • 保存您的项目。

最后的步骤:

你快完成了!现在,您需要从清单中部署机器人,并在 GCP 中设置配置并设置将进行实际调用的触发器。

部署机器人:

  • 在 Apps 脚本 UI 中,转到 Publish > Deploy from manifest... 并点击 Create刚刚打开的对话框。
    • 注意:如果要对整个域使用 Head 部署,则不能使用它,因此必须创建新的部署。
  • 为部署命名和描述,然后按 Save
  • 保存完成后,按您刚刚创建的部署旁边的 Get ID,然后复制 Deployment ID

正在设置 GCP 配置:

  • 返回云控制台,您现在需要导航至 ☰ > APIs & Services > Dashboard
  • 在此页面底部的已启用 API 列表中,select Hangouts Chat API
  • 在左侧菜单中,select Configuration
  • 设置您的机器人配置。您将需要提供 Bot nameAvatar URLDescription。设置功能设置,使其在房间内工作。
  • Connection Settings、select Apps Script project 下,粘贴上一节中的部署 ID。
  • 为您的 Apps 脚本机器人授予相关权限,然后按 Save

难以捉摸的触发器:

  • 您现在唯一需要做的就是设置触发器。这就像普通的 Apps 脚本触发器一样完成 - 来自 Apps 脚本中的 Edit > Current project's triggers 菜单项。要完成示例,请单击右下角的 + 添加触发器按钮并设置触发器设置如下:

  • 选择要运行的函数:onTrigger

  • 选择哪个部署应该运行:头

  • Select 事件来源:Time-driven

  • Select 基于时间的触发器类型:Minutes timer

  • Select分钟间隔:Every minute

然后按保存。

大功告成!这个创建的机器人现在将 post 到当前时间的所有房间,每分钟。

参考文献: