SlackとGASを使ってヨーダの名言を自動返答するbot

チャットツールSlackと、GAS(Google Apps Script)を使って、特定のキーワードに反応してジェダイの師ヨーダがメッセージを返してくれるBotを作ってみた。息抜きや人生に迷った時にメッセージを賜りたいと思う。

使うのはSlack、Googleスプレッドシート、Google Apps Script(GAS)の3つ。もちろん全て無料。

1. Slack側の準備

SlackからGASにトリガーを送信する準備をする。

Outgoing WebHooksの設定

  • メニュー > Apps & Integrations
    slack webhook select image
  • Outgoing WebHooksをインストールしてSettingsページに移る
    slack webhook setting image
  • Channel = とりあえず #general を選ぶ
  • Trigger Word(s) = どの言葉でヨーダを呼び出すかの設定
    ※あえてたまに使われそうなワードをトリガーにしておいて、予期せぬ時にヨーダが出てきても面白い(頻度が多いとうざがられる)
  • URL(s) = ひとまず空欄。後で公開したGASサーバーのURLを入力する
  • 上記以外は空欄でOKなので、Save Settings する

SkackのAPI Toakenを発行する

  • Slack Authentificationにアクセス
  • ページ下部の Generate test token をクリック
  • Test token generator のページで Create token をクリック
    slack webhook setting image

2. ヨーダの名言を準備する

以下、今回のために準備した名言集 By マスター・ヨーダ。
英語かつ抽象的な言い回しなので、人生の真理のようなものが潜んでいる気がする。

  • No! Try not. Do. Or do not. There is no try.
  • May the Force be with you.
  • Death is a natural part of life.
  • Use the force. Feel it.
  • Great warrior? Wars not make one great.
  • Here, between you... me... the tree... the rock... everywhere!
  • You must unlearn what you have learned.
  • Truly wonderful the mind of a child is.
  • Judge me by my size, do you?
  • No different. Only different in your mind.
  • Always with you it cannot be done.
  • Luminous beings are we, not this crude matter.
  • Too sure of themselves they are.
  • A Jedi uses the Force for knowledge and defense, never for attack.
  • You will know, when you are calm, at peace, passive.

スプレッドシートを新規作成し、A列のセルに貼り付ける。
※ランダムで毎回1つの名言を抽出するために、B列は空欄にしておく
google spreadsheet word list

3. Google Apps Script (GAS)でスクリプトを書く

先ほどのスプレッドシートの
ツール > スクリプトエディタ
を開く

ソースコードを書く

まず全スプリプト。結構短く済む。

function doPost(y) { var token = PropertiesService.getScriptProperties().getProperty("xoxp-abcd"); var name = "Yoda - Master BOT"; var icon = "https://dl.dropboxusercontent.com/u/9957528/icons/yoda.png"; var app = SlackApp.create(token); var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var sheet = spreadsheet.getSheetByName('シート1'); var range = sheet.getRange("シート1!B1").setFormula('=INDIRECT("シート1!A:A" & INT(RAND()*15+1))'); var message = sheet.getRange("シート1!B1").getValue(); return app.postMessage("#general", message, { username: name, icon_url: icon }); }

一応書くと

  • doPost はGoogle側が用意してくれた関数。
  • token = getProperty()の中に、先ほどSlackで取得したアクセストークンを書く。クォーテーションで囲むのを忘れない
  • name = slackに投稿したユーザー名(任意)
  • icon = 表示したいアイコン画像のURL(任意)
  • spreadsheet = 現在使用中のスプレッドシートを自動取得
  • sheet = どのシートを使うかの指定
  • range = setFormulaで15の名言の中から今回吐き出す名言をランダムで1つ選び出し、B1に記入している。15はセルの数。
  • message = rangeで入力された値を抽出している

GASにSlackライブラリをインストール

GAS側でSlackにポストするライブラリを導入する

  • リソース > ライブラリ
  • ライブラリでSlackの下記ライブラリキーを検索
    M3W5Ut3Q39AaIwLquryEPMwV62A3znfOO
  • SlackAppのデベロッパーモードを「有効」にする
  • バージョンは最新のものを選ぶ
  • 保存して閉じる
    google spreadsheet word list

4. スクリプトをWEBアプリとして公開する

今回は定期ではなくslackからのリクエストに応じて都度botを起動するので、Webサーバーとして公開されている必要がある。GASなら無料。素晴らしい。

  • 公開 > ウェブアプリケーションとして導入
  • プロジェクトバージョン = 版の管理。編集するたびに版も変えるのが無難。
  • アプリケーションにアクセスできるユーザー = 全員 にする
  • 更新する
  • 初回のみ認証許可を尋ねられるので、許可。
    google spreadsheet word list

5. Slackから呼び出してみる

準備が整ったので、Slackの #general で「Yoda:」と入力してみる。

google spreadsheet word list
成功した。何度か試してみると毎回ランダムな名言が返される。



個人的にスターウォーズが好きなのでヨーダを登場させてみたけど、担当者やチームの好みによって、 アイアンマンでもポケモンでもなんでも可。

遊び心がわからないおっさんのいるチャットでは無論使ってはいけない。

[data-hatena-bookmark-layout="standard-noballoon" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"] img [src="https://b.st-hatena.com/images/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;"]