上一篇我們介紹如何建構自己的 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");
'
參數 | 描述 |
---|---|
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);
'
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。
http://paste.plurk.com/show/2525228/
在執行 SendToConversationAsync((Activity)newMessage) 的時候
出現 Security token for MicrosoftAppId: '' is unauthorized to post to connector
我有確認過ID跟Password確定都沒有設錯
請問您有遇到這個問題嗎? 如果有是怎麼解決的呢? 謝謝
您好:
您有在web.config內放置MicrosoftAppId嗎@@?
像是:
<add key="MicrosoftAppId" value="1111111-1111-1111-1111-111111111111" />
<add key="MicrosoftAppPassword" value="11111111111111111111111" />
我先前有遺忘過出現相同的訊息 :)
謝謝您的回答~~
config內我有加帳密上去
我目前的解法是把 "new ConnectorClient" 換成步驟5 的那種
activity.ServiceUrl用skype機器人吐給我的URL先寫死在那裏,
像是這樣 http://paste.plurk.com/show/2525788/
這個解決方法是我一個多月已前寫的,
當時他吐回來的url
https://smba.trafficmanager.net/apis/
前幾天要修改程式的時候又讓他吐一次,結果他吐了一個不一樣的回來
https://smba.trafficmanager.net/df-apis/
才想說改回步驟4 的方法可能會穩定一些。
請問您步驟 4的網址是給他https://skype.botframework.com/ 嗎?
還是有另外特製過呢?