Azure Bot Serviceを使ってBOTを10分で作成する（＋日本語化手順）

##概要
今回は、マイクロソフトが11月15日にリリースした、「Azure Bot Service」を使って、チャットボットを10分で作ってみたいと思います。

##事前に必要なもの
* Azureのサブスクリプション

##使い方

1. まず、Azure Portalから、「新規」>「Intelligence + Analytics」>「Bot Service」の順に選択し、項目を記入し、「作成」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/dff67803-18de-d0d8-85a4-d5b6b92d82e7.png)

2. 作成されたものは「App Service」からアクセスします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/76716457-82c0-0c8e-e4c2-3192fc7156ec.png)

3. アプリの種類は「Bot Service」として表示されます。これをクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/14bbd5dc-15cb-42ec-5cb1-d533b1c7a7b2.png)

4. 開くと、Microsoft App IDの作成が求められます。「Create Microsoft App ID and Password」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/2811bb96-f121-c9fb-b8f9-603fde008c72.png)

5. アプリ名は(1)で設定したアプリ名、アプリIDは自動で生成されます。「アプリパスワードを生成して続行」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/6a3c216d-6807-ad5c-593e-cbc763051ead.png)

6. パスワードが表示されます。表示されたパスワードをメモ帳等のテキストエディタへ貼り付けて、「OK」をクリックします。パスワードは後程利用します。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/7eb6da2d-ce0f-9ae1-00e6-0502e6decc20.png)
7. 「終了してボットのフレームワークに戻る」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/533c9f0d-283e-e4cb-b48e-bdd9a0d9c680.png)

8. 先ほど表示されていた、App IDとメモ帳へ貼り付けていたパスワードを入力します。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/027f526a-1949-c091-3af8-334de3e723ca.png)

9. 次に言語を選びます。今回はC#で作りますので、「C#」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/38ff3821-96e8-40af-7618-197702250dda.png)

10. 次に、作成するBOTのテンプレートを選びます。今回は、Formを選択しますが、ほかにも色々用意されています：
Basic - 単純に入力した内容をオウム返しするBOTです。
Form - FormFlowを利用してアンケートを取るBOTが作成できます。
Proactive - Azure Functionsのトリガーイベントで、Azure Botに動作させるテンプレートです。
Language understanding - 自然言語解析のLUISを組み合わせたテンプレートです。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/a717a020-9aab-e9f7-6c0f-b6867aee6159.png)

11. クリックすると、BOTの作成が始まります。1分ぐらいで完了します。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/64e4447e-509e-a111-47a9-f316fd361b42.png)

12. これで、BOTは作成されました。右側のチャット画面からメッセージを入力すると、会話ができます
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/6450f343-5803-24a0-eecc-ccfe2925997d.png)

##日本語化の手順
テンプレートままだと、英語になるので、日本語化します。

a) BasicForm.csxを以下のコードへ置換します。

```CSharp
using System;
using Microsoft.Bot.Builder.FormFlow;

public enum CarOptions { コンバーチブル = 1, SUV, 電気自動車 };
public enum ColorOptions { 赤 = 1, 白, 青 };

// For more information about this template visit http://aka.ms/azurebots-csharp-form
[Serializable]
public class BasicForm
{
    [Prompt("こんにちは! あなたの名前はなんですか?")]
    public string Name { get; set; }

    [Prompt("好みの車種を教えてください {||}")]
    public CarOptions Car { get; set; }

    [Prompt("好きな色を教えてください。 {||}")]
    public ColorOptions Color { get; set; }

    public static IForm<BasicForm> BuildForm()
    {
        // Builds an IForm<T> based on BasicForm
        return new FormBuilder<BasicForm>().Build();
    }

    public static IFormDialog<BasicForm> BuildFormDialog(FormOptions options = FormOptions.PromptInStart)
    {
        // Generated a new FormDialog<T> based on IForm<BasicForm>
        return FormDialog.FromForm(BuildForm, options);
    }
}
```

b) MainDialog.csxを以下のコードへ変換します。


```CSharp
 
#load "BasicForm.csx"

using System;
using System.Threading.Tasks;
using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Builder.FormFlow;
using Microsoft.Bot.Connector;

/// This dialog is the main bot dialog, which will call the Form Dialog and handle the results
[Serializable]
public class MainDialog : IDialog<BasicForm>
{
    public MainDialog()
    {
    }

    public Task StartAsync(IDialogContext context)
    {
        context.Wait(MessageReceivedAsync);
        return Task.CompletedTask;
    }

    public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument)
    {
        var message = await argument;
        context.Call(BasicForm.BuildFormDialog(FormOptions.PromptInStart), FormComplete);
    }

    private async Task FormComplete(IDialogContext context, IAwaitable<BasicForm> result)
    {
        try
        {
            var form = await result;
            if (form != null)
            {
                await context.PostAsync("アンケートにお答えいただき、ありがとうございました。何か文字を入力するとアンケートが始まります。");
            }
            else
            {
                await context.PostAsync("フォームは空でした。もう一度入力して、アンケートをはじめてください");
            }
        }
        catch (OperationCanceledException)
        {
            await context.PostAsync("アンケートがキャンセルされました。アンケートを再開するには、何か文字を入力してください。");
        }

        context.Wait(MessageReceivedAsync);
    }
}
 
```


c) 2016/11/19現在、コードを書き換えただけでは、Azure Functionsのように変更内容が完全に反映されるわけではみたいなので（気のせいかもしれませんが）、いったん、このAzure Bot Serviceが稼働しているベースとなるApp Serviceを再起動します。
再起動する方法は、「Settings」をクリックします。

![image](https://qiita-image-store.s3.amazonaws.com/0/136660/20b9e664-cb91-85e8-79e2-8e0fd0938dd8.png)

d) Advanced settingsにある、「Open」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/0a837fa1-e007-12a9-6b9a-8e41b809f6a8.png)

e) 「再起動」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/01710b60-9e2e-767e-18f7-1fdd034b75c9.png)

f) これで日本語化されました。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/698087d8-6639-2b62-2328-ed3bab2737a8.png)