Edited at

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

More than 1 year has passed since last update.

国産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"])
{
//処理
}