[第八屆IT邦幫忙鐵人賽] Skype Bot C# 基本教學

前言

上一篇我們介紹如何建構自己的 Bot 程式,並且上傳至 Azure Web App,因應後續我們需要直接與 TeamCity API進行介接,在這一篇我們將簡單介紹如何取得 Skype 訊息與回覆訊息,若有錯誤或任何建議,請各位先進不吝提出,謝謝。

介紹

範本範例

我們開啟上一篇介紹的 visual studio 2015 內 Bot app template,點開 MessagesController.cs 這隻程式。
http://ithelp.ithome.com.tw/upload/images/20161225/20091494YocMjvsb6c.png

我們可以發現 POST: api/Messages 是一個回傳收到訊息的 API,機器人會回傳你的訊息與字數。我們可以透過這個cotroller 做出初步的溝通與服務。

if (activity.Type == ActivityTypes.Message)
{
    ConnectorClient connector = 
        new ConnectorClient(new Uri(activity.ServiceUrl));
    // calculate something for us to return
    int length = (activity.Text ?? string.Empty).Length;

    // return our reply to the user
    Activity reply = 
        activity.CreateReply($"You sent {activity.Text} which was {length} characters");
   await connector.Conversations.ReplyToActivityAsync(reply);
}

 

 

傳遞訊息範例

  1. 首先我們先簡單介紹介紹一些概念,再透過程式傳遞續息前,都必須知道下列參數
參數 描述
ServiceUrl 服務位址,如skype位址為 https://skype.botframework.com
Microsoft_App_ID 您的 bot app 帳號(可參考上一篇)
Microsoft_App_Password 您的 bot app 密碼(可參考上一篇)

透過這些參數,我能建立ConnectorClient,也才能進行後續的動作。

var connector = new ConnectorClient(new Uri("https://skype.botframework.com"), "app_id", "password");

 

 

 

  1. 我們需要機器人傳遞訊息,基本上我們需要了解參數:
參數 描述
From 傳送者 (從誰傳出)
Recipient 接受者 (誰接受資訊)
Conversation (哪一個對話)

而 From 與 Recipient 的資料結構為 ChannelAccount,它包含了兩種資料:

參數 描述
Id channel 辨識碼
Name 名稱

ChannelAccount 用來記錄你在某一個通訊頻道裡的位址,1個使用者會有很多 ChannelAccount,你跟A朋友的對話中你有一個ChannelAccount,而你在團隊頻道裡又有另一個你跟A朋友的對話中你有一個 ChannelAccount。所以您在建立 From 或 Recipient,必須透過ChannelAccount。

建立機器人的 From 範例如下:

new ChannelAccount("28:62163178-9203-4f52-8ca7-ae8d2670182a", "Miniature Schnauzer");

 

 

 

  1. 除了上述辨識資料,你仍需要知道在哪一個對話(Conversation)發出這些訊息,而建立Conversation必須了解其參數:
參數 描述
Id 會話的唯一辨識ID,如:Ab2xhv5vjh
Name 會話的名稱 機器人管家
IsGroup 是否為群組對話

建立群組範例如下:

 new ConversationAccount(null,"Ab2xhv5vjh", null);

 

 

  1. 綜合以上的程式碼,您就可以開始進行訊息傳遞,範例程式碼如下:
var connector = new ConnectorClient(new Uri("https://skype.botframework.com"), "App_ID", "App_Password");
IMessageActivity newMessage = Activity.CreateMessageActivity();
newMessage.Type = ActivityTypes.Message;
newMessage.From = new ChannelAccount("From_ID", "Miniature Schnauzer");
newMessage.Conversation = new ConversationAccount(null, "Conversation_ID", null);
newMessage.Recipient = new ChannelAccount("Recipient_ID", "Duran Hsieh");
newMessage.Text = "Hi sir, may I help you?";
await connector.Conversations.SendToConversationAsync((Activity)newMessage);

 

 

  1. 有些人到此可能會想問,ChannelAccount 與 ConversationAccount 的 ID 該如取得? 您可以先請Skype bot進入對話,把下列程式碼放入 POST: api/Messages,機器人會告知您相關資訊。
 ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
               
// return our reply to the user
Activity reply = activity.CreateReply($"ChannelId:{activity.ChannelId} " +
                                      $"ChannelData:{activity.ChannelData} " +
                                      $"Id:{activity.Id} " +
                                      $"ServiceUrl:{activity.ServiceUrl} " +
                                      $"Summary:{activity.Summary} " +
                                      $"Text:{activity.Text} " +
                                      $"TopicName:{activity.TopicName} " +
                                      $"Action:{activity.Action} " +
                                      $"AttachmentLayout:{activity.AttachmentLayout} " +
                                      $"Conversation.Id:{activity.Conversation.Id} " +
                                      $"Conversation.IsGroup:{activity.Conversation.IsGroup} " +
                                      $"Conversation.Name:{activity.Conversation.Name} " +
                                      $"From.Id:{activity.From.Id} " +
                                      $"From.Name:{activity.From.Name} " +
                                      $"HistoryDisclosed:{activity.HistoryDisclosed} " +
                                      $"ReplyToId:{activity.ReplyToId} " +
                                      $"Properties:{activity.Properties} " +
                                      $"TextFormat:{activity.TextFormat} " +
                                      $"Timestamp:{activity.Timestamp} " +
                                      $"Type:{activity.Type} " +
                                      $"Recipient.Id:{activity.Recipient.Id} "+
                                      $"Recipient.Name:{activity.Recipient.Name} ");
                                      
await connector.Conversations.ReplyToActivityAsync(reply);

http://ithelp.ithome.com.tw/upload/images/20161225/20091494GUYlOG0Cty.png

 

回覆訊息

從上面的範例你或許已經發現,回覆訊息的程式較簡單,你只需要透過 activity.CreateReply + connector.Conversations.ReplyToActivityAsync 即可讓機器人回覆訊息(個人猜測此方法應該是複製了所有相關資訊並建立新物件,方便回覆)

 

 


後記

我們透過上列簡單介紹的方法,再加上 c# restful client 與本身 controller的搭配,即可開始撰寫與其他服務介接程式。理所當然,skype bot還有些更進階的功能,像是開始與某個朋友對話,或者開啟一個群組對話,你可以參考官方文件

 

 


上一篇:Microsoft Bot Framework
下一篇:Skype Bot 與 TeamCity 整合 1 - TeamCity Restful API 介接
返回目錄


參考資料

  1. 自己的測試
  2. Microsoft bot framework doc

註:本系列文章將於2016 IT邦幫忙鐵人賽進行同時,一併發佈於個人blogger與dotblog。