通过 Facebook Messenger 在 MS bot 框架中接收用户的位置
Receive location from user in MS bot framework via Facebook Messenger
我正在尝试使用连接到 Facebook Messenger 的 MS 机器人框架来创建一个简单的演示。该演示将有一个预定义的公司分支机构列表(例如坐标),当用户将他们的位置发送给机器人时(使用 FB 信使中的 "Share Location" 功能),它会调用 Google 地图 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
然而,当我 "Share location" 时,附件计数结果为零。如果我发送其他任何东西,比如图片,那么机器人会成功接收到它,但不是位置。我仍然可以确定用户确实发送了附件(否则 activity.Attachments
为空,如果它只是一条短信),但附件计数为零,我在 activity.Attachments[0]
中找不到任何内容.
是我做错了什么,还是包含位置的附件被 Facebook 或 MS 机器人框架故意阻止了?
该位置实际上在实体集合中,而不是附件集合中。看看那里,你应该找到你需要的东西。
找到了:可以通过activity.ChannelData接收来自facebook的位置。
Activity对象的ChannelData属性只是一个可以解析的JSON字符串;如果用户发送位置,它将包含经度、纬度、地名和可用于查看位置的 link 到 Bing 地图。
这是一个代码示例:
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);
}
我正在尝试使用连接到 Facebook Messenger 的 MS 机器人框架来创建一个简单的演示。该演示将有一个预定义的公司分支机构列表(例如坐标),当用户将他们的位置发送给机器人时(使用 FB 信使中的 "Share Location" 功能),它会调用 Google 地图 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
然而,当我 "Share location" 时,附件计数结果为零。如果我发送其他任何东西,比如图片,那么机器人会成功接收到它,但不是位置。我仍然可以确定用户确实发送了附件(否则 activity.Attachments
为空,如果它只是一条短信),但附件计数为零,我在 activity.Attachments[0]
中找不到任何内容.
是我做错了什么,还是包含位置的附件被 Facebook 或 MS 机器人框架故意阻止了?
该位置实际上在实体集合中,而不是附件集合中。看看那里,你应该找到你需要的东西。
找到了:可以通过activity.ChannelData接收来自facebook的位置。
Activity对象的ChannelData属性只是一个可以解析的JSON字符串;如果用户发送位置,它将包含经度、纬度、地名和可用于查看位置的 link 到 Bing 地图。
这是一个代码示例:
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);
}