プロジェクト(金岡グループ)
第 2 回
2017年4月14日 金岡 晃
金岡プロジェクトテーマ
配布資料より
テーマC 独自チャットボット作成
コミュニケーションツールSlack上で動き回るチャットボットシステムを 作成する。シェルスクリプトやJavaScriptなどのスクリプト言語と、外 部APIやデータセットの活用により、チームごとに特色のあるチャット ボットの実現を試みる。
技術要素
なんらかの言語を使ったプログラミング 外部リソースの活用
HTTPによるアクセス
2017/4/14 プロジェクト
1
Slack とは
Slack(スラック)
コミュニケーションツール。グループでのチャットを中心として、ユー ザ間のダイレクトメッセージやトピックごとのチャットなどが可能な Webサービス
https://slack.com/
類似・近いサービス?
2017/4/14 プロジェクト
2
スケジュール
内容
第1回(4月7日) プロジェクトの概要説明、基礎知識の学習(1)
第2回(4月14日) 基礎知識の学習(2)、Botデザイン 第3回(4月21日) Botデザインまとめ、発表
第4回(4月28日) 開発(1)
第5回(5月12日) 開発(2)
第6回(5月19日) 開発(3)
第7回(5月26日) 成果発表会
2017/4/14 プロジェクト
3
チャットボット
2017/4/14 プロジェクト
4
ボット
チャット上でユーザとして参加してくるボット(プ ログラム)を作ることができる
プログラムのこと。特に人間に代わって作業を行うものを指すことが 多い。マルウェアの用語としての一面も持つ。
SiriやContanaもボットの一種
簡単なボットならすぐできる
2017/4/14 プロジェクト
5
Slackbotへの登録
簡単なボットならすぐできる
2017/4/14 プロジェクト
6
本格的にボットを作る前に
2017/4/14 プロジェクト
7
ボットプログラム実行用の環境
•
金岡研究室内のサーバを利用
–
各種環境での実行が可能なようにしてある
•
グループごとにアカウントを作成してあります
–グループでアカウントを共有してください
–初期パスワードを配ります
–
パスワードは変更してください
• ssh
でアクセス
– TeraTerm
を使う
–
コマンドの実行などはこれで
• scp
でアクセス
– WinSCPを使う
–
ローカル(実習室で使っている
PCや自宅
PCなど)で作ったファ イルをサーバに送る
2017/4/14 プロジェクト
8
サーバ用アカウント命名規則
2017/4/14 プロジェクト
9
g 2 0 1 7 1 1
年度
学期
1
:春学期前半
2:春学期後半
3:秋学期前半
4:秋学期後半
グループ番号
チーム編成とアカウント名
学番 氏名
5515037 國上 寛規 5515051 坂井 大騎 5516076 中山 晃希 5516084 羽田 大弥
学番 氏名
5515038 倉本 奈々 5515045 古山 祐輝 5516062 高山 裕介 5516065 田中 亜実
学番 氏名
5515026 柏木 伸夫 5515041 桑名 健史 5516066 田辺 瑞貴 5516088 陳 沢広
学番 氏名
5515027 加瀬 貴士 5515055 佐藤 誠人 5516061 高安 真由 5516068 寉岡 昂佑 5516074 中田 美花
学番 氏名
5515025 笠原 康平 5515044 古山 貴大 5516071 戸沢 元紀 5516072 富山 麟太郎 5516077 中山 道裕
学番 氏名
5515035 北爪 みづほ 5515054 佐藤 弘毅 5516069 戸井 成美 5516070 都倉 誠 5516078 長岡 亜理沙
学番 氏名
5515028 片岡 敬済 5515036 工藤 慶明 5516060 高松 晃希 5516079 長沼 慶弥 5516080 鍋谷 佑 グループ1 グループ3 グループ5 グループ7
グループ2 グループ4 グループ6
2017/4/7 プロジェクト
10
g201711
g201712
g201713
g201714
g201715 g201717
g201716
アクセスしてみよう
2017/4/14 プロジェクト
11
avocado.klab.is.sci.toho-u.ac.jp
teratermとWinSCPの両方で
TereTerm
2017/4/14 プロジェクト
12
TereTerm
2017/4/14 プロジェクト
13
TereTerm
2017/4/14 プロジェクト
14
WinSCP
2017/4/14 プロジェクト
15
WinSCP
2017/4/14 プロジェクト
16
左側が自分のマシン 右側がサーバ
本格的にボットを作る
2017/4/14 プロジェクト
17
ボットの開発
2017/4/14 プロジェクト
18
JavaScript
による開発
Botkitフレームワークの利用
Python
による開発
slackbotライブラリの利用
CoffeeScript
による開発
Hubotフレームワークの利用
Java
による開発
JBotフレームワークの利用
共通する事項
2017/4/14 プロジェクト
19
slack
への登録
• slackにBotを登録し、APIトークンを取得する
• 複数のBotを作る場合、複数のAPIトークンを取得する
ボットの登録、 API トークンの取得
2017/4/7 プロジェクト
20
このマークをクリック
ボットの登録、 API トークンの取得
2017/4/7 プロジェクト
21
ボットの登録、 API トークンの取得
2017/4/7 プロジェクト
22
“Apps & integrations”を クリック
ボットの登録、 API トークンの取得
2017/4/7 プロジェクト
23
“Manage”をクリック
ボットの登録、 API トークンの取得
2017/4/7 プロジェクト
24
“Custom Integrations”を クリック
ボットの登録、 API トークンの取得
2017/4/7 プロジェクト
25
“Bots”をクリック
ボットの登録、 API トークンの取得
2017/4/7 プロジェクト
26
“Bots”をクリック
ボットの登録、 API トークンの取得
2017/4/7 プロジェクト
27
“Add Configuration”を クリック
ボットの登録、 API トークンの取得
2017/4/7 プロジェクト
28
“Bots”をクリック
ここで「Bots」が出ない人は https://my.slack.com/services/new/bot
をクリック
ボットの登録、 API トークンの取得
2017/4/7 プロジェクト
29
Slackチーム内で表示さ
れるユーザ名
ボットの登録、 API トークンの取得
2017/4/7 プロジェクト
30
“Add bot integration”を クリック
ボットの登録、 API トークンの取得
2017/4/7 プロジェクト
31
ボットの登録、 API トークンの取得
2017/4/7 プロジェクト
32
これがAPIトークン。
これを別のファイル(テキ ストなど)に保管しておく。
JavaScript による開発
2017/4/14 プロジェクト
33
Botkit
フレームワーク
ボットが実行されるフォルダの設定を行う
(teratermによるサーバ上の作業)
• 実施コマンド
• mkdir <フォルダ名>
• cd <フォルダ名>
• npm init
• npm install botkit --save
mkdirでフォルダを新規
に作成して、cdでその フォルダに移動
botkitを使うための初期化
JavaScript による開発
2017/4/14 プロジェクト
34
Botkit
フレームワーク
ボット本体の作成
(ローカル<実習室PC、自宅PC>での作業)
ファイル名はかならず”index.js”とすること
JavaScript言語
JavaScript による開発
2017/4/14 プロジェクト
35
Botkit
フレームワーク
ボット本体のサーバへのアップロード
(ローカル<実習室PC、自宅PC>での作業)
• WinSCPを立ち上げてサーバ(avocado)に接続
• さきほど作成したフォルダにindex.jsをアップロード
JavaScript による開発
2017/4/14 プロジェクト
36
Botkit
フレームワーク
ボットの実行
( teratermによるサーバ上の作業)
• 実施コマンド
• token=<APIトークン> node index.js
JavaScript による開発:簡単な例
2017/4/14 プロジェクト
37
ボットが実行されるフォルダの設定を行う
(teratermによるサーバ上の作業)
• 実施コマンド
• mkdir testbot01
• cd testbot01
• npm init
• npm install botkit --save
JavaScript による開発:簡単な例
2017/4/14 プロジェクト
38
ボット本体の作成(ローカル<実習室PC、自宅PC>での作業)
const Botkit = require('botkit');
if (!process.env.token) {
console.log('Error: Specify token in environment');
process.exit(1);
}
const controller = Botkit.slackbot({
debug: false });
controller.spawn({
token: process.env.token }).startRTM(function(err){
if (err) {
throw new Error(err);
} });
// say hi
controller.hears('hi',['direct_message','direct_mention','mention'],function(bot,message) { bot.reply(message,'hi');
});
JavaScript による開発:簡単な例
2017/4/14 プロジェクト
39
ボット本体の作成(ローカル<実習室PC、自宅PC>での作業)
const Botkit = require('botkit');
if (!process.env.token) {
console.log('Error: Specify token in environment');
process.exit(1);
}
const controller = Botkit.slackbot({
debug: false });
controller.spawn({
token: process.env.token }).startRTM(function(err){
if (err) {
throw new Error(err);
} });
// say hi
controller.hears('hi',['direct_message','direct_mention','mention'],function(bot,message) {
bot.reply(message,'hi');
});
DMや言及(@ユーザ名 を付けてつぶや く)したときに、そのつぶやきが
「hi」だったら、「hi」と返す
JavaScript による開発:簡単な例
2017/4/14 プロジェクト
40
Botkit
フレームワーク
ボットの実行
( teratermによるサーバ上の作業)
• 実施コマンド
• token=xoxb-169493700566-7ev2Ze5xZJPeqHe0GbevIUJ6 node index.js
JavaScript による開発:簡単な例
2017/4/14 プロジェクト
41
JavaScript による開発:軽い応用
2017/4/14 プロジェクト
42
何か
Botあてにつぶやかれたら、登録してある複数の文言から ランダムに選択して返信する
やること
• 複数文言を登録してあるテキストファイル(1行に1文言)
を用意
• テキストファイルの行数を読み込み、何行目を呼び出すか をランダムに決める
• 決められた行の文言をメッセージとして返す
JavaScript による開発:軽い応用
2017/4/14 プロジェクト
43
const Botkit = require('botkit');
if (!process.env.token) {
console.log('Error: Specify token in environment');
process.exit(1);
}
const controller = Botkit.slackbot({
debug: false });
controller.spawn({
token: process.env.token }).startRTM(function(err){
if (err) {
throw new Error(err);
} });
index.js(前半)
さっきのと同じ
JavaScript による開発:軽い応用
2017/4/14 プロジェクト
44
// say hi
controller.hears('',['direct_message','direct_mention','mention'],function(bot,mess age) {
var fs = require('fs');
var contents = fs.readFileSync('comments.txt');
var lines = contents.toString().split('¥n').length -1;
var num = Math.floor(Math.random()*lines);
var dat = '';
var lnum = 0;
fs.readFileSync('comments.txt').toString().split('¥n').forEach(function (line){
if(lnum==num)dat=line;
lnum++;
});
bot.reply(message,dat);
});
index.js(後半)
どのメッセージでも反応する
文言ファイル
(comments.txt)を開く 行数をカウント
レスする文言をランダムに 選ぶ
その行をレスする
2017/4/14 プロジェクト 45
Python による開発
2017/4/14 プロジェクト
46
slackbot
ライブラリ
ボットが実行されるフォルダの設定を行う
(teratermによるサーバ上の作業)
• 実施コマンド
• mkdir <フォルダ名>
• cd <フォルダ名>
• touch slackbot_settings.py
• touch run.py
• mkdir plugins
• touch plugins/__init__.py botkitを使うための初期化
Python による開発
2017/4/14 プロジェクト
47
slackbot
ライブラリ
slackbot_settings.pyの編集
API_TOKEN = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
default_reply = “I could not understand that...“
PLUGINS = [
‘plugins’, ]
APIトークン
デフォルトのリプライ
teratermで作業
ローカルで作成してWinSCP でアップロード
ボットが実行される フォルダ
Python による開発
2017/4/14 プロジェクト
48
slackbot
ライブラリ
run.pyの編集
from slackbot.bot import Bot def main():
bot = Bot() bot.run()
if __name__ == "__main__":
main()
teratermで作業
ローカルで作成してWinSCP でアップロード
ボットが実行される フォルダ
Python による開発
2017/4/14 プロジェクト
49
slackbot
ライブラリ
好きなファイル(***.py)の編集
teratermで作業
ローカルで作成してWinSCP でアップロード
ボットが実行される フォルダの下のplugin フォルダ
Python による開発
2017/4/14 プロジェクト
50
slackbot
ライブラリ
ボットの実行
( teratermによるサーバ上の作業)
• 実施コマンド
• python run.py
Python による開発:簡単な例
2017/4/14 プロジェクト
51
slackbot
ライブラリ
mention.pyの編集
from slackbot.bot import respond_to
@respond_to('tired')
@respond_to('zzz') def cheer(message):
message.reply('You can make it!')
teratermで作業
ローカルで作成してWinSCP でアップロード
ボットが実行されるフォル ダの下のpluginフォルダ
“tired”か”zzz”をボット 宛につぶやくと反応す る
“You can make it!”と レスする
Python による開発:簡単な例
2017/4/14 プロジェクト
52
slackbot
ライブラリ
mention.pyの編集
from slackbot.bot import respond_to
@respond_to('tired')
@respond_to('zzz') def cheer(message):
message.reply('You can make it!')
teratermで作業
ローカルで作成してWinSCP でアップロード
ボットが実行されるフォル ダの下のpluginフォルダ
“tired”か”zzz”をボット 宛につぶやくと反応す る
“You can make it!”と レスする
2017/4/14 プロジェクト 53
Python による開発:軽い応用
2017/4/14 プロジェクト
54
何か
Botあてにつぶやかれたら、登録してある複数の文言から ランダムに選択して返信する
やること
• 複数文言を登録してあるテキストファイル(1行に1文言)
を用意
• テキストファイルの行数を読み込み、何行目を呼び出すか をランダムに決める
• 決められた行の文言をメッセージとして返す
Python による開発:軽い応用
2017/4/14 プロジェクト
55
from slackbot.bot import respond_to
@respond_to('wei')
def getrandcomment(message):
import random
f = open('comments.txt','r') list = f.readlines()
num = len(list)
randnum = random.randint(0,num-1) message.reply(list[randnum])
randomcom.py
“wei”というメッセージに反応 する
文言ファイル
(comments.txt)を開く 行数をカウント
レスする文言をランダムに 選んで、その行をレスする
2017/4/14 プロジェクト 56
そのほか: Hubot 、 JBot
2017/4/14 プロジェクト
57
環境としては準備できてるけど 資料準備間に合わず…
あとでアップロードします
Bot デザイン:考える点
2017/4/14 プロジェクト
58
どんな目的で、どんな機能を持たせるか
• 目的
• 機能
• こういう入力があったらこう返す
• 「こう」に特徴がある場合はそう返す
• **時**分になったらこう返す
• その他のトリガ
機能はどういう技術要素で持たせるか
• DB(MySQL)を使って…
• クラウドサービスを使って画像なんかを取得して…
• Wikipediaからその項目を検索して…
• 得られたデータから**を**して…
Bot デザイン:考える点
2017/4/14 プロジェクト
59
完成イメージ
• ボット名称
• 動作イメージ
作業項目とメンバー割り当て、線表
次回のプレゼンについて
2017/4/14 プロジェクト
60
Bot
デザインで検討した項目を解説
• 目的、実装する機能
• 機能実現のための技術要素
• 完成イメージ
• 作業項目、割り当て、線表
グループあたりの持ち時間
• 10分
ポイントとなりそうな要素技術
•
外部のリソースの利用
–外部
APIの利用
–
外部データベースの利用
•
他のライブラリの利用
•
正規表現
2017/4/14 プロジェクト
61