唐突ですが皆様Slackはお使いでしょうか?Slack便利ですよね。私は業務のコミュニケーションは基本Slackで行っています。
このSlackで定期的にリマインドを送ってくれる機能があったら便利だと思いませんか?例えば朝の業務前に昨日やったことを送ってくれたりだとか、今日の会議の一覧を送ってくれたりなどなど...
というわけでNextjsのApi RoutesとVercelのCron Jobsを用いて簡単に実装できたので、ご紹介いたします。
今回はすでにNextjsをVercelにデプロイしていることを前提とします。
Slack Api Appの準備
まずSlackのApiを利用してリマインドを送ってくれるアプリを作成します。
こちらにアクセス -> Your Apps - Slack API
Create New Appをクリック
From scratchをクリック
ここでリマインドを送ってくれるbotの名前とそのbotを使うワークスペースを設定できます。
botの名前は後からでも変更です。
続いてOAuth & Permissionsからbotの権限を設定しましょう。
今回の場合はchat:write
とim:write
を設定しておけば十分です。
App HomeからDefault usernameを設定しておきます。
こちらを設定しないとワークスペースにインストールできないみたいです。
もろもろの設定が完了したらInstallAppからワークスペースにアプリをインストールしましょう。
許可するをクリック
これでSlackの方の設定は完了です!
OAuth & Permissionsからトークンを取得しておきましょう。
Nextjs Api RoutesからSlack Apiを叩いてメッセージを送る
まず自分のslackのuser idを取得します。
左下のアイコンからプロフィールを表示
三点リーダーボタンから「メンバーIDをコピー」をクリック
これで取得完了です。
環境変数を設定しておきましょう。
touch .env.local
先ほどSlack Apiで取得したトークンとuser idを貼り付けます。
SLACK_BOT_TOKEN=
SLACK_CHANNEL_ID=
続いて定期実行するapiにSlackのApiを叩いてメッセージを送る機能を作成します。
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
を叩くとメッセージが飛んでくるようになります
結構簡単ですね
VercelのCron Jobsの設定
最後に定期実行の設定をします。 まずvercel.jsonを作成します。
touch vercel.json
作成したvercel.jsonに定期実行するapiのサブディレクトリと実行タイミングを設定します。 今回は毎日UTSで0時(JST9時)に実行されるように設定しました。
{
"crons": [
{
"path": "/api/cron",
"schedule": "0 0 * * *"
}
]
}
こちらを設定してデプロイするとVercelのSettingsのCron Jobsに設定が反映されると思います。
あとは次の日の朝9時まで待つだけです。
おわり
というわけでNextjsをVercelでSlackから定期的にリマインドを送ってくれる機能を作成しました。
ちなみに私は「次のMTGの3日前になったら前回のMTGの内容をリマインドしてくれる」という機能を作成する際に使いました。
使い方次第でもっと便利な機能が作れそうな気がしますね。
おしまい。