【问题标题】:Botframework v4. How to clear turnContext.Activity.MembersAdded, so welcome message is sent again机器人框架 v4。如何清除turnContext.Activity.MembersAdded,所以再次发送欢迎消息
【发布时间】:2019-08-06 07:41:07
【问题描述】:

当 Facebook 用户首次向机器人发送消息时,机器人会发送欢迎消息。机器人检查 turnContext.Activity.MembersAdded 是否不为空,然后发送欢迎消息。虽然这个列表永远不会被抹去。

你知道我如何清除这个列表,以便下次用户向机器人发送消息时,它会再次发送欢迎消息

我尝试使用 LINQ 简单地清除它,但它不起作用

if (turnContext.Activity.MembersAdded != null)
{
    await SendWelcomeMessageAsync(turnContext, cancellationToken);
}

提前谢谢大家!

【问题讨论】:

    标签: c# botframework


    【解决方案1】:

    bot 存储用户信息 (userState) 的方式与 Facebook 的方式非常不同。 UserState 由机器人开发人员(您)创建和维护。 Facebook 还通过 Facebook 应用程序(如游戏)或通过 Messenger 维护已连接到应用程序的人员列表。 Facebook 将此信息存储在 PSID 或 ASID 中,可通过 Facebook Graph API v2.0 访问

    在 bot 框架方面,当 facebook 用户第一次连接到 bot 时会点击 turnContext.Activity.MembersAdded(从而创建他们的 PSID 或 ASID 以存储在 Facebook Graph API 中)。从理论上讲,您可以在Facebook side 上从您的 Facebook 应用程序(机器人)中清除 PSID/ASID,但请记住,一旦为 Facebook 用户创建了 ASID/PSID,这就是他们的 ASID/PSID。如果将它们从机器人中移除,以便它们可以“重新连接”,Facebook Graph 将返回相同的 PSID/ASID,因此 .MembersAdded 标志不会触发,您将留在原来的位置.

    如果您尝试在每次用户离开机器人一段时间后创建新的“欢迎消息”,或者开始与不同主题的对话,您将不得不跟踪转换和用户状态在您身边(一旦连接,就为您的用户提供唯一的用户 ID),并将其存储和跟踪在您自己的数据库中。然后,您可以使用机器人访问器获得可重置的欢迎消息(基于时间或会话 ID 的消息)。

    【讨论】:

      【解决方案2】:

      确保您在 OnTurnAsync 处理程序中检查正确的活动类型,并确保在重新连接时再次发送。额外注意,不同的渠道可能表现不同。

      switch (turnContext.Activity.Type)
      {
          case ActivityTypes.ConversationUpdate:
              // Send a welcome & help message to the user.
              if (turnContext.Activity.MembersAdded != null)
              {
                  await SendWelcomeMessageAsync(turnContext, cancellationToken);
              }
      
              break;
      }
      

      您可能不会再次收到欢迎消息,这是由于对话状态存储在您的机器人状态中。请参阅documentation 以获得非常好的介绍。

      知道这一点,我能想到解决方案的唯一方法是在您完成对话后删除机器人状态。这可以通过DeleteAsync API 存档。

      await _stateAccessors.ConversationDialogState.DeleteAsync(turnContext, cancellationToken);
      

      还要确保通过调用 await await dc.EndDialogAsync();await dc.CancelAllDialogsAsync(); 明确结束对话。通过这种方式,您可以确保进行完全没有状态的全新对话。

      假设 Facebook Messenger 在您下次与机器人交谈时再次发送 ConversationUpdate 活动,则应再次发送欢迎消息。

      如果由于某种原因 Facebook Messenger 在您首次连接后没有发送 ConversationUpdate 类型的活动,那么您可以在收到 Message 类型的活动时发送欢迎消息。在这种情况下,用户必须先发送一些东西。您可以决定是否要忽略它并发送欢迎消息,或者处理所说的内容并显示欢迎消息。

      【讨论】:

      • Facebook 发送 ConversationUpdate,但仅在创建 PSID/ASID 时。即使您断开机器人并重新连接新机器人,由于 Facebook 应用程序的结构方式,它也永远不会发送另一个 ConversationUpdate。
      • 您好,谢谢您的回答,我之前尝试过删除状态,但没有成功。
      猜你喜欢
      • 1970-01-01
      • 2018-04-21
      • 2021-02-22
      • 2022-01-23
      • 2020-05-18
      • 2018-02-07
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多