前言
上一篇我們介紹如何建構自己的 Bot 程式,並且上傳至 Azure Web App,因應後續我們需要直接與 TeamCity API進行介接,在這一篇我們將簡單介紹如何取得 Skype 訊息與回覆訊息,若有錯誤或任何建議,請各位先進不吝提出,謝謝。
介紹
範本範例
我們開啟上一篇介紹的 visual studio 2015 內 Bot app template,點開 MessagesController.cs 這隻程式。
我們可以發現 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);
}
傳遞訊息範例
- 首先我們先簡單介紹介紹一些概念,再透過程式傳遞續息前,都必須知道下列參數
參數 | 描述 |
---|---|
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");
- 我們需要機器人傳遞訊息,基本上我們需要了解參數:
參數 | 描述 |
---|---|
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");
- 除了上述辨識資料,你仍需要知道在哪一個對話(Conversation)發出這些訊息,而建立Conversation必須了解其參數:
參數 | 描述 |
---|---|
Id | 會話的唯一辨識ID,如:Ab2xhv5vjh |
Name | 會話的名稱 機器人管家 |
IsGroup | 是否為群組對話 |
建立群組範例如下:
new ConversationAccount(null,"Ab2xhv5vjh", null);
- 綜合以上的程式碼,您就可以開始進行訊息傳遞,範例程式碼如下:
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);
- 有些人到此可能會想問,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);
回覆訊息
從上面的範例你或許已經發現,回覆訊息的程式較簡單,你只需要透過 activity.CreateReply + connector.Conversations.ReplyToActivityAsync 即可讓機器人回覆訊息(個人猜測此方法應該是複製了所有相關資訊並建立新物件,方便回覆)
後記
我們透過上列簡單介紹的方法,再加上 c# restful client 與本身 controller的搭配,即可開始撰寫與其他服務介接程式。理所當然,skype bot還有些更進階的功能,像是開始與某個朋友對話,或者開啟一個群組對話,你可以參考官方文件。
上一篇:Microsoft Bot Framework
下一篇:Skype Bot 與 TeamCity 整合 1 - TeamCity Restful API 介接
返回目錄
參考資料
註:本系列文章將於2016 IT邦幫忙鐵人賽進行同時,一併發佈於個人blogger與dotblog。