プロジェクト(金岡グループ) · Pythonによる開発 45 2017/4/14 プロジェクト slackbotライブラリ ボットが実行されるフォルダの設定を行う
プロジェクト(金岡グループ)...チャットボット 4 2017/6/9 プロジェクト...
Transcript of プロジェクト(金岡グループ)...チャットボット 4 2017/6/9 プロジェクト...
プロジェクト(金岡グループ)第2回2017年6月9日 金岡 晃
金岡プロジェクトテーマ
配布資料より
テーマC 独自チャットボット作成
コミュニケーションツールSlack上で動き回るチャットボットシステムを作成する。シェルスクリプトやJavaScriptなどのスクリプト言語と、外部APIやデータセットの活用により、チームごとに特色のあるチャットボットの実現を試みる。
技術要素
なんらかの言語を使ったプログラミング
外部リソースの活用
HTTPによるアクセス
2017/6/9 プロジェクト1
Slackとは
Slack(スラック)
コミュニケーションツール。グループでのチャットを中心として、ユーザ間のダイレクトメッセージやトピックごとのチャットなどが可能なWebサービス
https://slack.com/
類似・近いサービス?
2017/6/9 プロジェクト2
スケジュール
内容
第1回(6月2日) プロジェクトの概要説明、基礎知識の学習(1)
第2回(6月9日) 基礎知識の学習(2)、Botデザイン
第3回(6月16日) Botデザインまとめ、発表
第4回(6月23日) 開発(1)
第5回(6月30日) 開発(2)
第6回(7月7日) 開発(3)
第7回(7月14日) 成果発表会
2017/6/9 プロジェクト3
チャットボット
2017/6/9 プロジェクト4
ボット
チャット上でユーザとして参加してくるボット(プログラム)を作ることができる
プログラムのこと。特に人間に代わって作業を行うものを指すことが多い。マルウェアの用語としての一面も持つ。SiriやContanaもボットの一種
簡単なボットならすぐできる
2017/6/9 プロジェクト5
Slackbotへの登録
簡単なボットならすぐできる
2017/6/9 プロジェクト6
本格的にボットを作る前に
2017/6/9 プロジェクト7
ボットプログラム実行用の環境
• 金岡研究室内のサーバを利用
– 各種環境での実行が可能なようにしてある
• グループごとにアカウントを作成してあります
– グループでアカウントを共有してください
– 初期パスワードを配ります
– パスワードは変更してください
• sshでアクセス
– TeraTermを使う
– コマンドの実行などはこれで
• scpでアクセス
– WinSCPを使う
– ローカル(実習室で使っているPCや自宅PCなど)で作ったファイルをサーバに送る
2017/6/9 プロジェクト8
サーバ用アカウント命名規則
2017/6/9 プロジェクト9
g201721
年度
シーズン1:春学期前半2:春学期後半3:秋学期前半4:秋学期後半
グループ番号
チーム編成とアカウント名
学番 氏名
5515003新治 裕希
5515013太田 和希
5516101牧 伊織
5516111毛藤 匡哉
学番 氏名
5515012大石 涼火
5515016大橋 拓実
5516096平山 結菜
5516107水沼 佑太
学番 氏名
5515018岡野 就斗
5515021落合 伸紀
5516113山田 碧
5516118岡部 瞳
学番 氏名
5515017大山 滉平
5515023柿本 健
5516094平山 真聖
5516103松岡 智也
5516110宮本 康平
学番 氏名
5515005飯塚 拓巳
5515014大友 尚
5516089東森 大樹
5516100前田 直人
5516115吉澤 宏紀
学番 氏名
5515009伊藤 翼
5515024笠川 翔大
5516093平山 果奈
5516102増本 真子
5516105松本 実結貴
学番 氏名
5515007石橋 純
5515015大野 裕司
5516091平田 絵理
5516112山崎 優太
5516114山田 航大
グループ1 グループ3 グループ5 グループ7
グループ2 グループ4 グループ6
2017/6/2 プロジェクト10
g201721
g201722
g201723
g201724
g201725 g201727
g201726
アクセスしてみよう
2017/6/9 プロジェクト11
avocado.klab.is.sci.toho-u.ac.jp
teratermとWinSCPの両方で
TereTerm
2017/6/9 プロジェクト12
TereTerm
2017/6/9 プロジェクト13
TereTerm
2017/6/9 プロジェクト14
WinSCP
2017/6/9 プロジェクト15
WinSCP
2017/6/9 プロジェクト16
左側が自分のマシン 右側がサーバ
本格的にボットを作る
2017/6/9 プロジェクト17
ボットの開発
2017/6/9 プロジェクト18
JavaScriptによる開発
Botkitフレームワークの利用
Pythonによる開発
slackbotライブラリの利用
CoffeeScriptによる開発
Hubotフレームワークの利用
Javaによる開発
JBotフレームワークの利用
共通する事項
2017/6/9 プロジェクト19
slackへの登録
• slackにBotを登録し、APIトークンを取得する• 複数のBotを作る場合、複数のAPIトークンを取得する
ボットの登録、APIトークンの取得
2017/6/9 プロジェクト20
このマークをクリック
ボットの登録、APIトークンの取得
2017/6/9 プロジェクト21
ボットの登録、APIトークンの取得
2017/6/9 プロジェクト22
“Apps & integrations”をクリック
ボットの登録、APIトークンの取得
2017/6/9 プロジェクト23
“Manage”をクリック
ボットの登録、APIトークンの取得
2017/6/9 プロジェクト24
“Custom Integrations”をクリック
ボットの登録、APIトークンの取得
2017/6/9 プロジェクト25
“Bots”をクリック
ボットの登録、APIトークンの取得
2017/6/9 プロジェクト26
“Bots”をクリック
ボットの登録、APIトークンの取得
2017/6/9 プロジェクト27
“Add Configuration”をクリック
ボットの登録、APIトークンの取得
2017/6/9 プロジェクト28
“Bots”をクリック
ここで「Bots」が出ない人は
https://my.slack.com/services/new/botをクリック
ボットの登録、APIトークンの取得
2017/6/9 プロジェクト29
Slackチーム内で表示されるユーザ名
ボットの登録、APIトークンの取得
2017/6/9 プロジェクト30
“Add bot integration”をクリック
ボットの登録、APIトークンの取得
2017/6/9 プロジェクト31
ボットの登録、APIトークンの取得
2017/6/9 プロジェクト32
これがAPIトークン。これを別のファイル(テキストなど)に保管しておく。
JavaScriptによる開発
2017/6/9 プロジェクト33
Botkitフレームワーク
ボットが実行されるフォルダの設定を行う(teratermによるサーバ上の作業)
• 実施コマンド• mkdir <フォルダ名>• cd <フォルダ名>• npm init• npm install botkit --save
mkdirでフォルダを新規に作成して、cdでそのフォルダに移動
botkitを使うための初期化
JavaScriptによる開発
2017/6/9 プロジェクト34
Botkitフレームワーク
ボット本体の作成(ローカル<実習室PC、自宅PC>での作業)
ファイル名はかならず”index.js”とすること
JavaScript言語
JavaScriptによる開発
2017/6/9 プロジェクト35
Botkitフレームワーク
ボット本体のサーバへのアップロード(ローカル<実習室PC、自宅PC>での作業)
• WinSCPを立ち上げてサーバ(avocado)に接続• さきほど作成したフォルダにindex.jsをアップロード
JavaScriptによる開発
2017/6/9 プロジェクト36
Botkitフレームワーク
ボットの実行( teratermによるサーバ上の作業)
• 実施コマンド• token=<APIトークン> node index.js
JavaScriptによる開発:簡単な例
2017/6/9 プロジェクト37
ボットが実行されるフォルダの設定を行う(teratermによるサーバ上の作業)
• 実施コマンド• mkdir testbot01• cd testbot01• npm init• npm install botkit --save
JavaScriptによる開発:簡単な例
2017/6/9 プロジェクト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 hicontroller.hears('hi',['direct_message','direct_mention','mention'],function(bot,message) {
bot.reply(message,'hi');});
JavaScriptによる開発:簡単な例
2017/6/9 プロジェクト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 hicontroller.hears('hi',['direct_message','direct_mention','mention'],function(bot,message) {
bot.reply(message,'hi');});
DMや言及(@ユーザ名 を付けてつぶやく)したときに、そのつぶやきが「hi」だったら、「hi」と返す
JavaScriptによる開発:簡単な例
2017/6/9 プロジェクト40
Botkitフレームワーク
ボットの実行( teratermによるサーバ上の作業)
• 実施コマンド• token=xoxb-169493700566-7ev2Ze5xZJPeqHe0GbevIUJ6 node index.js
JavaScriptによる開発:簡単な例
2017/6/9 プロジェクト41
JavaScriptによる開発:軽い応用
2017/6/9 プロジェクト42
何かBotあてにつぶやかれたら、登録してある複数の文言からランダムに選択して返信する
やること
• 複数文言を登録してあるテキストファイル(1行に1文言)を用意
• テキストファイルの行数を読み込み、何行目を呼び出すかをランダムに決める
• 決められた行の文言をメッセージとして返す
JavaScriptによる開発:軽い応用
2017/6/9 プロジェクト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/6/9 プロジェクト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/6/9 プロジェクト45
Pythonによる開発
2017/6/9 プロジェクト46
slackbotライブラリ
ボットが実行されるフォルダの設定を行う(teratermによるサーバ上の作業)
• 実施コマンド• mkdir <フォルダ名>• cd <フォルダ名>• touch slackbot_settings.py• touch run.py• mkdir plugins• touch plugins/__init__.py
botkitを使うための初期化
Pythonによる開発
2017/6/9 プロジェクト47
slackbotライブラリ
slackbot_settings.pyの編集
API_TOKEN = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
default_reply = “I could not understand that...“
PLUGINS = [‘plugins’,
]
APIトークン
デフォルトのリプライ
teratermで作業
ローカルで作成してWinSCPでアップロード
ボットが実行されるフォルダ
Pythonによる開発
2017/6/9 プロジェクト48
slackbotライブラリ
run.pyの編集
from slackbot.bot import Botdef main():
bot = Bot()bot.run()
if __name__ == "__main__":main()
teratermで作業
ローカルで作成してWinSCPでアップロード
ボットが実行されるフォルダ
Pythonによる開発
2017/6/9 プロジェクト49
slackbotライブラリ
好きなファイル(***.py)の編集
teratermで作業
ローカルで作成してWinSCPでアップロード
ボットが実行されるフォルダの下のpluginフォルダ
Pythonによる開発
2017/6/9 プロジェクト50
slackbotライブラリ
ボットの実行( teratermによるサーバ上の作業)
• 実施コマンド• python run.py
Pythonによる開発:簡単な例
2017/6/9 プロジェクト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/6/9 プロジェクト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/6/9 プロジェクト53
Pythonによる開発:軽い応用
2017/6/9 プロジェクト54
何かBotあてにつぶやかれたら、登録してある複数の文言からランダムに選択して返信する
やること
• 複数文言を登録してあるテキストファイル(1行に1文言)を用意
• テキストファイルの行数を読み込み、何行目を呼び出すかをランダムに決める
• 決められた行の文言をメッセージとして返す
Pythonによる開発:軽い応用
2017/6/9 プロジェクト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/6/9 プロジェクト56
そのほか:Hubot、JBot
2017/6/9 プロジェクト57
JBotに関する資料は「関連資料:Javaによる開発(JBot利用)」としてアップロードしていますのでそちらを参照してください。
Botデザイン:考える点
2017/6/9 プロジェクト58
どんな目的で、どんな機能を持たせるか
• 目的• 機能
• こういう入力があったらこう返す• 「こう」に特徴がある場合はそう返す• **時**分になったらこう返す• その他のトリガ
機能はどういう技術要素で持たせるか
• DB(MySQL)を使って…• クラウドサービスを使って画像なんかを取得して…• Wikipediaからその項目を検索して…• 得られたデータから**を**して…
Botデザイン:考える点
2017/6/9 プロジェクト59
完成イメージ
• ボット名称• 動作イメージ
作業項目とメンバー割り当て、線表
次回のプレゼンについて
2017/6/9 プロジェクト60
Botデザインで検討した項目を解説
• 目的、実装する機能• 機能実現のための技術要素• 完成イメージ• 作業項目、割り当て、線表
グループあたりの持ち時間
• 10分
ポイントとなりそうな要素技術
• 外部のリソースの利用
– 外部APIの利用
– 外部データベースの利用
• 他のライブラリの利用
• 正規表現
2017/6/9 プロジェクト61