[Minette]LINE雑談BOTを10数行のコードで作成する

  • 3
    Like
  • 0
    Comment

国産BOTフレームワーク「Minette」を使えば、LINEの雑談BOTを10分くらい かつ 10行ちょっとのコードで作ることができます。.NETベースのためAzureのWebAppsなどの環境と、事前にLINE@のMessaging APIのアカウント、docomoのAPI keyは取得しておいてください。

プロジェクトの準備

VisualStudioにはMVCベースのリッチなプロジェクトテンプレートを用意してくれていますが、今回はMinetteとの「つなぎ」となるページだけをつくればよいので、CSHTMLファイル1枚のライトな構成とします。

ASP.NETプロジェクトの新規作成

新規作成>プロジェクトから、ASP.NETのプロジェクトを作成します。
01.png
続いて表示されるテンプレートの選択画面では「Empty」を選択し、また、フォルダ構成や参照の追加については「MVC」にチェックを入れてOKボタンを押すとプロジェクトが作成されます。
02.png

リソースの削除・修正

基本的なプロジェクトの設定や参照だけを使いますので、package.configとWeb.configだけを残して大胆にファイルやフォルダを消します。
03.png
続いて、元々の設定ではCSHTMLファイルを直接開けないようになっているので、Web.configのconfiguration>appSettingsのうちkeyがwebpages:Enabledのもののvalueをtrueに修正します。

Web.config抜粋
<configuration>
  <appSettings>
    <add key="webpages:Version" value="3.0.0.0"/>
    <add key="webpages:Enabled" value="true"/>

動作確認

それでは一旦動作確認です。テスト用にindex.cshtmlというファイルを作成し、以下のようにコードを記述したら実行してみましょう。

index.cshtml
@{
    var message = "Hello, ASP.NET";
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title></title>
</head>
<body>
    <div>
    @message
    </div>
</body>
</html>

このように表示されたら成功です

Hello ASP.NET

Minetteのインストール

nugetのパッケージマネージャで以下を実行するか、「Minette」で検索してインストールします。

PM> Install-Package Minette

インストールに成功したら、以下のとおりweb.cshtmlというファイルを追加・実行して、Minetteに接続できたか稼動確認してみましょう。

web.cshtml
@{
    var adaptor = new Minette.Channel.Text.Adaptor();
    var response = adaptor.ProcessRequest("Hello, Minette", "12345");
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title></title>
</head>
<body>
    <div>
    @response
    </div>
</body>
</html>

以下のように表示されたらMinetteとの接続は成功です。

Hello Minette

雑談APIとの接続

MinetteではClassifierという部品で話題を分類し、DialogServiceという部品で話題に応じた処理を行います。Minetteにはdocomoの雑談APIを処理するためのDialogServiceが組み込まれているので、ここでは、「すべてのケースで雑談処理を行う」という分類を行うClassifierを作っていきます。web.cshtmlを以下のとおりに修正して実行してみましょう。

web.cshtml
@{
    var adaptor = new Minette.Channel.Text.Adaptor();
    //下で作成するClassifierのコアへの設定
    adaptor.MinetteCore.Classifier = new Classifier();
    var response = adaptor.ProcessRequest("こんにちは", "12345");
}

@functions{
    //すべてのケースを雑談処理に分類するClassifier
    class Classifier : Minette.Application.Classifier
    {
        public override void Classify()
        {
            Session.DialogService = new Minette.Application.ChatDialog("<docomoAPI key>");
        }
    }
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title></title>
</head>

<body>
    <div>
    @response
    </div>
</body>
</html>

「こんにちは」に対応する応答が返ってくれば成功です。
talk

なおdocomoのAPI keyはマイページ>API利用申請・管理の画面で確認することができます。
08.png

LINEとの接続

最後に、LINEからメッセージを受け取って応答するためのページを追加します。動作確認には実際にLINEと接続する必要があるため、作成したらデプロイしましょう。

line.cshtml
@{
    //LINEからのメッセージを受信
    var bytesData = Request.BinaryRead(Request.ContentLength);
    var encodedString = System.Text.Encoding.UTF8.GetString(bytesData);
    var decodedString = System.Web.HttpUtility.UrlDecode(encodedString, System.Text.Encoding.UTF8);

    //アダプタの初期化
    var adaptor = new Minette.Channel.Line.Adaptor();
    //アクセストークンの設定
    adaptor.ChannelAccessToken = "<LINE Messaging API のアクセストークン>";
    //下で作成するClassifierのコアへの設定
    adaptor.MinetteCore.Classifier = new Classifier();

    //実行
    System.Web.Hosting.HostingEnvironment.QueueBackgroundWorkItem(token => adaptor.ProcessRequestAsync(token, decodedString));
}

@functions{
    //すべてのケースを雑談処理に分類するClassifier
    class Classifier : Minette.Application.Classifier
    {
        public override void Classify()
        {
            Session.DialogService = new Minette.Application.ChatDialog("<docomoAPI key>");
        }
    }
}

メッセージの受け取り方とLINEのトークンが必要な点が異なりますが、基本的にweb.cshtmlと同じです。LINE Messaging APIのアクセストークンは、LINE Developersの以下の画面に表示されています。また、そのすぐ上にはWebhook URLという欄がありますので、デプロイしたページのURLを登録しましょう。

LINE Developersの設定画面

作業はこれでおしまいです。LINEから話しかけて雑談できることを確認してみましょう。
07.png

さいごに

今回はとにかく1つの入力に雑談で返すというBOTを作成しましたが、Minette(のSessionManager)を使えば、会話の文脈を踏まえた雑談をすることも可能です。また、あるケースでは何らかの機能(天気予報を調べたり、交通情報を調べたり、ピザを注文したりなど)を実行し、それ以外は雑談で応答するといったBOTも複雑な構成にすることなく構築することができます。

アーキテクチャの全体像や主な機能、APIリファレンスなどはMinetteのプロジェクトページを参照してください。

またMinetteベースのいもうとBOTもよろしければぜひお試しください。主な機能は以下のとおりです。使い方はまた別途・・・。

  • 時刻表検索(指定駅のこの先5本分)
  • 天気予報
  • 翻訳(91ヶ国語)
  • そば屋検索
  • 画像認識(性別・年齢判定、食べ物認識、花の名前判定)
  • Amazon買い物(三河屋BOT)
  • メモリマインダー
  • しりとり
  • 雑談

おまけ:LINEの署名をチェックする

BOTを本番サービスとして後悔するのであれば、LINEからのアクセス以外には反応しないように、署名をチェックするようにした方が良いです。以下、サンプルコードです。

//署名の計算
System.Text.UTF8Encoding ue = new System.Text.UTF8Encoding();
byte[] keyBytes = ue.GetBytes("<input your Channel Secret>");
System.Security.Cryptography.HMACSHA256 sha256 = new System.Security.Cryptography.HMACSHA256(keyBytes);
byte[] hashBytes = sha256.ComputeHash(bytesData);
string hashStr = Convert.ToBase64String(hashBytes);
//署名の照合
if (hashStr == Request.Headers["X-LINE-Signature"])
{
    //処理
}