« AIとすごす怠惰な世界 | トップページ | 勉強は続くよ…どこまでも »

2017年6月12日 (月)がんばれagrobo君

おはようございます。sun
本日のブログ当番プログラマーのM.Iです。

大阪は梅雨で雨の日が多くなってきました。
傘を持っていないと不安になりますね。

最近知ったのですが、slackというチャットサービスがあります。
skype等と同じようにチャットができるサービスですが、AIを会話に参加させることができます。

よくbotといわれるものです。
ここで動くbotを作ってみました。

いくつかbotを作成するライブラリは公開されているのですが、筆者は.net好きなので.netで動くnoobotを使用します。

20170609_01

https://github.com/noobot/noobot

からgitなりでcloneしてきてください。

https://github.com/noobot/noobot/wiki/Getting-Started-With-Noobot#get-noobot-up-and-running-quickly

を参考に、botをslackに登録して、指示されたapiTokenをconfig.jsonに書き込み、cloneしてきたソースを実行するとbotがslackでオンライン表示になります。

aboutと発言するとbotが作者の情報を返信してくれます。

さてこのままでは味気ないので話しかけると反応してくれるように実装してみましょう。
helloと発言すると現在の時間に合わせて挨拶してくれるようにします。

noobotではMiddleWareBaseを継承したクラスを作るとチャットに反応するようにできるみたいです。
GreetingMiddleWareクラスを作ります。

using System;
using System.Collections.Generic;
using Noobot.Core.MessagingPipeline.Request;
using Noobot.Core.MessagingPipeline.Response;

namespace Noobot.Core.MessagingPipeline.Middleware
{
class GreetingMiddleWare : MiddlewareBase
{
INoobotCore myCore;
public GreetingMiddleWare( IMiddleware next , INoobotCore core)
: base( next )
{
myCore = core;
HandlerMappings = new[]
{

new HandlerMapping
{
ValidHandles = new []{ "Hello" },
Description = "挨拶するミドルウェア",
EvaluatorFunc = GreetingHandler
}
};
}

private IEnumerable

GreetingHandler( IncomingMessage message , string matched )
{
string greeting =
  DateTime.Now.Hour <  9 ? "おはようございます"
: DateTime.Now.Hour < 17 ? "こんにちは"
: "こんばんは";
yield return message.ReplyDirectlyToUser( greeting );
}
}
}

ValidHandlesに入っている文字列(大文字小文字は無視されます)がチャットに発言されると反応します。
この場合hello や hello worldに反応します。
EvaluatorFuncに登録した関数が呼び出されます。
messageに話しかけてきた人や所属しているチャンネル情報、話しかけられたメッセージ全文といった情報がきます。

話しかけられた後今の時間に応じて返信文字列を作ってやれば完成です。
上の例なら
0~8時なら「おはようございます」
9~16 時なら「こんにちは」
17~23時までなら「こんばんは」
と返信してくれるようになります。

クラスを実装しても実行されないと意味がありません。
noobotのライブラリのContainerFactory.csの

private void SetupMiddlewarePipeline(Registry registry)

メソッドの最終行に以下のように追加するとbotの初期化時に実装したクラスのコンストラクタが実行されます。

registry.For

().DecorateAllWith

();

上の例なら特定の文字が来た場合のみ返事を返す、ということができます。

再度実行してhelloと発言すれば

20170609_02

余談ですが、

myCore.SendMessage( ResponseMessage.DirectUserMessage( message.UserId , "hello" );

という風にすれば能動的に返信できます。

Taskクラスとasync,awaitを利用すれば1秒ごとに実行する処理を記述できます。

		private IEnumerable

GreetingHandler( IncomingMessage message , string matched )
{
Task.Run( async ( ) => {
for ( ;;)
{
await Task.Delay( 1000 );
await myCore.SendMessage( ResponseMessage.DirectUserMessage( message.UserId , "1秒経過" ) );
}
} );
}

メッセージが着た後1秒ごとに1秒が経過したことを返信してくれるbotになります。
これで1秒ごとに情報を持ってこれるようになったので、誕生日に祝うbot等も作れます。

世の中には数式を投げると計算結果を返信してくれるといった仕事の手伝いをするbotもあるようです。

以前このブログでも紹介されましたが
http://www.accessgames-blog.com/blog/2016/12/post-4eff.html
chatopsと呼ばれるそうです。

機械でもできそうな仕事を見つけて、作業を振ってみてもいいかもしれません。

follow us in feedly
result = encodeURIComponent( "http://www.accessgames-blog.com/blog/2017/06/agrobo-4d0b.html" );document.write( "result = " , result );&media=https%3A%2F%2Ffarm8.staticflickr.com%2F7027%2F6851755809_df5b2051c9_z.jpg&description=Next%20stop%3A%20Pinterest">

| | コメント (0) | トラックバック (0)

« AIとすごす怠惰な世界 | トップページ | 勉強は続くよ…どこまでも »

プログラマー」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/217647/65390483

この記事へのトラックバック一覧です: がんばれagrobo君:

« AIとすごす怠惰な世界 | トップページ | 勉強は続くよ…どこまでも »