[Bot] 使用Microsoft Bot Framework,建立自動回覆訊息的機器人 (Bot Framework v3.0)

在前篇文章[Bot] 使用Microsoft Bot Framework,建立自動回覆訊息的機器人 (Bot Framework v1.0)
說明了如何透過Microsoft Bot Framework建立機器人,不過微軟在2016/07/08左右,更新了Bot Framework的版本至3.0
若是要建立新的機器人,已經無法使用1.0的版本了,3.0的建立方式與1.0相同,不過多了幾個步驟,程式也梢有改變
本篇文章會說明,如何建立3.0的機器人

首先建立3.0的機器人,一樣必須先連上Microsoft Bot Framework的網頁https://dev.botframework.com/,並點選[Register a bot]

接著,在機器人的[Name]與[Bot handle]欄位中,填入機器人的名字唯一名,其中[Bot handle]欄位請先記下來,等一下會用到

在[Configuration]區塊中,[Messaging endpoint]欄位先隨便輸入一個網址,這裡的步驟與v1.0相同,接著點選下方[Create Microsoft App ID and password]

此時畫面會跳至建立app ID的畫面,這裡會將機器人的[App Name]以及[App ID]顯示出來,在這裡先將[App ID]記下來,並點選下方的[Generate a password and continue]

建立出來的密碼,請先記下來,因為它只會顯示一次而已

完成後,點選下方的[Finish and go back to Bot Framework]

接著將下方的所有表單內容填完,填的內容都與v1.0相同

建立完成後,開啟Visual Studio,並在專案中建立一個Controllers/MessagesController.cs的類別庫

在MessagesController.cs中,加入下方的程式碼

using Microsoft.Bot.Connector;

[BotAuthentication]
public class MessagesController : ApiController
{
    /// <summary>
    /// POST: api/Messages
    /// Receive a message from a user and reply to it
    /// </summary>
    public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
    {
        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($"你送入的文字是 {activity.Text} 這段文字長 {length} 個字元");
            await connector.Conversations.ReplyToActivityAsync(reply);
        }
        else
        {
            HandleSystemMessage(activity);
        }
        var response = Request.CreateResponse(HttpStatusCode.OK);
        return response;
    }

    private Activity HandleSystemMessage(Activity message)
    {
        if (message.Type == ActivityTypes.DeleteUserData)
        {
            // Implement user deletion here
            // If we handle user deletion, return a real message
        }
        else if (message.Type == ActivityTypes.ConversationUpdate)
        {
            // Handle conversation state changes, like members being added and removed
            // Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info
            // Not available in all channels
        }
        else if (message.Type == ActivityTypes.ContactRelationUpdate)
        {
            // Handle add/remove from contact lists
            // Activity.From + Activity.Action represent what happened
        }
        else if (message.Type == ActivityTypes.Typing)
        {
            // Handle knowing tha the user is typing
        }
        else if (message.Type == ActivityTypes.Ping)
        {
        }

        return null;
    }
}

這段程式碼與v1.0的很接近,主要是將Message更改為Activity的物件,以便未來除了文字的回覆外,還可以回覆其他的物件,如圖片等等的

接著在專案中,加入[Microsoft.Bot.Builder]的Nuget套件

程式的部份,最後再開啟Web.Config,將下面的三個設定值,放入至appSettings區塊中

<add key="BotId" value="[這是放上Bot handle]" />
<add key="MicrosoftAppId" value="[這裡放上App ID]" />
<add key="MicrosoftAppPassword" value="[這裡放上App password]" />

到這裡,程式的部份完成了,最後只要發布至網路上,再回過頭去更改Message Endpoint的URL,v3.0 Bot Framework機器人的建立動作就完成了。
在機器人主畫面中,左下角的Test,點選後也會出現成功連線的資訊

加上Web Chat的部份也可以使用了

參考資料:
https://github.com/Microsoft/BotBuilder
Upgrade your bot to V3

文章範例程式
https://github.com/madukapai/maduka-Robot