블로그 이미지
* Microsoft MVP - Windows Development 2014 ~ 2019 5ring * LINE : kaki104 * facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/ kaki104

카테고리

List All (550)
Xamarin Forms (4)
Bot Framework (18)
Azure (9)
Windows 10 (35)
Facebook News & Tips (158)
Windows App(Universa.. (83)
Windows 8&8.1 (113)
Windows Phone 8 (42)
Silverlight (37)
HTML5 & MVC4 (16)
WPF (1)
Portable Class Library (2)
Uncategorised Tips a.. (3)
Kinect for Windows (2)
ETC (12)
kaki104 Scrap (4)
App News (11)
Total519,087
Today51
Yesterday98

포켓몬고의 열풍이 대한민국을 휩쓸고 있는 주말입니다. 평소에 전혀 게임에 관심이 없었던 사람들까지도 모두 알수 있을 정도로 가십성 기사는 정말 엄청나게 양산을 하는 것 같습니다. 게임 디자이너 중 한명이 한국 사람이라는 뉴스는 왜 나오는지.. 에혀;; 뭐.. 어찌 되었던 간에 앞으로 저는 앞으로 새로운 비전은 Bot이 이끌어 나갈 것이라는 마이크크로소프트의 이야기를 믿고 계속 준비를 하도록 하겠습니다.(물론 않되는 것도 있지만...) 언젠가 좋은 날이 오겠죠!

 

이번에 다룰 내용은 Activity의 기본적인 구성과 어떻게 메시지를 주고 받는 것인지에 대한 내용입니다. 이전에 다루지 않았던 내용으로 아마 조금더 Bot Framework을 이해하는데 도움이 되지 않을까 생각합니다.

 

 

0. 관련 포스트

Sending and Receiving Activities

https://docs.botframework.com/en-us/csharp/builder/sdkreference/routing.html

 

V3로 변경되면서 달라진 점 중에 하나는 기존 메시지를 처리하는 부분의 명칭이 Activity로 변경되었다는 것입니다. 그만큼 Bot Framework의 핵심 부분이라고 생각할 수 있을 것 같습니다.

 

모든 Activity는 적절한 목적지에 대한 라우닡 정보를 포함하고 있습니다. Bot은 사용자의 Activity를 수신하고, 내용을 처리한 후에 다시 보내게 됩니다.

 

 

1. Routing Activities

 

Activities는 커넥터 서비스가 적절한 수신자에게 전달하고, 메시지 작성자와 통신하도록 지원하는 여러가지 속성들을 가지고 있습니다.

커넥터 서비스 모델 중 Conversation의 구성 요소로 From -> Recipient가 있습니다.

 

1) From : 발송자의 activity

2) Recipient : 수신자의 activity

3) Conversation : 대화 메시지 일부

 

당신이 사용자로부터 Activity를 받으면, From 필드와 Recipient 필드에 필요한 정보가 입력되어 있어서 Bot은 이 정보를 이용해서 처리를 할 수 있습니다.

 

* 그러나 반드시 알 수 있는 것은 아닙니다. 예를 들면 Slack의 경우에는 알 수 없을 수 있기 때문입니다. .. Slack를 사용해보지 않아서 왜 알 수 없는지는..확인해 봐야겠습니다. 더 자세한 사항은 Replying to an Activity라는 문서를 참고하면 됩니다.

 

 

2. ChannelId and ServiceUrl

 

2개의 최상위 레벨 프로퍼티가 있습니다. ChannelId는 bot이 어떤 채널을 통해서 작업해야하는지를 나타내며, ServiceUrl은 API를 어떤 주소로 회신을 보내야할지를 나타내기 때문입니다.

 

1) ChannelId : Activity된 채널, 채널은 일종의 채팅방? 개념이라고 생각하시면 될 것 같습니다.

2) ServiceUrl : 회신을 보낼 때 사용할 url주소 http://skype.botframework.com

 

 

3. Creating Connector Client

 

ServiceUrl은 API 호출을 위한 endpoint를 제공합니다. ConnectorClient 클래스를 생성할 때 반드시 필요합니다.

 

var connector = new ConnectorClient(incomingMessage.ServiceUrl);

 

 

4. ChannelAccounts

 

ChannelAccount 레코드는 사용자나 봇이 통신을 하는 채널을 이야기 합니다.

 

1) Id : 채널 Id, joe.com, +14258828080, etc

2) Name : 사용자나 봇 이름 Jeo Smith

 

각 사용자와 봇은 각 채널별로 1에서 N개의 ChannelAccount를 가지고 있습니다.

 

 

5. ConversationAccount

 

ConversationAccount 객체는 기본적으로 ChannelAccount와 동일한 정보를 가지며, 몇가지 추가적인 메타 정보를 포함합니다.

 

1) Id : 채널내 대화를 위한 고유Id, Xy1xvh3jhv

2) Name : 대화 이름

3) IsGroup : 만약 true이면, 그룹 대화를 나타냅니다.(기본값은 false)

 

 

6. Replying to messages

 

당신의 봇이 메시지 Activity를 받게 되었다면, 회신을 보내야 합니다.

 

이때, 당신은 새로운 Activity가 필요하며, 이 때

 

1) 원본 메시지에 있던 From <-> Recipient 필드가 서로 바뀝니다.

2) Conversation은 원본 메시지에 있던 것을 사용합니다.

3) Text (와 적절한 첨부파일)

 

회신 메시지를 만들기 쉽도록 CreateReply라는 확장 메소드를 제공합니다.

 

// create properly formatted reply message
var replyMessage = incomingMessage.CreateReply("Yo, what's up?");

 

 

 

7. ReplyToActivity()

 

간단한 메시지를 회신하기 위해서는 ReplyToActivity() 메소드를 호출합니다. Connector 서비스가 메시지 전달을 위한 채널 정보와 필요한 사항을 적절하게 처리해 줍니다.

 

var connector = new ConnectorClient(incomingMessage.ServiceUrl);
var replyMessage = incomingMessage.CreateReply("Yo, I heard you.", "en");
await connector.Conversations.ReplyToActivityAsync(replyMessage);

 

 

8. SendToConversation()

 

SendToConversation() 메소드는 스레드의 종류를 유지하지 않는 점을 제외하고 ReplyToActivity와 거의 동일하며, 이 것은 회신으로 메시지를 전달할 수 없는 경우에 사용합니다.

 

var connector = new ConnectorClient(incomingMessage.ServiceUrl);
IMessageActivity newMessage = Activity.CreateMessageActivity();
newMessage.Type = ActivityTypes.Message;
newMessage.From = botAccount;
newMessage.Conversation = conversation;
newMessage.Recipient = userAccount;
newMessage.Text = "Yo yo yo!";
await connector.Conversations.SendToConversation((Activity)newMessage);

 

 

9. Multiple replies

...

 

 

10. Starting Conversations

 

대화를 초기화 하기 위해서는 CreateConversation() 혹은 CreateDirectConversation() 메소드를 호출해서 채널에ConversationAccount를 만들 수 있습니다. SendToConversation() 메소드를 호출해서 한번은 메시지를 전송할 수 있습니다.

 

 

11. Create 1:1 Conversations

 

CreateDirectConversation() 메소드는 1:1 대화를 만들 수 있습니다.

 

var connector = new ConnectorClient(incomingMessage.ServiceUrl);
var ConversationId = await connector.Conversations.CreateDirectConversationAsync(incomingMessage.Recipient, incomingMessage.From);
IMessageActivity message = Activity.CreateMessageActivity();
message.From = botChannelAccount;
message.Recipient = new ChannelAccount() { name: "Larry", "id":"@UV357341"};
message.Conversation = new ConversationAccount(id: ConversationId.Id);
message.Text = "Hello";
message.Locale = "en-Us";
var reply = await connector.Conversations.ReplyToActivityAsync(message);

 

 

 

12. Create Group Conversations

 

CreateConversation()메소드를 이용해서 새로운 그룹 대화를 만들 수 있습니다.

 

* 현재 Email은 대화는 그룹 대화만 지원합니다.

 

var connector = new ConnectorClient();
List<ChannelAccount> participants = new List<ChannelAccount>();
participants.Add(new ChannelAccount("joe@contoso.com", "Joe the Engineer"));
participants.Add(new ChannelAccount("sara@contso.com", "Sara in Finance"));
ConversationParameters cpMessage = new ConversationParameters(message.Recipient, participants, "Quarter End Discussion");
var ConversationId = connector.Conversations.CreateConversationAsync(cpMessage);
IMessageActivity message = Activity.CreateMessageActivity();
message.From = botChannelAccount;
message.Recipient = new ChannelAccount("lydia@contoso.com", "Lydia the CFO"));
message.Conversation = ConversationId;
message.ChannelId = "email";
message.Text = "Hey, what's up everyone?";
message.Locale = "en-Us";
var reply = await connector.Conversations.ReplyToActivityAsync((Activity)message);

 

 

 

 

13. 심화 학습

 

설명만 들어서는 감이 오지 않습니다~ 그래서, 실제 Echo bot 소스를 이용해서 어떤 값들이 어떻게 들어오는지 확인 하도록 하겠습니다.

 

Echo bot 셈플을 디버그 모드로 실행한 후 에뮬레이터를 이용해서 문자열을 전송합니다. 이 때 예전과 다른 점은 MicrosoftAppId와 MicrosoftAppPassword가 web.config에 입력이 되어 있는 상태이기 때문에 에뮬레이터에서도 입력을 해주어야 테스트가 가능합니다.

 

 

activity에 어떤 내용이 있을까요?

우선 Conversation 필드를 보겠습니다. 타입은 ConversationAccount군요, 그리고 Id, IsGroup, Name이라는 프로퍼티를 포함하고 있습니다.

 

Id가 채널내 대화를 위한 고유 Id라고 했고, IsGroup이 false이니 그룹 채팅은 아니네요, 대화방명?은 Conv1입니다.

 

 

다음은 From에 대해서 살펴 보겠습니다. From의 타입은 ChannelAccount 이군요, Id가 2c1c7fa3이고, 이름이 User1 이라는 사용자가 보낸 메시지 입니다. 이 내용은 에뮬레이터 상단에 입력되어 있는 내용이네요

 

 

이번에는 Recipient 수신자에 대한 정보를 보겠습니다. 타입은 ChannelAccount이고, Id가 56800324, 이름이 Bot1 으로 보낸 메시지인 것을 알 수 있습니다.

 

 

또 관심있는 것들이 ChannelId입니다.

ChannelId는 emulator라는 내용을 가지고 있습니다.

 

SurviceUrl은 뭔지 볼까요? 이녀석은 http://localhost:9000을 가지고 있습니다. 이 정보도 에뮬레이터에 존재하는 내용입니다.

 

음음..앞으로 이 Activity를 통해서 사용자가 입력한 내용들을 확인하고 원하는 것을 찾아서 결과를 반환하는 일만 남은 것 같습니다.

 

 

14. 정리

 

지금까지 알아본 봇 만들기의 기본에 대해서 정리를 합니다.

 

1) 봇을 만듭니다. 에뮬레이터로 테스트도 하면서..열심히 만들고

2) 만들어진 봇을 Microsoft Azure 서버에 App Service로 등록 합니다. 등록할 때 사용된 서버 주소를 메모해 놓습니다.

3) Bot Framework portal에 내가 만든 봇을 등록합니다. 등록할 때 생성되는 MicrosoftAppId와 MicrosoftAppPassword를 메모해 놓습니다.

 

4) MicrosoftAppId와 MicrosoftAppPassword를 내 봇 소스의 web.config 파일에 입력하고, 다시 한번 Azure에 Publish 합니다.

5) 이제 Bot Framework portal을 통해서 Facebook, skype, web chat 등 여러 플랫폼들을 이용할 수 있습니다.

 

 

Posted by MVP kaki104

티스토리 툴바