Botframework V4: местоположение мессенджера, быстрый ответ по телефону и электронной почте

#c# #botframework #messenger

#c# #botframework #мессенджер

Вопрос:

Здравствуйте, у меня есть этот код, который отправляет быстрый ответ с указанием местоположения пользователю. Я поместил это в текстовое приглашение, чтобы дождаться ввода пользователем. Но это приводит к ошибке в messenger после того, как пользователь отправляет ему местоположение. я попробовал текстовое приглашение и запрос на вложение, но это не работает.

            Activity reply = stepContext.Context.Activity.CreateReply();

            reply.ChannelData = JObject.FromObject(
            new
            {
                text = "loc",
                quick_replies = new object[]
                {
                    new
                    {
                        content_type = "location",
                    },
                },
            });

            return await stepContext.PromptAsync(
               ATTACHPROMPT,
               new PromptOptions
               {
                   Prompt = reply,
               });
        }
  

Я использую C # и Botframework V4

Ответ №1:

Вам необходимо предоставить пользовательский валидатор, если вы хотите фиксировать местоположение пользователя с помощью быстрого ответа Facebook Messenger о местоположении в текстовом приглашении или вложении — я бы рекомендовал использовать текстовое приглашение.

Конструктор

Создайте свой водопад и добавьте свои подсказки в стек диалоговых окон в вашем конструкторе. Обязательно добавьте пользовательский валидатор в текстовое приглашение; в противном случае бот будет повторно запрашивать у пользователя его местоположение, поскольку он ожидает текстовое значение, которое не предоставляет быстрый ответ.

 public MultiTurnPromptsBot(MultiTurnPromptsBotAccessors accessors)
{
    ...
    // This array defines how the Waterfall will execute.
    var waterfallSteps = new WaterfallStep[]
    {
        PromptForLocation,
        CaptureLocation,
    };
    ...
    // Add named dialogs to the DialogSet. These names are saved in the dialog state.
    _dialogs.Add(new WaterfallDialog("details", waterfallSteps));
    _dialogs.Add(new TextPrompt("location", LocationPromptValidatorAsync));

}
  

Средство проверки местоположения

В пользовательском средстве проверки вы можете проверять входящее действие для объекта location, который находится в свойстве entities действия. Если у действия нет местоположения, вы можете вернуть false, и приглашение снова запросит у пользователя его местоположение; в противном случае это продолжится на следующем шаге.

 public Task<bool> LocationPromptValidatorAsync(PromptValidatorContext<string> promptContext, CancellationToken cancellationToken)
{
    var activity = promptContext.Context.Activity;
    var location = activity.Entities?.FirstOrDefault(e => e.Type == "Place");
    if (location != null) {
        return Task.FromResult(true);
    }
    return Task.FromResult(false);
}  
  

Запрос местоположения

Как и в приведенном выше фрагменте кода, вы можете добавить быстрый ответ Facebook Messenger к данным канала ответа.

 private static async Task<DialogTurnResult> PromptForLocation(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    Activity reply = stepContext.Context.Activity.CreateReply();
    reply.Text = "What is your location?";
    reply.ChannelData = JObject.FromObject( new {

        quick_replies = new object[]
        {
            new
            {
                content_type = "location",
            },
        },
    });

    return await stepContext.PromptAsync("location", new PromptOptions { Prompt = reply }, cancellationToken);
}
  

Местоположение захвата

Здесь вы можете указать местоположение пользователя, чтобы использовать его по своему усмотрению.

 private async Task<DialogTurnResult> CaptureLocation(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{

    var activity = stepContext.Context.Activity;
    var location = activity.Entities?.FirstOrDefault(e => e.Type == "Place");
    if (location != null) {
        var latitude = location.Properties["geo"]?["latitude"].ToString();
        var longitude = location.Properties["geo"]?["longitude"].ToString();

        await stepContext.Context.SendActivityAsync($"Latitude: {latitude} Longitude: {longitude}");

    }
    // WaterfallStep always finishes with the end of the Waterfall or with another dialog, here it is the end.
    return await stepContext.EndDialogAsync(cancellationToken: cancellationToken);
}
  

Надеюсь, это поможет!

Комментарии:

1. Документацию о пользовательских валидаторах вы найдете здесь .

2. facebook удалил быстрый ответ о местоположении, поэтому, к сожалению, запрос местоположения больше не работает: developers.facebook.com/docs/messenger-platform/send-messages /…

3. Спасибо, что дали нам знать!