Chatbot與User最主要的通訊方式,是透過 message activities,這裡面所包含的內容可以是純文字或是圖卡,甚至是附件夾檔,與 V3版本不同的是在bot framework V4版本裡有turn 回合的概念(有關turn回合的概念請參考前一篇文章),讓bot可以從User端接收訊息,並且透過ITurnContext物件可以回覆給User。
在前一篇文章中我們提及到在bot的運行裡,bot邏輯處理是繼承IBot介面,然後實作OnTurnAsync方法來進行的,因此當我們要接收User的訊息時,可以藉由turnContext物件裡的message activities來取得,而當bot要傳送簡單的文字回覆訊息時,則藉由呼叫.SendActivityAsync方法來進行,程式碼片段如下所示
public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
{
if (turnContext.Activity.Type == ActivityTypes.Message)
{
var usermsg = turnContext.Activity.Text;
await turnContext.SendActivityAsync("bot response message");
}
}
與V3版本相同的是,bot的訊息溝通並不侷限只限文字,就像真人對話聊天一樣,有時候會有傳送檔案的需求,在bot framework裡,訊息夾檔的處理,可以透過Activity 物件的 Attachments 屬性來進行,Attachments 屬性是個Attachment 物件的陣列,但不同於前面的純文字回覆,附加夾檔的回覆必須先從message activity建立一個回覆的Activity物件,然後再建立Attachment物件,設置好夾檔的ContentUrl、ContentType、Name的屬性,接著把Attachment物件指給回覆的Activity物件的Attachments屬性,最後則呼叫turnContext物件的SendActivityAsync方法即可,如下程式碼片段
public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
{
if (turnContext.Activity.Type == ActivityTypes.Message)
{
//Crate Reply Activity object
var reply = turnContext.Activity.CreateReply();
// Create an attachment.
var attachment = new Attachment
{
ContentUrl = Path.Combine(Environment.CurrentDirectory, @"img\myimg.jpg")
ContentType = "image/jpg",
Name = "imgname",
};
// Add the attachment to reply Activity object
reply.Attachments = new List<Attachment>() { attachment };
// Send the reply activity to the user.
await turnContext.SendActivityAsync(reply, cancellationToken: cancellationToken);
}
}
呈現結果
相對的bot可以送出附加檔,User也是可以的,那麼bot該如何接收檔案進來呢? 相同的是從Activity物件的attachment屬性來取,請參考以下程式碼片段
public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
{
var replymsg = string.Empty;
if (turnContext.Activity.Type == ActivityTypes.Message)
{
foreach (var item in turnContext.Activity.Attachments)
{
var localfile = Path.Combine(Path.GetTempPath(), item.Name);
// Download the actual attachment
using (var webClient = new WebClient())
{
webClient.DownloadFile(item.ContentUrl, localfile);
}
}
}
}
夾檔附件的傳送若是圖片,則會直接顯示於UI上,但若是文字檔案(例如pdf、word等),則會是顯示檔案名稱,然後以下載方式來呈現。本篇基礎的介紹了標準的文字對話,以及夾檔附件的傳送接收,下一篇將介紹豐富式的資訊圖卡UI對話以及bot歡迎訊息的應用。
By No.18