ぼくのインターネッツ

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

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

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

  1. プロジェクトの作成
  2. Slack 側の設定
  1. 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

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

おうむ返しさせてみる #

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 // などなど

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


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