イノベーション エンジニアブログ


株式会社イノベーションのエンジニアたちの技術系ブログです。ITトレンド・List Finderの開発をベースに、業務外での技術研究などもブログとして発信していってます!


このエントリーをはてなブックマークに追加

PhantomJS × Raspberry PiでBotを作る(前編)

こんにちは、最近腕の長さを測ってみたら196cmだった小柳津です。
2年前くらいに測ったときは192cmでしたが、伸びていました!

前回のブログでは、Raspberry Pi 3 Model B(以下、Raspberry Pi)にPhantomJSをインストールしました。
http://tech.innovation.co.jp/2017/05/16/Phantom-J-S-on-Raspberry-Pi-3.html

今回はそのRaspberry Piを使って、
Slack上で動き、PhantomJSでスクレイピングした結果を返してくれるBotを作成したので、そちらをご紹介します!

Botの概要

今回Botを作るにあたっての用意は以下です。

  1. Raspberry Pi側の準備

    • PhantomJSのインストール(前回ブログで済)

    • Node.jsのインストール

    • Hubotのインストールとセットアップ

  2. Slack側の準備

    • アクセストークンの取得

    • Botの登録

PhantomJSのインストールは済んでいるので、飛ばしていこうと思います。

以下の画像は、Botの構成と動作フローのイメージ図です。

Slack監視〜スクレイピング実行まで

bot images01.png

スクレイピング結果取得〜メッセージ送信まで

bot images02.png

イメージ図に沿って、弊社が使っているグループウェアから自分の予定をスクレイピングして、
Slackに送信するBotを作っていきたいと思います。

schedule 01.png

※実際のBotの動き
今日の予定は?と聞くと、グループウェアをスクレイピングして予定を教えてくれる。

Amazon EC2 やGoogle Compute Engineなどのクラウドサーバでも同じようなものが作れますが、
以下の理由からRaspberry Piを使用しました。

  1. Bot化するのに問題ない性能を持っている

  2. 安価な値段で、かつ買い切りでサーバとして使用できる

  3. せっかく買ったので使いたい

Raspberry Pi側の準備

それでは早速Raspberry Pi側で必要な準備していきます。
Raspberry Piにssh接続しましょう。

Node.jsのインストール

Slackを監視するためのHubotにはNode.jsが必要なので、インストールをしていきます。

#npmのインストールとアップデート
$ sudo apt-get install npm
$ sudo npm install -g npm

#Node.jsのバージョン管理である`n`をインストール
$ sudo npm install -g n

#Node.jsの安定版をインストール
$ n stable

上記のコマンドでNode.jsをインストール出来ます。

Hubotのインストールとセットアップ

Node.jsがインストールできたところでHubotのインストールとセットアップを行います。

公式ドキュメントに従って行っていきます。

#必要なモジュールをインストール
$ sudo npm install -g yo generator-Hubot coffee-script

#Bot用のディレクトリを作成し、その中にBotを作成(ディレクトリ名は好きな名前で大丈夫です!)
$ mkdir myHubot
$ cd myHubot
$ yo Hubot

そうすると以下のことを聞かれますので、それぞれ適当な返答をします。

? ==========================================================================
We're constantly looking for ways to make yo better!
May we anonymously report usage statistics to improve the tool over time?
More info: https://github.com/yeoman/insight & http://yeoman.io
========================================================================== (Y/n)

#Yと返答
? Owner
? Bot name
? Description A simple helpful robot for your Company
? Bot adapter

#名前とメールアドレス
#付けたいBot名
#任意
#slackと返答

上記のように返答すると、

Procfile        bin         Hubot-scripts.json  package-lock.json   scripts
README.md       external-scripts.json   node_modules        package.json

Bot用のディレクトリの中身がこうなるはずです。

Slack側の準備

Slack側にも準備をしていきます。

まずSlackのチームにログインし、Hubotのintegrationを追加します。
追加するとHUBOT_SLACK_TOKENが発行されるので、それを控えておきます。

slack 01.png

Apps & integretionsから遷移出来ます。

slack 02.png
slack 03.png

Botの設定

再びRaspberry Piに戻ります。
控えていたHUBOT_SLACK_TOKENbin/Hubotのファイルに追加します。

#!/bin/sh

set -e

npm install
export PATH="node_modules/.bin:node_modules/Hubot/node_modules/.bin:$PATH"
#この下に追加
export HUBOT_SLACK_TOKEN={控えていたHUBOT_SLACK_TOKEN}

また、scriptのディレクトリにhello.coffeeを作成します。
hello.coffeeの中身は以下です。

module.exports = (robot) ->
    robot.hear /^hello$/i, (msg) ->
        msg.send "hello!"

ファイルを作成した状態からBotを作成したディレクトリで、
Hubotの起動コマンドbin/Hubot -a slackを実行。
そして、Slackでhelloと送ってみます!

hello.png

helloと返してきました!
Hubotでは正規表現でマッチしたワードがSlack上に見受けられると、特定のメッセージが返せます。

これを利用して冒頭の予定を教えてくれるBotを作っていきます。
設定は以下。

module.exports = (robot) ->
    robot.hear /今日の予定は?$/, (msg) ->
        @exec = require('child_process').exec
        command = "phantomjs {ファイルの実行パス}/schedule.js"
        @exec command, (error, stdout, stderr) ->
            msg.send stdout

特定のメッセージを返すだけでなくコマンドを実行してその結果を返すことができます。
今日の予定は?と聞かれたら予定をスクレイピングして取得するschdule.jsをPhantomJSで実行し、
その結果をSlackに返すことでBotの完成です!

スクレイピングしたいものを増やして、Slackに返すメッセージのバリエーションも増やしていく予定です!

後編はPhantomJSでスクレイピングする方法やRaspberry Piを起動した時にHubotも自動的に起動させる設定などをご紹介します。

今回はここで失礼します。