Получение местоположения от пользователя в среде ботов MS через Facebook Messenger

Я пытаюсь использовать платформу ботов MS, подключенную к Facebook Messenger, для создания простой демонстрации. В демонстрации будет предопределенный список филиалов компании (например, координаты), и когда пользователь отправит свое местоположение боту (с помощью функции «Поделиться местоположением» в мессенджере FB), он вызовет API Карт Google для измерения расстояния до всех филиалов. и найди ближайший.

Однако я не могу получить местоположение, отправленное пользователем в виде вложения:

        //if there is an attachment, assume it's a location
        //and print out the attachments count and other info;
        if (activity.Attachments != null)
        {
            int attachmentsCount = activity.Attachments.Count;

            await SendReplyToUser(activity.Attachments.Count + " attachments.", activity);

            if (attachmentsCount > 0)
            {
                await SendReplyToUser("I got your attachment! (" + attachmentsCount + ") " +
                    activity.Attachments[0].Content + "\n\n" + activity.Attachments[0].ContentType + "\n\n" +
                    activity.Attachments[0].ContentUrl + "\n\n" +
                    activity.Attachments[0].Name
                    , activity);
            }
            return Request.CreateResponse(HttpStatusCode.OK);

        }

        //otherwise continue processing the user's text message

Однако количество вложений оказывается равным нулю, когда я делюсь местоположением. Если я отправлю что-нибудь еще, например картинку, то бот успешно получит это, но не местоположение. Я все еще могу понять, что пользователь отправил вложение (в противном случае activity.Attachments имеет значение null, если это просто текстовое сообщение), но счетчик вложений равен нулю, и я ничего не нахожу в activity.Attachments[0].

Я делаю что-то не так или вложение, содержащее местоположение, намеренно заблокировано фреймворком Facebook или MS?


person Community    schedule 10.08.2016    source источник


Ответы (2)


На самом деле это расположение в коллекции Entities, а не в коллекции вложений. Посмотрите там, и вы найдете то, что вам нужно.

person Jim Lewallen    schedule 12.08.2016
comment
Спасибо! Я пробовал, но кажется, что IDialogMessage Entities.Count равен нулю, когда я делюсь местоположением - сущностей нет. Как вы это на самом деле получаете? - person ; 15.08.2016
comment
Не могли бы вы опубликовать образец кода, чтобы я мог принять ваш ответ? Спасибо! @ Джим Леваллен - person ; 19.08.2016
comment
Извините, в эти выходные был вне компьютера. Постараюсь завтра что-нибудь скомпоновать. - person Jim Lewallen; 31.08.2016

Нашел: местоположение из фейсбука можно получить через activity.ChannelData.

Свойство ChannelData объекта Activity - это просто строка JSON, которую можно проанализировать; если пользователь отправляет местоположение, оно будет содержать долготу, широту, название места и ссылку на Bing Maps, которую можно использовать для просмотра местоположения.

Вот пример кода:

https://github.com/Microsoft/BotBuilder/blob/master/CSharp/Samples/EchoBot/EchoLocationDialog.cs#L110

    public virtual async Task LocationReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument)
    {
        var msg = await argument;
        var location = msg.Entities?.Where(t => t.Type == "Place").Select(t => t.GetAs<Place>()).FirstOrDefault();
        context.Done(location);
    }
person Community    schedule 21.09.2016