35
31

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

日本の祝日 API を使って Slack に祝日の情報を通知しよう

Last updated at Posted at 2022-03-16

:warning: 重要なお知らせ :warning:

この記事で紹介しているワークフロービルダーの拡張方法は非推奨となり、2024 年後半に廃止予定です。同じような実装は、新しいワークフロービルダーでも実装可能ですが、TypeScript + Deno で書き直す必要があります。詳細は以下のドキュメント(英語)を参考にしてください。

日本の祝日 API!!!

ケンオールというサービスから「日本の祝日 API」という新しい Web API が公開されました。以下の通り、Twitter 上でも大変話題になっていますね!

この API の詳細についてはケンオールが公開している以下の情報をご参照ください。

Slack と連携させてみよう

この API を使った Slack アプリをすきま時間でサクッとつくってみました。シンプルですが、なかなか実用的なアプリになっているのではないか?と思っています。

以下の GitHub リポジトリでコードを公開しています。どうぞ自由にカスタマイズしてご利用ください!

それでは、アプリの紹介をしていきます。

アプリの概要と使い方

改めて、この記事で紹介するアプリは、ケンオールが提供する「日本の祝日 API」を使って Slack チャンネル内で祝日の情報を共有してくれるアプリです。

以下の通り、二つの使い方があります。

  • ワークフロービルダーで定期実行してチャンネルに事前通知
  • ボットをメンションして次の祝日を教えてもらう

それでは、順に説明していきます。

ワークフロービルダーで定期実行してチャンネルに事前通知

以下のスクリーンショットのようなとてもシンプルなワークフローをつくってください。export したものが jp-holidays-workflow.json として、先ほど共有した GitHub リポジトリに置いてありますので、それを参考にしていただいても OK です(ただし、アプリのステップの部分はご自身のものに置き換えてください)。

ステップの設定は以下のように通知先のチャンネル(現在の実装ではパブリックチャンネルのみ、複数指定可能)を指定した上で、何日前に知りたいかを指定します。

例えば 3/16 の時点で 3/21 の春分の日を通知してほしい場合は 5 日前に設定します。

こうすることで、以下の様な通知が指定したチャンネルに届きます。こだわりポイント(?)は Wikipedia の URL をリンクしているところですね。

もしこの通知タイミングなどの設定をチャンネルごとに分けたい場合、ワークフローを複数作ってください。このアプリを複数のワークフローから呼び出すことも全く問題ありません。

ボットをメンションして次の祝日を知る

「最近、祝日がない気がするなぁ・・次の連休はいつだろう・・」

そんな気持ちになったときは、このアプリのボットをメンションしてみてください。

次に来る祝日を教えてくれますので、気持ちが明るくなるかもしれません(逆かも?)。

ということで、地味に便利なアプリではないかと思ってたりするのですが、いかがでしょうか?

アプリの動かし方

どういうアプリかわかったところで、次は GitHub にあるコードを動かす手順について紹介していきます。

このアプリは Bolt for Python で実装されたシンプルな Python アプリケーションです。

Slack のサーバーにソケットモードという WebSocket のコネクション経由で接続します。このアプリに限らないソケットモードの一般的なはじめ方については、以下の記事も参考にしてみてください。

まずは手元で動かしてみましょう。

ケンオールの API トークンの取得

まずはじめにケンオールの API トークンを取得して環境変数に設定してください。

# https://kenall.jp/home で入手してください
export KENALL_API_TOKEN=

Slack アプリ設定 & ワークスペースにインストール

次に、新しい Slack アプリの設定を https://api.slack.com/apps から作成してください。アプリをつくるときに、GitHub リポジトリにある app-manifest.yml の内容を流用すると簡単に設定することができます。

アプリ設定が作られたら Settings > Basic Information > App-Level Tokens のセクションから connections:write のスコープが付与されたトークンを作成してください。それを SLACK_APP_TOKEN として環境変数に設定します。

# https://api.slack.com/apps の Basic Information で App-Level Token を生成して入手してください
export SLACK_APP_TOKEN=xapp-

次にアプリを Settings > Install App からワークスペースにインストールして発行されたトークンを SLACK_BOT_TOKEN として設定してください。

# Slack ワークスペースにアプリをインストールして入手してください
export SLACK_BOT_TOKEN=xoxb-

アプリの初期化と起動

その上で Python のプロジェクトを設定します。

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

か、もし Poetry に馴染みがあるなら

poetry shell && poetry update

でプロジェクトをセットアップした上で、以下のコマンドでアプリを起動してみてください。特にエラーメッセージが出なければ大丈夫でしょう。

python app.py

ワークスペース内で設定

この状態であればワークフロービルダーの設定画面でステップを選択できる様になっているはずです。
「使い方」のパートを参考に設定してみてください。

ボットをメンションする使い方をしたい場合は、ボットをチャンネルに招待して話しかけてみてください。

デプロイして運用するには?

Heroku などの環境で動かすのが簡単かもしれません。 デプロイボタンを置いておきますね。
Deploy
なお、ソケットモードはただ WebSocket のクライアントプロセスが起動するだけなので、Heroku で動かす場合は Procfile を web ではなく worker で設定するのがよいかと思います。

もし "We couldn't deploy your app because the source code violates the Salesforce Acceptable Use and External-Facing Services Policy." というエラーで上記の Deploy ボタンが動作しない場合は、このリポジトリを fork した上で https://heroku.com/deploy?template=https://github.com/{your GitHub account here}/jp-holidays-for-slack/tree/main を指定してデプロイしてみてください。

また GitHub リポジトリに Dockerfile も置いておきますので、コンテナサービスで動かす場合は、そちらを利用されてもよいかと思います。

最後に

ということで、ケンオールの新しい API である「日本の祝日 API」を使った Slack アプリをご紹介しました。

そういえば、郵便番号の API の方も Slack 連携の実装例をご紹介していました(Twitter 上だけでの告知でしたが)。もしご興味あれば、こちらもぜひご覧ください!

それでは :wave:

35
31
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
31

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?