プロジェクト(金岡グループ) · Pythonによる開発 45 2017/4/14 プロジェクト...

Preview:

Citation preview

プロジェクト(金岡グループ)第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

g201711

年度

学期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

Slackチーム内で表示されるユーザ名

ボットの登録、APIトークンの取得

2017/4/7 プロジェクト29

“Add bot integration”をクリック

ボットの登録、APIトークンの取得

2017/4/7 プロジェクト30

ボットの登録、APIトークンの取得

2017/4/7 プロジェクト31

これがAPIトークン。これを別のファイル(テキストなど)に保管しておく。

JavaScriptによる開発

2017/4/14 プロジェクト32

Botkitフレームワーク

ボットが実行されるフォルダの設定を行う(teratermによるサーバ上の作業)

• 実施コマンド• mkdir <フォルダ名>• cd <フォルダ名>• npm init• npm install botkit --save

mkdirでフォルダを新規に作成して、cdでそのフォルダに移動

botkitを使うための初期化

JavaScriptによる開発

2017/4/14 プロジェクト33

Botkitフレームワーク

ボット本体の作成(ローカル<実習室PC、自宅PC>での作業)

ファイル名はかならず”index.js”とすること

JavaScript言語

JavaScriptによる開発

2017/4/14 プロジェクト34

Botkitフレームワーク

ボット本体のサーバへのアップロード(ローカル<実習室PC、自宅PC>での作業)

• WinSCPを立ち上げてサーバ(avocado)に接続• さきほど作成したフォルダにindex.jsをアップロード

JavaScriptによる開発

2017/4/14 プロジェクト35

Botkitフレームワーク

ボットの実行( teratermによるサーバ上の作業)

• 実施コマンド• token=<APIトークン> node index.js

JavaScriptによる開発:簡単な例

2017/4/14 プロジェクト36

ボットが実行されるフォルダの設定を行う(teratermによるサーバ上の作業)

• 実施コマンド• mkdir testbot01• cd testbot01• npm init• npm install botkit --save

JavaScriptによる開発:簡単な例

2017/4/14 プロジェクト37

ボット本体の作成(ローカル<実習室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/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 hicontroller.hears('hi',['direct_message','direct_mention','mention'],function(bot,message) {

bot.reply(message,'hi');});

DMや言及(@ユーザ名 を付けてつぶやく)したときに、そのつぶやきが「hi」だったら、「hi」と返す

JavaScriptによる開発:簡単な例

2017/4/14 プロジェクト39

Botkitフレームワーク

ボットの実行( teratermによるサーバ上の作業)

• 実施コマンド• token=xoxb-169493700566-7ev2Ze5xZJPeqHe0GbevIUJ6 node index.js

JavaScriptによる開発:簡単な例

2017/4/14 プロジェクト40

JavaScriptによる開発:軽い応用

2017/4/14 プロジェクト41

何かBotあてにつぶやかれたら、登録してある複数の文言からランダムに選択して返信する

やること

• 複数文言を登録してあるテキストファイル(1行に1文言)を用意

• テキストファイルの行数を読み込み、何行目を呼び出すかをランダムに決める

• 決められた行の文言をメッセージとして返す

JavaScriptによる開発:軽い応用

2017/4/14 プロジェクト42

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 プロジェクト43

// 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 プロジェクト44

Pythonによる開発

2017/4/14 プロジェクト45

slackbotライブラリ

ボットが実行されるフォルダの設定を行う(teratermによるサーバ上の作業)

• 実施コマンド• mkdir <フォルダ名>• cd <フォルダ名>• touch slackbot_settings.py• touch run.py• mkdir plugins• touch plugins/__init__.py

botkitを使うための初期化

Pythonによる開発

2017/4/14 プロジェクト46

slackbotライブラリ

slackbot_settings.pyの編集

API_TOKEN = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

default_reply = “I could not understand that...“

PLUGINS = [‘plugins’,

]

APIトークン

デフォルトのリプライ

teratermで作業

ローカルで作成してWinSCPでアップロード

ボットが実行されるフォルダ

Pythonによる開発

2017/4/14 プロジェクト47

slackbotライブラリ

run.pyの編集

from slackbot.bot import Botdef main():

bot = Bot()bot.run()

if __name__ == "__main__":main()

teratermで作業

ローカルで作成してWinSCPでアップロード

ボットが実行されるフォルダ

Pythonによる開発

2017/4/14 プロジェクト48

slackbotライブラリ

好きなファイル(***.py)の編集

teratermで作業

ローカルで作成してWinSCPでアップロード

ボットが実行されるフォルダの下のpluginフォルダ

Pythonによる開発

2017/4/14 プロジェクト49

slackbotライブラリ

ボットの実行( teratermによるサーバ上の作業)

• 実施コマンド• python run.py

Pythonによる開発:簡単な例

2017/4/14 プロジェクト50

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 プロジェクト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!”とレスする

2017/4/14 プロジェクト52

Pythonによる開発:軽い応用

2017/4/14 プロジェクト53

何かBotあてにつぶやかれたら、登録してある複数の文言からランダムに選択して返信する

やること

• 複数文言を登録してあるテキストファイル(1行に1文言)を用意

• テキストファイルの行数を読み込み、何行目を呼び出すかをランダムに決める

• 決められた行の文言をメッセージとして返す

Pythonによる開発:軽い応用

2017/4/14 プロジェクト54

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 プロジェクト55

そのほか:Hubot、JBot

2017/4/14 プロジェクト56

環境としては準備できてるけど資料準備間に合わず…あとでアップロードします

Botデザイン:考える点

2017/4/14 プロジェクト57

どんな目的で、どんな機能を持たせるか

• 目的• 機能

• こういう入力があったらこう返す• 「こう」に特徴がある場合はそう返す• **時**分になったらこう返す• その他のトリガ

機能はどういう技術要素で持たせるか

• DB(MySQL)を使って…• クラウドサービスを使って画像なんかを取得して…• Wikipediaからその項目を検索して…• 得られたデータから**を**して…

Botデザイン:考える点

2017/4/14 プロジェクト58

完成イメージ

• ボット名称• 動作イメージ

作業項目とメンバー割り当て、線表

次回のプレゼンについて

2017/4/14 プロジェクト59

Botデザインで検討した項目を解説

• 目的、実装する機能• 機能実現のための技術要素• 完成イメージ• 作業項目、割り当て、線表

グループあたりの持ち時間

• 10分

ポイントとなりそうな要素技術

• 外部のリソースの利用

– 外部APIの利用

– 外部データベースの利用

• 他のライブラリの利用

• 正規表現

2017/4/14 プロジェクト60

Recommended