将数据导入 Google Chat

借助 Google Chat API,您可以将其他即时通讯平台中的数据导入到 Google Chat。您可以将其他即时通讯平台中现有的消息、附件、回应、成员资格和聊天室实体导入到相应的 Chat API 资源。您可以通过在导入模式下创建 Chat 聊天室并将数据导入这些聊天室来导入此类数据。此过程成功完成后,这些聊天室将变为标准 Chat 聊天室。

以下简要介绍了完整的导入流程:

  1. 规划导入
  2. 为 Chat 应用配置授权
  3. 在导入模式下创建聊天室
  4. 导入资源
  5. 验证导入的资源
  6. 对照来源数据来协调导入的资源差异
  7. 完整导入模式
  8. 在导入模式后授予对聊天室的访问权限
  9. 问题排查

前提条件

Apps 脚本

Python

规划导入

请根据要导入的数据量进行相应规划,了解使用限制和配额对导入过程有何影响,并了解导入到新聊天室时支持的聊天室类型。如果您是管理员,请参阅将消息数据从其他服务导入到 Google Chat,并仔细按照相应步骤操作。

查看 API 使用限制

将数据导入 Chat 所需的时间可能会因要导入的 Chat 资源数量而有很大差异。查看 Chat 应用的使用限制以及安排从源消息传递平台导入的数据量,以确定预计时间表。

将消息导入聊天室时,我们建议您将对 messages.create() 方法的调用分散到不同的消息会话中。

确定要导入的受支持聊天室

导入模式仅支持 SPACEGROUP_CHATSpaceType。不支持 DIRECT_MESSAGE。如需了解详情,请参阅 SpaceType 文档

在导入模式下创建聊天室

如需在导入模式下创建聊天室,请对 Space 资源调用 create 方法,并将 importMode 设置为 true

在导入模式下创建聊天室时,请注意以下事项。

  • 日期和时间 - 请注意,导入模式必须在 90 天内完成。如果在调用 spaces.create() 方法 90 天后,聊天室仍处于导入模式,则会自动遭到删除,并且将无法访问和不可恢复。
    • 使用 importModeExpireTime 字段的值跟踪 90 天期限的到期时间。
    • 请勿使用 createTime 字段的值来跟踪 90 天期限的到期时间。这并不总是与调用 spaces.create() 方法时相同。使用导入模式时,可以将 createTime 字段设置为聊天室在来源中创建的历史时间戳,以保留原始创建时间。
  • 聊天室资源名称 (name) - 此唯一标识符用于检索特定聊天室的相关信息,并会在后续步骤中在将内容导入聊天室时引用。

如需保留来自来源即时通讯平台的等效聊天室实体的创建时间,您可以设置聊天室的 createTime。此 createTime 必须设置为介于 2000 年 1 月 1 日和当前时间之间的值。

如需在导入模式下创建外部聊天室,请将 externalUserAllowed 设置为 true。导入成功完成后,您可以添加外部用户。

以下示例展示了如何在导入模式下创建聊天室:

Apps 脚本

function createSpaceInImportMode() {
  const space = Chat.Spaces.create({
      spaceType: 'SPACE',
      displayName: 'DISPLAY_NAME',
      importMode: true,
      createTime: (new Date('January 1, 2000')).toJSON()
  });
  console.log(space.name);
}

Python

"""Create a space in import mode."""

import datetime

from google.oauth2 import service_account
from googleapiclient.discovery import build

# Specify required scopes.
SCOPES = [
    'https://www.googleapis.com/auth/chat.import',
]

CREDENTIALS = (
    service_account.Credentials.from_service_account_file('credentials.json')
    .with_scopes(SCOPES)
    .with_subject('EMAIL')
)

# Build a service endpoint for Chat API.
service = build('chat', 'v1', credentials=CREDENTIALS)

result = (
    service.spaces()
    .create(
        body={
            'spaceType': 'SPACE',
            'displayName': 'DISPLAY_NAME',
            'importMode': True,
            'createTime': f'{datetime.datetime(2000, 1, 1).isoformat()}Z',
        }
    )
    .execute()
)

print(result)

替换以下内容:

  • EMAIL:您要冒充的具有域级权限的用户账号的电子邮件地址。
  • DISPLAY_NAME:在导入模式下创建的聊天室的名称。此名称必须是向 Chat 用户显示的聊天室的唯一名称。我们建议您使用与要导入数据的聊天室相同的显示名称。

导入资源

如需从其他即时通讯平台导入资源,您需要在导入模式聊天室中创建 Google Chat 资源(例如消息、回应、附件)。在聊天室中创建资源时,您需要指定要从要迁移的消息平台中相关资源中提取的数据。

消息

Chat 应用可以使用自己的权限导入消息,也可以通过冒充用户来代表用户导入消息。邮件作者会设为被冒充的用户账号。如需了解详情,请参阅为 Chat 应用授权。如需在导入模式空间中导入消息,请对 Message 资源调用 create 方法。为了保留来自来源消息平台的原始消息的创建时间,您可以设置消息的 createTime。此 createTime 必须设置为介于您之前设置的聊天室创建时间和当前时间之间的值。

同一聊天室中的消息不能包含相同的 createTime,即使之前包含该时间的消息已被删除也是如此。

导入模式聊天室中包含第三方网址的消息无法在 Google Chat 中呈现链接预览。

当您在导入模式下创建消息时,聊天室不会向任何用户发送通知或电子邮件,包括包含用户提及的消息。

以下示例展示了如何在导入模式空间中创建消息:

Python

"""Create a message in import mode space."""

import datetime

from google.oauth2 import service_account
from googleapiclient.discovery import build

# Specify required scopes.
SCOPES = [
    'https://www.googleapis.com/auth/chat.import',
]

CREDENTIALS = (
    service_account.Credentials.from_service_account_file('credentials.json')
    .with_scopes(SCOPES)
    .with_subject('EMAIL')
)

# Build a service endpoint for Chat API.
service = build('chat', 'v1', credentials=CREDENTIALS)

NAME = 'spaces/SPACE_NAME'
result = (
    service.spaces()
    .messages()
    .create(
        parent=NAME,
        body={
            'text': 'Hello, world!',
            'createTime': f'{datetime.datetime(2000, 1, 2).isoformat()}Z',
        },
    )
    .execute()
)

print(result)

替换以下内容:

回应

Chat 应用可以使用 Chat API 导入对消息的回应。如需了解导入模式聊天室中支持的资源方法和身份验证类型,请参阅为 Chat 应用授权

附件

您的 Chat 应用可以使用 Chat API 上传附件。如需了解导入模式聊天室中支持的资源方法和身份验证类型,请参阅为 Chat 应用授权。不过,我们强烈建议您使用 Google Drive API 将附件作为 Google 云端硬盘文件上传,并将文件 URI 与导入模式聊天室中的相应消息相关联,以便从其他即时通讯平台导入附件,从而避免达到 Google Chat 附件上传的内部限制。

历史会员

历史会员资格是指为已从来源即时通讯平台退出原始聊天室实体的用户创建的会员资格,但您希望在 Chat 中保留其数据。如需了解在聊天室不再处于导入模式后如何添加新成员,请参阅创建会员资格资源

在许多情况下,当这些历史成员受 Google 的数据保留政策约束时,您可能希望先保留聊天室中由历史成员创建的数据(例如消息和回应),然后再将其导入到 Chat。当聊天室处于导入模式时,您可以对 Membership 资源使用 create 方法,将这些历史会员资格导入聊天室。为了保留历史会员资格的退出时间,您必须设置会员资格的 deleteTime。此离职时间必须准确,因为它会影响系统为这些会员保留哪些数据。此外,此 deleteTime 必须晚于聊天室创建时间戳,且不得是未来的时间戳。

除了 deleteTime 之外,您还可以设置 createTime 以保留历史会员资格的原始加入时间。与 deleteTime 不同,createTime 是可选的。如果未设置,系统会通过从 deleteTime 中减去 1 微秒来自动计算 createTime。如果设置了 createTime,则其必须在 deleteTime 之前,并且必须在聊天室创建时间当天或之后。此 createTime 信息不会用于确定数据保留期限,也不会显示在 Google 管理控制台和 Google 保险柜等管理工具中。

虽然用户可以在来源即时通讯平台中通过多种方式加入和退出聊天室(通过邀请、自行加入或由其他用户添加),但在 Chat 中,这些操作都通过历史会员资格 createTimedeleteTime 字段表示为“添加”或“移除”。

以下示例展示了如何在导入模式聊天室中创建历史会员资格:

Python

"""Create a historical membership in import mode space."""

import datetime

from google.oauth2 import service_account
from googleapiclient.discovery import build

# Specify required scopes.
SCOPES = [
    'https://www.googleapis.com/auth/chat.import',
]

CREDENTIALS = (
    service_account.Credentials.from_service_account_file('credentials.json')
    .with_scopes(SCOPES)
    .with_subject('EMAIL')
)

# Build a service endpoint for Chat API.
service = build('chat', 'v1', credentials=CREDENTIALS)

NAME = 'spaces/SPACE_NAME'
USER = 'users/USER_ID'
result = (
    service.spaces()
    .members()
    .create(
        parent=NAME,
        body={
            'createTime': f'{datetime.datetime(2000, 1, 3).isoformat()}Z',
            'deleteTime': f'{datetime.datetime(2000, 1, 4).isoformat()}Z',
            'member': {'name': USER, 'type': 'HUMAN'},
        },
    )
    .execute()
)

print(result)

替换以下内容:

在外部聊天室中导入资源

您只能使用 Workspace 组织内用户的凭据通过导入模式创建外部聊天室。这仅适用于聊天室处于导入模式时。聊天室完成导入模式后,您就可以邀请外部用户加入导入的聊天室(请参阅访问部分),并且可以使用他们的凭据调用 Chat API。

验证导入的资源

聊天应用可以通过对 Message 资源调用 list 方法 来读回和验证导入模式空间的内容。您可以从任何返回的消息的 emojiReactionSummariesattachment 字段读取 ReactionAttachment 资源。聊天应用只能通过模拟用户来代表用户调用此方法。如需了解详情,请参阅为 Chat 应用授权

聊天应用还可以通过对 Message 资源调用 get 方法来读取个别消息以进行验证。Chat 应用只能使用自己的权限调用此方法来读取自己的消息。如需了解详情,请参阅为 Chat 应用授权

聊天应用还可以通过对 Membership 资源调用 list 方法来列出历史成员资格。聊天室退出导入模式后,list 方法将不再显示历史会员资格。Chat 应用只能通过冒充用户来代表用户调用此方法。如需了解详情,请参阅为 Chat 应用授权

您可以通过对 Space 资源调用 get 方法来读取导入模式空间的属性。系统还会在响应中填充 importModeExpireTime,以便您正确跟踪完成导入流程的时间范围。聊天应用只能使用自己的权限调用此方法。 如需了解详情,请参阅为 Chat 应用授权

对照源数据对导入的资源差异进行协调

如果由于原始实体在导入过程中发生变化,导致任何导入的资源与来源即时通讯平台中的原始实体不匹配,Chat 应用可以调用 Chat API 来修改导入的 Chat 资源。例如,如果用户在 Chat 中创建消息后在源消息传递平台中修改了该消息,Chat 应用可以更新导入的消息,以反映原始消息的当前内容。

消息

如需更新导入模式空间中消息的受支持字段,请对 Message 资源调用 update 方法。Chat 应用只能使用在初始消息创建期间使用的权限调用此方法。如果您在初始消息创建过程中使用了用户冒充功能,则必须使用相同的冒充用户来更新该消息。

如需在导入模式空间中删除消息,请对 Message 资源调用 delete 方法。导入模式聊天室中的消息无需由原始消息创建者删除,可以通过冒充网域中的任何用户来删除。Chat 应用只能使用自己的权限删除自己的消息。如需了解详情,请参阅为 Chat 应用授权

回应

如需在导入模式聊天室中删除对消息的回应,请对 reactions 资源使用 delete 方法。如需了解导入模式聊天室中支持的资源方法和身份验证类型,请参阅为 Chat 应用授权

附件

如需在导入模式空间中更新消息的附件,请对 media 资源使用 upload 方法。如需了解导入模式聊天室中的资源方法和身份验证支持类型,请参阅授权 Chat 扩展应用

历史会员

如需删除导入模式聊天室中的历史会员资格,请对 Membership 资源使用 delete 方法。聊天室退出导入模式后,您将无法再使用 delete 方法删除历史会员资格。

您无法在导入模式聊天室中更新历史会员资格。如果您想更正导入有误的历史会员资格,则需要先将其删除,然后在聊天室仍处于导入模式时重新创建。

Spaces

如需更新导入模式空间中的受支持字段,请对 spaces 资源使用 patch 方法

如需删除导入模式空间,请对 spaces 资源使用 delete 方法

如需了解导入模式聊天室中支持的资源方法和身份验证类型,请参阅授权 Chat 扩展应用

完整导入模式

在调用 completeImport 方法之前,您应确保已完成验证资源差异的协调。退出导入模式聊天室是一个不可逆转的过程,会将导入模式聊天室转换为常规聊天室。Chat 中没有任何指示这些聊天室是通过数据导入创建的指示。

记下调用 completeImport 的日期和时间、发起调用的用户的资源名称,以及返回的响应。如果您遇到任何问题并必须进行调查,这可能会很有帮助。

如需完成导入模式并让用户可以访问聊天室,Chat 应用可以对 Space 资源调用 completeImport 方法。Chat 应用只能通过冒充用户来代表用户调用此方法。如需了解详情,请参阅为 Chat 应用授权。此方法完成后,被冒充的用户会作为聊天室管理员添加到聊天室。必须在初始 create.space 方法调用后的 90 天内调用此方法。如果您在 90 天期限过后尝试调用此方法,调用将会失败,因为导入模式聊天室已被删除,Chat 应用无法再访问该聊天室。

completeImport 方法中被冒充的用户不必是聊天室创建者。

请勿在 importModeExpireTime 前过于接近的时间调用 completeImport,因为我们无法保证请求会在 importModeExpireTime 之前到达,并且可能会与到期时间触发的系统中的数据处理发生冲突。我们建议您在 importModeExpireTime 之前至少提前 30 分钟调用 completeImport

以下示例展示了如何完成导入模式:

Python

"""Complete import."""

from google.oauth2 import service_account
from googleapiclient.discovery import build

# Specify required scopes.
SCOPES = [
    'https://www.googleapis.com/auth/chat.import',
]

CREDENTIALS = (
    service_account.Credentials.from_service_account_file('credentials.json')
    .with_scopes(SCOPES)
    .with_subject('EMAIL')
)

# Build a service endpoint for Chat API.
service = build('chat', 'v1', credentials=CREDENTIALS)

NAME = 'spaces/SPACE_NAME'
result = service.spaces().completeImport(name=NAME).execute()

print(result)

替换以下内容:

在导入模式后授予对聊天室的访问权限

为了让 Chat 用户能够访问最近导入的聊天室,Chat 应用可以在初始 create.space() 方法调用后的 90 天内继续使用 chat.import 作用域和用户冒充功能来执行以下操作:

  • 向聊天室添加成员:对 Membership 资源调用 create() 方法。我们建议 Chat 应用在聊天室导入完成后立即创建 Membership 资源,以便 Chat 应用可以继续使用 chat.import 范围,并确保所有导入的成员都有权访问聊天室。您应优先添加可能受保险柜保全政策约束的成员,该政策允许保留已导入的邮件,即使它们已超出保留期限也是如此。
  • 设置目标对象群组:对 Space 资源调用 update() 方法。如需了解如何创建和添加目标对象群组,请参阅让 Google Chat 聊天室对 Google Workspace 组织中的特定用户可见

如需将这些方法与 chat.import 作用域搭配使用,被冒充的用户必须是聊天室管理员。

对于外部聊天室,您还可以使用成员资格 create() 方法邀请 Workspace 组织之外的用户。请务必了解外部用户的所有已知限制

问题排查

如果您在导入 Chat 聊天室时遇到问题,请查看以下问题以寻求帮助。如果您收到错误响应,请记下相应错误(将文本复制/粘贴到文档中或保存屏幕截图),以备日后参考和排查问题。

成功导入聊天室后,CompleteImportSpace 会完成并返回状态 OK

未在 90 天期限结束前完成导入

在导入模式下创建聊天室中所述,如果在调用 create 方法 90 天后,聊天室仍处于导入模式,则会自动删除,并且将无法访问和不可恢复。

很抱歉,已删除的聊天室无法再访问或恢复,您必须重新启动导入流程。

查找缺失的聊天室

如果您找不到新的 Chat 聊天室,请查看下表中您收到的 CompleteImportSpace 回复,了解相关说明和解决方法。

已收到回答 调查步骤 说明 分辨率
CompleteImportSpace 会抛出异常,调用 GetSpace 会返回 PERMISSION_DENIED 查看聊天室的创建时间记录,如果超过 90 天,则表示聊天室已被自动删除。此外,聊天室管理工具审核日志中都没有导入的聊天室的记录。 导入流程已启动超过 90 天,但聊天室未能成功退出迁移。 创建一个新聊天室,然后重新运行导入流程。
CompleteImportSpace 会返回 OK,调用 GetSpace 会返回 PERMISSION_DENIED 聊天室管理工具中没有导入的聊天室的记录,但审核日志中显示该聊天室已被删除。 聊天室已成功导入,但随后被删除。 创建一个新聊天室,然后重新运行导入流程。