メインコンテンツまでスキップ

Next API Routes + Vercel Cron Jobs でSlackに定期的にリマインドを送ってくれるbotを作成する

· 約5分
森田 有貴

唐突ですが皆様Slackはお使いでしょうか?Slack便利ですよね。私は業務のコミュニケーションは基本Slackで行っています。

このSlackで定期的にリマインドを送ってくれる機能があったら便利だと思いませんか?例えば朝の業務前に昨日やったことを送ってくれたりだとか、今日の会議の一覧を送ってくれたりなどなど...

というわけでNextjsのApi RoutesとVercelのCron Jobsを用いて簡単に実装できたので、ご紹介いたします。

warn

今回はすでにNextjsをVercelにデプロイしていることを前提とします。


Slack Api Appの準備

まずSlackのApiを利用してリマインドを送ってくれるアプリを作成します。

こちらにアクセス -> Your Apps - Slack API

Create New Appをクリック image2

From scratchをクリック image3

ここでリマインドを送ってくれるbotの名前とそのbotを使うワークスペースを設定できます。 botの名前は後からでも変更です。 image7

続いてOAuth & Permissionsからbotの権限を設定しましょう。 今回の場合はchat:writeim:writeを設定しておけば十分です。 image5

App HomeからDefault usernameを設定しておきます。 こちらを設定しないとワークスペースにインストールできないみたいです。 image8

もろもろの設定が完了したらInstallAppからワークスペースにアプリをインストールしましょう。 image6

許可するをクリック image9

これでSlackの方の設定は完了です!

OAuth & Permissionsからトークンを取得しておきましょう。

image12


Nextjs Api RoutesからSlack Apiを叩いてメッセージを送る

まず自分のslackのuser idを取得します。

左下のアイコンからプロフィールを表示 image15

三点リーダーボタンから「メンバーIDをコピー」をクリック image16 これで取得完了です。

環境変数を設定しておきましょう。

/sample-app
touch .env.local

先ほどSlack Apiで取得したトークンとuser idを貼り付けます。

/sample-app/.env.local
SLACK_BOT_TOKEN=
SLACK_CHANNEL_ID=

続いて定期実行するapiにSlackのApiを叩いてメッセージを送る機能を作成します。

/src/app/api/cron/route.ts
import { NextResponse } from "next/server";

export async function GET(request: Request) {
const slackToken = process.env.SLACK_BOT_TOKEN;

const response = await fetch("https://slack.com/api/chat.postMessage", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${slackToken}`,
},
body: JSON.stringify({
channel: process.env.SLACK_CHANNEL_ID,
text: "hoge",
}),
});

if (response.ok) {
return NextResponse.json({ message: "Success" });
} else {
return NextResponse.json({ message: "Failed" });
}
}

これで/api/cronを叩くとメッセージが飛んでくるようになります image13

結構簡単ですね


VercelのCron Jobsの設定

最後に定期実行の設定をします。 まずvercel.jsonを作成します。

/sample-app
touch vercel.json

作成したvercel.jsonに定期実行するapiのサブディレクトリと実行タイミングを設定します。 今回は毎日UTSで0時(JST9時)に実行されるように設定しました。

/sample-app/verce.json
{
"crons": [
{
"path": "/api/cron",
"schedule": "0 0 * * *"
}
]
}

こちらを設定してデプロイするとVercelのSettingsのCron Jobsに設定が反映されると思います。 image17

あとは次の日の朝9時まで待つだけです。


おわり

というわけでNextjsをVercelでSlackから定期的にリマインドを送ってくれる機能を作成しました。

ちなみに私は「次のMTGの3日前になったら前回のMTGの内容をリマインドしてくれる」という機能を作成する際に使いました。

使い方次第でもっと便利な機能が作れそうな気がしますね。

おしまい。