Cloud Functions for Firebase で Slack の scraping bot を作ってみた話(前編)
Firebase には Cloud Functions という便利なものがあります。
これを使って Slack bot を作ってみようと思います。
今回は "yahoo" と #random
channel で発言すると、Yahoo! のトップページに掲載されているニュースを返してくれる bot にします。
- プロジェクトの作成
- Slack 側の設定
- Outgoing Webhooks
- Incoming Webhooks
- 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 として利用します)
- プランは従量制の Blaze にしておく
- Spark だと外部へのリクエストを投げられない模様
- こちらでプランの内容を確認できる
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 の #random
で yahoo
と発言すると incoming-webhook が 「yahoo」
と返してくるようになりました。
ローカルでの動作確認方法 #
動作確認の度にデプロイするのは辛いので、ローカルで確認したくなります。
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 // などなど
これでデバッグがずいぶんやりやすくなります。
長くなってきたのでスクレイピングの話はまた別で。。(書きました)