2016-08-10 1 views
2

간단한 메아리를 만들기 위해 페이스 북의 메신저에 연결된 MS 봇 프레임 워크를 사용하려고합니다. 데모는 회사 지점 (예 : 좌표)의 미리 정의 된 목록을 가지며 사용자가 FB 메신저의 "공유 위치"기능을 사용하여 봇에 위치를 전송할 때 Google지도 API를 호출하여 모든 지점까지의 거리를 측정합니다 가장 가까운 것을 찾으십시오.페이스 북의 메신저를 통해 MS bot 프레임 워크에서 사용자로부터 위치 수신

 //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 

그러나 첨부 때 I "위치 공유"제로 밝혀 수 :

단, I는 첨부 사용자에 의해 전송 된 위치를 취득 할 수 없다. 사진과 같은 다른 것을 보내면 로봇이 성공적으로 수신하지만 위치는 수신하지 않습니다. 나는 여전히 사용자가 첨부 파일을 보냈다는 것을 알 수 있습니다 (그렇지 않으면 문자 메시지 인 경우 activity.Attachments이 null 임). 첨부 파일 수가 0이고 아무 것도 찾지 못했습니다. activity.Attachments[0].

내가 틀린 일을하고 있거나 페이스 북 또는 MS 봇 프레임 워크에 의해 의도적으로 차단 된 위치 포함 첨부 파일입니까?

답변

1

위치는 실제로 첨부 파일 컬렉션이 아닌 Entities 컬렉션에 있습니다. 거기를보고 필요한 것을 찾아야합니다.

+0

감사 :

는 다음 코드 예제입니다! 나는 시도했다. 그러나 IDialogMessage의 Entities.Count는 위치를 공유 할 때 0이다. 엔티티가 없다. 당신은 실제로 그것을 어떻게 얻습니까? – K48

+0

답변을 수락 할 수 있도록 코드 샘플을 게시 할 수 있습니까? 감사! @ 짐 Lewallen – K48

+0

죄송합니다, 이번 주말에 컴퓨터에서 떨어져있었습니다. 내일 함께 뭔가를하려고 노력할 것입니다. –

0

발견 : 페이스 북의 위치는 activity.ChannelData를 통해받을 수 있습니다.

활동 개체의 ChannelData 속성은 구문 분석 할 수있는 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); 
    } 
관련 문제