我們常常需要在 BOT 發送訊息給 User,
以下我們看一下如何在 BOT 發送訊息給 User。
要使用 Microsoft Bot Framework 發送訊息,需要以下3個項目,
From: 發送訊息者
Recipient: 接收訊息者
ServiceUrl: Service endpoint where operations concerning the activity may be
呵,呵! 有了 發送者 及 接收者,透過 連線 ,雙邊就可以 對話 了哦 ^_^
1.收到訊息後,建立一個新的 Conversation 回訊息給 User
要傳送訊息給 User 需要透過 ConnectorClient ,建立 Bot 與 BOT Connector 之間的連線。
再來建立 Bot 與 User 的 ChannelAccount ,再建立一個 Conversation 。
這樣就可以將訊息傳送給 User ,例如 使用者輸入 亂馬客 後,畫面會被清掉,因為我們是新增一個 Conversation ,如下,
public async Task<HttpResponseMessage> Post([FromBody]Activity activity) | |
{ | |
if (activity.Type == ActivityTypes.Message) | |
{ | |
var replyMessage = $"你輸入了 **{activity.Text}**,共輸入了**{activity.Text.Length}**個字"; | |
var connector = new ConnectorClient(new Uri(activity.ServiceUrl)); | |
// User的資訊是 From | |
var userAccount = new ChannelAccount(activity.From.Id); | |
// Bot 的資訊是 Recipient | |
var botAccount = new ChannelAccount(activity.Recipient.Id); | |
// 建立一個 Conversation | |
var replyConversation = | |
await connector.Conversations.CreateDirectConversationAsync(botAccount, userAccount); | |
// 建立要回覆的 Activity | |
var replyMsg = Activity.CreateMessageActivity(); | |
// 發送端是 Bot | |
replyMsg.From = botAccount; | |
// 接收端是 User | |
replyMsg.Recipient = userAccount; | |
// 對應到剛才建立的 Conversation | |
replyMsg.Conversation = new ConversationAccount(id: replyConversation.Id); | |
// 設定回覆的訊息字串 | |
replyMsg.Text = replyMessage; | |
// 透過 ConnectorClient 專訊息傳送給 User | |
await connector.Conversations.SendToConversationAsync((Activity)replyMsg); | |
} | |
else | |
{ | |
await HandleSystemMessage(activity); | |
} | |
var response = Request.CreateResponse(HttpStatusCode.OK); | |
return response; | |
} |
在 Log 中可以發現,有一個 createConversation 的部份,如下,
2.收到訊息後,在原有的 Conversation 回訊息給 User
沿用相同的 Conversation 就可以使用 activity.Conversation.Id 當作 ConversationAccount 的參數,如下,
public async Task<HttpResponseMessage> Post([FromBody]Activity activity) | |
{ | |
if (activity.Type == ActivityTypes.Message) | |
{ | |
var replyMessage = $"你輸入了 **{activity.Text}**,共輸入了**{activity.Text.Length}**個字"; | |
var connector = new ConnectorClient(new Uri(activity.ServiceUrl)); | |
// User的資訊是 From | |
var userAccount = new ChannelAccount(activity.From.Id); | |
// Bot 的資訊是 Recipient | |
var botAccount = new ChannelAccount(activity.Recipient.Id); | |
// 建立一個 Conversation | |
//var replyConversation = | |
// await connector.Conversations.CreateDirectConversationAsync(botAccount, userAccount); | |
// 建立要回覆的 Activity | |
var replyMsg = Activity.CreateMessageActivity(); | |
// 發送端是 Bot | |
replyMsg.From = botAccount; | |
// 接收端是 User | |
replyMsg.Recipient = userAccount; | |
// 使用 User 傳進來的 Conversation | |
replyMsg.Conversation = new ConversationAccount(id: activity.Conversation.Id); | |
// 設定回覆的訊息字串 | |
replyMsg.Text = replyMessage; | |
// 透過 ConnectorClient 專訊息傳送給 User | |
await connector.Conversations.SendToConversationAsync((Activity)replyMsg); | |
} | |
else | |
{ | |
await HandleSystemMessage(activity); | |
} | |
var response = Request.CreateResponse(HttpStatusCode.OK); | |
return response; | |
} |
在 Log 中可以發現,這樣就不會有一個 createConversation 的部份,如下,
3.收到訊息後,直接透過 ReplyToActivityAsync 回給 User
public async Task<HttpResponseMessage> Post([FromBody]Activity activity) | |
{ | |
if (activity.Type == ActivityTypes.Message) | |
{ | |
var replyMessage = $"你輸入了 **{activity.Text}**,共輸入了**{activity.Text.Length}**個字"; | |
//建立要回覆的 Activity | |
var reply = activity.CreateReply(replyMessage); | |
//建立連線 | |
var connector = new ConnectorClient(new Uri(activity.ServiceUrl)); | |
await connector.Conversations.ReplyToActivityAsync(reply); | |
} | |
else | |
{ | |
await HandleSystemMessage(activity); | |
} | |
var response = Request.CreateResponse(HttpStatusCode.OK); | |
return response; | |
} |
註:如果訊息中要換行的話,可以使用 \n\n
參考資料
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^