CloudFunctions+SlackAPIを使って定期的にユーザ数を通知できるように自動化してみた

最近、[作ったWebサービス](https://tsundoku.site)で手動でユーザ数などのデータを取得していたけど、
めんどくさくなったので、いまさらながらSlackAPIを使ってみた。

## こんな感じで通知されます！

ユーザ数とか登録データ数とかを通知♪
いまは毎日0:00に通知するようにしているので、毎日たのしみ(*´ω｀*)

<img width="535" alt="スクリーンショット 2019-08-28 16.46.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/d0af6b44-cc9c-e3b7-afc8-6c3d616d3038.png">


## 全体の流れ

全体の流れはこんな感じ

1. Slack APIで**Slack App**を作成
2. 作成したAppで**Incoming Webhooks**を有効にする
3. Incoming Webhooksに**Webhook URL**を追加する
4. 取得したWebhook URLを使ってFunctionsからメッセージを送る


### 1. Slack APIでSlack Appを作成

まずは、「 https://api.slack.com/apps 」にアクセス

<img width="800px" alt="スクリーンショット_2019-08-28_15_42_59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/5648c760-d1f2-c934-3c55-866e6fb1cb0f.png">

「Create New App」をクリックすると、作成ダイアログが表示されるので、
アプリ名を入力して、「Create App」をクリック

<img width="428" alt="スクリーンショット_2019-08-28_15_46_27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/1b38367b-7a5c-4c22-7e35-0f94c643b8fa.png">

これでSlack Appが作成できた(*´ω｀*)

### 2. 作成したAppでIncoming Webhooksを有効にする

Web APIでメッセージを投稿できるように設定するために、
作成したAppのSettingsのBasic Infomarionにある「Incoming Webhooks」を有効にする

<img width="718" alt="スクリーンショット_2019-08-28_15_46_58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/2b926c23-de70-3d7c-0bbc-6577b288fd8a.png">

クリックするとこんな感じ。デフォルトはOFFなので、ONに切り替える。

<img width="748" alt="スクリーンショット_2019-08-28_15_47_11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/36688dc6-3ca7-0c66-a839-9d482354c132.png">

これで有効になった(*´ω｀*)

### 3. Incoming WebhooksにWebhook URLを追加する

有効にしたので、どのチャネルに通知するかを設定していく

有効すると、下の方に「Add New Webhook to Workspace」があるので、それをクリック

<img width="714" alt="スクリーンショット_2019-08-28_15_47_38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/b0288e59-47c9-9c06-1d18-8f729eefbf67.png">

クリックすると、チャネルの選択画面が出るので、投稿先を設定して、「許可する」をクリック。
投稿先はチャネルだけじゃなく、個人宛も設定できます(*´ω｀*)
<img width="360" alt="スクリーンショット 2019-08-28 15.48.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/d2cb445a-b787-5ec6-3214-c9bceb731c4c.png">

許可すると、こんな感じの画面に。
WebhookURLが追加されるので、「Copy」を押して、コピーしておく
<img width="712" alt="スクリーンショット_2019-08-28_15_48_39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/f51efaa9-c8e5-1e24-69f4-a63f799796ee.png">

### 4. 取得したWebhook URLを使ってFunctionsからメッセージを送る

取得したWebhookURL宛にメッセージを送ればOK

#### CloudFunctionsのコードはこんな感じ。

```javascript
const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();

/**
 * Slackにメッセージ(text)を送る関数
 */
const axios = require("axios");
async function sendSlack(text) {
  const webhookURL = "https://YOUR_WEBHOOK_URL";
  const param = { text: text };
  const headers = { "Content-Type": "application/x-www-form-urlencoded" };
  try {
    await axios.post(webhookURL, param, { headers: headers });
  } catch (error) {
    console.error(`Error occuered in sendSlack: ${error}`, error);
  }
}

/**
 *  Slackへの通知を定期実行するFuncitons
 */
exports.slackNotify = functions.pubsub
  .schedule("0 0 * * *")
  .timeZone("Asia/Tokyo")
  .onRun(async context => {

    // Slack通知
    await sendSlack("こんにちは");
  });
```

`sendSlack(text)`の`webhookURL`に、
上でコピーしたWebhook URLをはりつけてください。
こんな感じで「こんにちは」される(*´ω｀*)

<img width="536" alt="スクリーンショット 2019-08-28 16.58.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/2efce0de-20f4-821b-526b-ee6375f938f1.png">

あとは、Function内でFirestoreとかを呼び出して、データを収集・集計すればOKヽ(=´▽`=)ﾉ

メッセージ送るだけならすごく簡単(*´ω｀*)

### ほかにもいろいろ

ほかにもパラメタを変えれば、色を変えたり、画像を送れたりできるよう！！
- [SlackのIncoming Webhooksを使い倒す - Qiita](https://qiita.com/ik-fib/items/b4a502d173a22b3947a0)

公式ドキュメントだとこちら
- [Incoming Webhooks | Slack](https://api.slack.com/incoming-webhooks)

また、こちらの記事でも書いたようにジョブの無料枠は、**Googleアカウントごと**...
遊びやテスト用にいくつも作ると課金されはじめるので注意が必要です...
- [Cloud Functions for Firebaseのcronみたいな定期実行を試したら簡単だった - Qiita](https://qiita.com/kira_puka/items/1f164dd8d1a5a281d9c1)

以上!!


## こんなのつくってます！！

最近、積読用の読書管理アプリ「積読ハウマッチ」をリリースしました！
[積読ハウマッチ](https://tsundoku.site)は、Nuxt.js+Firebaseで開発してます!

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/572d4947-f40b-e4dc-1c9c-bc584cd2a66c.png" width="25%"/>

もしよかったら、遊んでみてくださいヽ(=´▽`=)ﾉ

要望・感想・アドバイスなどあれば、
公式アカウント([@MemoryLoverz](https://twitter.com/MemoryLoverz))や開発者([@kira_puka](https://twitter.com/kira_puka))まで〜