本页面介绍了如何设置 Webhook,以使用外部触发器将异步消息发送到 Chat 群组。例如,您可以配置监控应用,以便在服务器出现故障时通过 Chat 通知值班人员。如需使用 Chat 应用发送同步消息,请参阅发送消息。
采用这种架构设计时,用户无法与 webhook 或关联的外部应用互动,因为通信是单向的。Webhook 不是对话式的。 它们无法回复或接收来自用户或 Chat 应用互动事件的消息。 如需回复消息,请构建 Chat 应用,而不是 Webhook。
虽然从技术上讲,Webhook 并不是 Chat 应用(Webhook 使用标准 HTTP 请求连接应用),但为了简单起见,此页面将其称为 Chat 应用。每个 Webhook 仅在注册的 Chat 聊天室中有效。入站 Webhook 可在私信中使用,但前提是所有用户都启用了 Chat 应用。 您无法将 Webhook 发布到 Google Workspace Marketplace。
下图展示了与 Chat 相连的 Webhook 的架构:
在上图中,聊天应用的信息流如下:
- 聊天应用逻辑从外部第三方服务(例如项目管理系统或工单工具)接收信息。
- Chat 应用逻辑托管在云端或本地系统上,该系统可以使用 webhook 网址向特定 Chat 聊天室发送消息。
- 用户可以在该特定 Chat 聊天室中接收 Chat 应用发送的消息,但无法与 Chat 应用互动。
前提条件
Python
- 拥有可访问 Google Chat 的 Google Workspace 商务版或企业版账号。 您的 Google Workspace 组织必须允许用户添加和使用传入的网络钩子。
- Python 3.6 或更高版本
- pip 软件包管理工具
httplib2
库。如需安装该库,请在命令行界面中运行以下命令:pip install httplib2
Google Chat 聊天室。如需使用 Google Chat API 创建聊天室,请参阅创建聊天室。如需在 Chat 中创建群组,请参阅帮助中心文档。
Node.js
- 拥有可访问 Google Chat 的 Google Workspace 商务版或企业版账号。 您的 Google Workspace 组织必须允许用户添加和使用传入的网络钩子。
- Node.js 14 或更高版本
- npm 软件包管理工具
- Google Chat 聊天室。如需使用 Google Chat API 创建聊天室,请参阅创建聊天室。如需在 Chat 中创建群组,请参阅帮助中心文档。
Java
- 拥有可访问 Google Chat 的 Google Workspace 商务版或企业版账号。 您的 Google Workspace 组织必须允许用户添加和使用传入的网络钩子。
- Java 11 或更高版本
- Maven 软件包管理工具
- Google Chat 聊天室。如需使用 Google Chat API 创建聊天室,请参阅创建聊天室。如需在 Chat 中创建群组,请参阅帮助中心文档。
Apps 脚本
- 拥有可访问 Google Chat 的 Google Workspace 商务版或企业版账号。 您的 Google Workspace 组织必须允许用户添加和使用传入的网络钩子。
- 创建独立的 Apps 脚本项目,然后启用高级聊天服务。
- Google Chat 聊天室。如需使用 Google Chat API 创建聊天室,请参阅创建聊天室。如需在 Chat 中创建群组,请参阅帮助中心文档。
创建网络钩子
如需创建网络钩子,请在要接收消息的 Chat 聊天室中注册该网络钩子,然后编写一个用于发送消息的脚本。
注册传入的 webhook
- 在浏览器中,打开 Chat。 无法通过 Chat 移动应用配置网络钩子。
- 前往您要添加 Webhook 的聊天室。
- 点击聊天室标题旁边的 展开更多箭头,然后点击应用和集成。
点击
Add webhooks。在名称字段中,输入
Quickstart Webhook
。在头像网址字段中,输入
https://developers.google.com/chat/images/chat-product-icon.png
。点击保存。
如需复制 Webhook 网址,请依次点击
更多和 复制链接。
编写 webhook 脚本
此示例网络钩子脚本通过向网络钩子网址发送 POST
请求,向注册网络钩子的聊天室发送消息。Chat API 会返回 Message
的实例。
选择一种语言,了解如何创建 Webhook 脚本:
Python
在工作目录中,创建一个名为
quickstart.py
的文件。在
quickstart.py
中,粘贴以下代码:将
url
变量的值替换为您在注册网络钩子时复制的网络钩子网址。
Node.js
在工作目录中,创建一个名为
index.js
的文件。在
index.js
中,粘贴以下代码:将
url
变量的值替换为您在注册网络钩子时复制的网络钩子网址。
Java
在工作目录中,创建一个名为
pom.xml
的文件。在
pom.xml
中,复制并粘贴以下内容:在工作目录中,创建以下目录结构
src/main/java
。在
src/main/java
目录中,创建一个名为App.java
的文件。在
App.java
中,粘贴以下代码:将
URL
变量的值替换为您在注册 Webhook 时复制的 Webhook 网址。
Apps 脚本
在浏览器中,前往 Apps 脚本。
点击新建项目
粘贴以下代码:
将
url
变量的值替换为您在注册 Webhook 时复制的 Webhook 网址。
运行 webhook 脚本
在 CLI 中,运行以下脚本:
Python
python3 quickstart.py
Node.js
node index.js
Java
mvn compile exec:java -Dexec.mainClass=App
Apps 脚本
- 点击运行。
运行代码后,Webhook 会向您注册它的聊天室发送消息。
发起或回复消息串
在消息请求正文中指定
spaces.messages.thread.threadKey
。根据您是开始新对话还是回复现有对话,为threadKey
使用以下值:如果启动线程,请将
threadKey
设置为任意字符串,但请记下此值,以便回复该线程。如果回复的是某个消息串,请指定启动该消息串时设置的
threadKey
。例如,如需在初始消息使用MY-THREAD
的线程中发布回复,请设置MY-THREAD
。
定义在找不到指定的
threadKey
时线程的行为:回复消息串或发起新消息串。将
messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD
参数添加到网络钩子网址。传递此网址参数会导致 Chat 使用指定的threadKey
查找现有对话串。如果找到,则将该消息作为对相应主题串的回复发布。如果未找到,则该消息会启动与相应threadKey
对应的新消息串。回复消息串或不执行任何操作。将
messageReplyOption=REPLY_MESSAGE_OR_FAIL
参数添加到 webhook 网址。 传递此网址参数会导致 Chat 使用指定的threadKey
查找现有对话串。如果找到,则将该消息作为对相应主题串的回复发布。如果未找到任何匹配项,则不会发送消息。
如需了解详情,请参阅
messageReplyOption
。
以下代码示例用于开始或回复消息线程:
Python
Node.js
Apps 脚本
处理错误
Webhook 请求可能会因各种原因而失败,包括:
- 申请无效。
- Webhook 或托管该 Webhook 的聊天室被删除。
- 间歇性问题,例如网络连接或配额限制。
构建 webhook 时,您应通过以下方式妥善处理错误:
- 记录失败情况。
- 对于基于时间、配额或网络连接的错误,使用指数退避算法重试请求。
- 不执行任何操作,如果发送 webhook 消息并不重要,则适合这样做。
Google Chat API 会以 google.rpc.Status
的形式返回错误,其中包含一个 HTTP 错误 code
,用于指明遇到的错误类型:客户端错误(400 系列)或服务器错误(500 系列)。如需查看所有 HTTP 映射,请参阅 google.rpc.Code
。
{
"code": 503,
"message": "The service is currently unavailable.",
"status": "UNAVAILABLE"
}
如需了解如何解读 HTTP 状态代码和处理错误,请参阅错误。
限制和注意事项
- 在 Google Chat API 中使用 webhook 创建消息时,响应不包含完整消息。
响应仅填充
name
和thread.name
字段。 - Webhook 需遵守
spaces.messages.create
的每个空间配额:每秒 1 个请求,在空间中的所有 webhook 之间共享。 聊天机器人还可能会拒绝同一聊天室中每秒查询次数超过 1 次的 Webhook 请求。如需详细了解 Chat API 配额,请参阅使用限制。