使用Azure聊天机器人时如何仅存储用户响应

时间:2018-08-01 08:24:48

标签: c# azure botframework azure-table-storage chatbot

我正在尝试将用户响应存储在表存储中。我只想存储他们输入的用户数据,并且对漫游器响应不感兴趣。 这是如何可能的,并且在触发字上又是可能的,例如,当用户说“否”时,它会首先在其中记录与机器人的交互,例如“ Hello”。

我对此主题进行了很多研究,但是似乎只记录了用户输入的信息似乎较少。

对此将提供任何帮助!

1 个答案:

答案 0 :(得分:3)

  

我正在尝试将用户响应存储在表存储中。我只想存储他们输入的用户数据,并且对漫游器响应不感兴趣。这是如何可能的,并且在触发字上又是可能的,例如,当用户说“否”时,它会首先在其中记录与机器人的交互,例如“ Hello”。

似乎您只想将用户输入存储在表存储中,而不是存储机器人响应的数据。为达到此要求,您可以拦截用户以MessagesController(或在对话框MessageReceivedAsync方法中)发送的消息,然后从activity中提取所需的属性值并将其存储在表中存储。

public static string firstmessage = null;

/// <summary>
/// POST: api/Messages
/// Receive a message from a user and reply to it
/// </summary>
public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
    if (activity.Type == ActivityTypes.Message)
    {
        if (firstmessage == null)
        {
            firstmessage = activity.Text?.ToString();
        }

        storeuserinput(activity);

        await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());

    }
    else
    {
        HandleSystemMessage(activity);
    }
    var response = Request.CreateResponse(HttpStatusCode.OK);
    return response;
}

private void storeuserinput(Activity activity)
{
    var uid = activity.From.Id;
    var uname = activity.From.Name;

    if (activity.Text?.ToLower().ToString() == "no")
    {
        var userinput = firstmessage;
    }

    //extract other data from "activity" object

    //your code logic here
    //store data in your table storage

    //Note: specifcial scenario of user send attachment
}

如果您想将数据存储到Azure表存储中,则可以使用WindowsAzure.Storage client library将实体存储/添加到表中。

此外,Bot Builder SDK中的the middleware functionality使我们能够拦截用户与漫游器之间交换的所有消息,您可以参考以下代码片段以实现相同的要求。

public class MyActivityLogger : IActivityLogger
{
    public async Task LogAsync(IActivity activity)
    {
        if (activity.From.Name!= "{your_botid_here}")
        {
            var uid = activity.From.Id;
            var uname = activity.From.Name;

            var userinput = (activity as IMessageActivity).Text?.ToString();

            //extract other data from "activity" properties

            //your code logic here
            //store data in your table storage

            //Note: specifcial scenario of user send attachment

        }
    }
}