在 Google 个助手应用中读取用户联系人

Reading user contacts in Google assistant app

我正在尝试为我的消息应用程序添加 Google 助理对话功能。

我无法让用户从他的联系人列表中选择一个联系人来向其发送消息。

考虑以下示例:

  1. 用户:嘿 Google,与 ScoopMessages 交谈
  2. 助理:欢迎,你想给谁发消息
  3. 用户:鲍勃
  4. 助理:有多个Bob,Select你想给谁发消息?

    显示所有包含bob名字的联系人

我已经实现了1和2的对话,但是我无法实现3和4。 我没有找到任何显示如何 select 联系人的 blogs/source。这可能吗?请给我举个例子,或者让我知道如何构建此功能?

你的问题涉及很多部分,所以让我们把它分解成这些部分:

  1. 正在验证用户
  2. 获取联系信息
  3. 消除联系人歧义
  4. 正在发送消息

正在验证用户

第一步,您需要知道用户是谁,以便查找他们的联系人。为此,您需要使用 Account Linking 以便他们的助理帐户可以链接到您为他们维护的帐户。尽管您想使用他们的 Google 联系人 - 您不会通过智能助理自动获得访问权限。

与此相关,您需要一个 访问令牌 来调用 Google API 获取他们的联系人,并且此访问令牌需要获得访问所需范围的特定授权。后一部分是骗人的——单独的帐户链接不会为你做这件事,而且你不能单独通过语音获得他们的授权。最简单的方法是一起使用 "Google Sign In for Assistant and OAuth" 方案。 提供了一些有关其工作原理的指导。

获取联系信息

使用授权令牌,在他们提供名称的 Intent Hander 中,您可以代表他们查询用户的联系人。但是,在这里,您 运行 变成了来自 Google 的两个相互竞争的 API,每个都有自己的怪癖。

Contacts API is an older protocol, and the results are returned in XML using their older gData format, but it offers a way to do queries. The People API is newer, and returns data in JSON format, but does not offer a way to query the fields. The People API officially replaces the Contacts API, which "will be deprecated in the future".

使用联系人 API,您可以对一个字词执行 query,这将搜索用户联系人中的所有文本字段。要从您的示例中使用 "Bob",这可能类似于

GET https://www.google.com/m8/feeds/contacts/default/full?q=Bob

但是,对于人员 API,您需要使用 people.connections.list 方法获取他们的整个联系人列表,可能指定您想要 "names" 和 "nicknames" 字段。使用此列表,您可以在字段中搜索匹配项。

如果有一场比赛,你就很好。

但是,如果匹配项不止一个...

消除联系人歧义

...您必须回复请求此操作的用户。如果数量有限,你大概可以这样说 "Who do you want to send it to? Bob Smith or Joe Bob?"

但是,如果有更多,您可能会提示有多少 "Bob",如果用户使用的是支持可视列表的设备,则显示 list or carousel但是请记住,您不能依赖于此 - 它们可能在纯语音设备上,或者可能无法通过屏幕进入。

正在发送消息

您没有说明您是如何发送消息的,但请记住,履行不会 运行 在用户的设备上 - 它 运行 在您控制的某个地方的网络钩子上。在这种情况下,您可能会再次使用他们的身份验证令牌来发送消息。