通过Facebook Messenger从MS bot框架中的用户接收位置

时间:2016-08-10 08:57:11

标签: c# botframework facebook-messenger

我正在尝试使用连接到Facebook Messenger的MS bot框架来创建一个简单的演示。该演示将具有预定义的公司分支列表(例如坐标),并且当用户将其位置发送到机器人时(使用"共享位置" FB messenger中的功能),它将调用Google Maps API测量到所有分支的距离并找到最接近的分支。

但是,我无法获取用户作为附件发送的位置:

        //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为空,如果它只是一条短信),但附件数为零,我找不到任何内容在activity.Attachments[0]

我做错了什么,或者Facebook或MS bot框架故意阻止包含位置的附件?

2 个答案:

答案 0 :(得分:1)

该位置实际上位于Entities集合中,而不是附件集合中。看那里,你应该找到你需要的东西。

答案 1 :(得分:0)

找到它:来自facebook的位置可以通过activity.ChannelData接收。

Activity对象的ChannelData属性只是一个可以解析的JSON字符串;如果用户发送位置,它将包含经度,纬度,地名和Bing地图的链接,可用于查看位置。

这是一个代码示例:

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);
    }