未分類

一問一答 Bot の開発 (Getting Started)

こんにちは!SecretaryBot を開発している A’ です!
今回は、Bot Framework を使って、一問一答してくれるシンプルなBot を作ってみましょう。
(Bot Framework の Overview を知りたい人は、この記事を参照してください。)
こちらの公式ページでも解説されていますが、この記事でも説明してみます。

開発環境整え方

開発には以下の 3 つが必要となります。それぞれダウロード/インストールしてください。

“Bot Framework Emulator” は作成した Bot とメッセージの送受信を実施するためのクライアントツールで、主に Debug する際に使用します。(後ほど利用します)
Bot Framework 用の “Visual Studio Template C#” を .zip ファイルのまま以下のパスに配置します。

C:\Users\<ユーザー名>\Documents\Visual Studio 2015\Templates\ProjectTemplates\Visual C#

上記パスに .zip ファイルを配置後、Visual Studio を起動し、[新規作成]-[新しいプロジェクト] を確認すると、下記のように Bot Application が追加されているはずです。これで準備は完了です。

bot%e3%81%ae%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%83%86%e3%83%b3%e3%83%97%e3%83%ac%e3%83%bc%e3%83%88%e8%bf%bd%e5%8a%a0

Coding の方法

実際に Bot を作成するために Code を書いていきましょう。先ほどの [新しいプロジェクト] のダイアログから、 [Bot Application] を選択し、[OK] をクリックすると、以下のようなファイル群が生成されます。

sln

さて、一つ質問です。これらのファイルの中のどの部分で、ユーザーから送られたメッセージを受け、またそれに対する返答しているのでしょうか。それは、MessagesController.cs の MessagesController  クラスの以下のメソッドが対応しています。

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($"You sent {activity.Text} which was {length} characters");
        await connector.Conversations.ReplyToActivityAsync(reply);
    }
    else
    {
        HandleSystemMessage(activity);
    }
    var response = Request.CreateResponse(HttpStatusCode.OK);
    return response;
}

上記のコードの処理を簡単に解説します。
通常 Bot には様々なアクティビティが通知されますが、 3 行目では、Bot 側に通知されたアクティビティの種類がユーザーからのメッセージであるかを判定し、True の場合は if 文の中に入ります。(通知されるアクティビティの種類は、公式ドキュメントで確認可能です。) 7 行目の activity.Text  でユーザーが入力した文字列を取得し文字数をカウントしてます。最後に 10、11 行目で返答メッセージを決定し、ユーザーへ返答しています。

こう見ると、シンプルな Bot を作るだけなら、3-12 行目のコードの中身を書き変えるだけで良さそうですね。試しに時間を尋ねたら現在の時間を答えてくれる Bot を作ってみましょう。3-12 行目を以下のコードと置き換えます。

if (activity.Type == ActivityTypes.Message)
{
    ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
    if (activity.Text.ToLower() == "what time is it now?")
    {
        Activity reply = activity.CreateReply($"It is {DateTime.Now} now.");
        await connector.Conversations.ReplyToActivityAsync(reply);
    }
}

動作確認をしてみよう

作成した Bot の動作確認を実施しましょう。キーボードの [F5] を押すとブラウザが起動し、以下のような画面が表示されます。

edge

上記の画面が現れていれば、Bot 用の Web アプリケーションが端末ローカル上で起動してます。
次にこの Bot (厳密には Bot のプログラムをホストしている Web アプリケーション)  が正しく実装できているか、”Bot Framework Emulator” を使って  Bot にメッセージを投げて確認しましょう。
“Bot Framework Emulator” を起動すると、接続先の “Endpoint” と、”Microsoft App ID”、”Microsoft App Password”の入力欄が表示されますので以下のように指定し [Connect] をクリックします。

"Enter your endpoint URL" : http://localhost:3979/api/messages
"Microsoft App ID" : <未入力>
"Microsoft App Password" : <未入力>

既定のポート番号が 3979 になっていますが、異なる可能性もあるので注意してください。正しく Connect できると、チャット画面が表示されますので、最後に [Type your message…] の部分に “What time is it now?” と入力して、下記の画面ショットように現在の時刻が返ってくれば、大成功です!なお、このプロジェクトは、Github にも公開していますので、動かして遊んでみてください。

emulater

今回は以上です。次回は Web アプリの公開方法と Channel の公開方法を紹介していきます!

 

広告

2 thoughts on “一問一答 Bot の開発 (Getting Started)”

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中