August 1, 2017

Cloud Functions for Firebase で Slack の scraping bot を作ってみた話(前編)

Firebase には Cloud Functions という便利なものがあります。

これを使って Slack bot を作ってみようと思います。 今回は “yahoo” と #random channel で発言すると、Yahoo! のトップページに掲載されているニュースを返してくれる bot にします。

  1. プロジェクトの作成
  2. Slack 側の設定
    • Outgoing Webhooks
    • Incoming Webhooks
  3. Cloud Functions 作成

という流れ。

1. プロジェクトの作成

Firebase console からプロジェクトを追加し、ターミナルで Cloud Function の雛形をローカルに作ります。

mkdir ScrapingBot && cd $_
firebase login
// ブラウザで Google アカウントログイン
firebase init
// Functions にチェックを入れて Enter
// さっき作ったプロジェクトを選択して Enter
// "Do you want to install dependencies with npm now?" と聞かれるので Y で Enter

functions/index.js を以下の内容に書き換えます。

// functions/index.js

const functions = require('firebase-functions');
exports.bot = functions.https.onRequest((request, response) => {
  response.send("Hello bot");
});

いったんデプロイ。

firebase deploy --only functions
// エンドポイントが示される

ブラウザで URL を開いてみると “Hello bot” が表示されます。 (ここで表示されるエンドポイントは後で Slack の Outgoing Webhooks の URL として利用します)

2. Slack 側の設定

Outgoing Webhooks

Slack の Outgoing Webhook を以下の内容で設定します。

項目 備考
Channel #random 今回は #random でだけキーワードを拾う
Trigger yahoo 拾ってほしいキーワード
URL (deploy 後に示された URL)

Incoming Webhooks

Slack の Incoming Webhook を以下の内容で設定します。

項目 備考
Channel #random bot は #random に投稿する

Webhook URL をコピーしておきます。

3. Cloud Functions 作成

環境変数(slack.webhook_url)を設定しておく

firebase functions:config:set slack.webhook_url="https://hooks.slack.com/services/xxx..."
firebase functions:config:get

でちゃんと設定されたか確認できます。

おうむ返しさせてみる

  • #random で “yahoo” と発言したら “「yahoo」” と返すようにする
    • “yahoo” のまま返すとループされるので、、

index.js を編集します。
(Cloud Functions のサンプルがたくさん用意してあるので参考にするとよい -> firebase/functions-samples: Collection of sample apps showcasing popular use cases using Cloud Functions for Firebase)

// functions/index.js

const functions = require('firebase-functions')
const rp = require('request-promise')

exports.bot = functions.https.onRequest((request, response) => {
  const text = request.body.text
  if (text !== 'yahoo') {
    return response.status(200).send('nothing to do')
  }
  rp.post({
    uri: functions.config().slack.webhook_url,
    body: {
      text: `「${text}」`
    },
    json: true
  }).then(() => {
    return response.end()
  }).catch(err => {
    console.error(err)
    return response.status(500).send('Something went wrong while posting the message to Slack.')
  })
})

必要なモジュールを入れてデプロイします。

cd functions
npm install --save request
npm install --save request-promise
cd ..
firebase deploy --only functions

Slack の #randomyahoo と発言すると incoming-webhook が 「yahoo」 と返してくるようになりました。

Slack のキャプチャ

ローカルでの動作確認方法

動作確認の度にデプロイするのは辛いので、ローカルで確認したくなります。

cd functions
firebase functions:config:get > .runtimeconfig.json
npm install --save firebase-functions
npm install -g firebase-tools
firebase serve --only functions
http POST :5002/scrapingbot-xxxxx/us-central1/bot text=yahoo // などなど

これでデバッグがずいぶんやりやすくなります。


長くなってきたのでスクレイピングの話はまた別で。。(書きました)

© kyokutyo 2017