Chatbot 開發使用Bot Framework V4 - 訊息的接收與回覆

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