私の研究室ではSlackで出席確認システムが作られていて、「おは」とメッセージを投稿すると投稿時間で出席認証と「おはようございます」と返事が返ってくる。
このシステムはincoming-webhookで作られていて、アプリとして動作する。
今回、毎日「おは」というメッセージを決まった時間に自動で投稿するシステムが作れたらいいなと思ったため、開発に取り組んだ。
##1. アプリケーションの管理画面を開く
まず、ワークスペースのアカウントにログインし、アプリケーションの管理画面を開く。
スタッフのおすすめでincoming-webhookと検索し、アプリケーションを選択する。
下の図のようなページに移動するので、Slackに追加ボタンを押す。
システムを導入したいチャンネルを指定し、下の図の緑のボタンをクリックする。
セットアップの手順により、Webhook URL が得られる。
これがSlackの投稿機能APIなので、メモして控えておく。
##2. アイコンと名前の設定を行う
画面を下にスクロールしていくと、アイコンと名前の設定ができるため任意で行う。
##3. シェルスクリプトによってコマンドを動かし投稿する
ターミナルからシェルスクリプトを作成する。
コードは以下の通り。
curl -X POST --data-urlencode "payload={\"channel\": \"#timesheets\", \"text\": \"おは\"}" https://hooks.slack.com/services/XXXXXX(メモしたURL)
デフォルトで用意されているのは、以下のコードである。
これは設定したアイコンをお化けで上書きしていて、名前も上書きされているため、上記のコードのように不要な部分は削除した。
# curl -X POST --data-urlencode "payload={\"channel\": \"#timesheets\", \"username\": \"webhookbot\", \"text\": \"これは webhookbot という名のボットから #timesheets に投稿されています。\", \"icon_emoji\": \":ghost:\"}" https://hooks.slack.com/services/XXXXX
このシェルスクリプトに実行権限を与え、実行させると登録したチャンネルでアプリが「おは」と投稿することが確認できる。
$ chmod u+x xxxx.sh
$ ./xxxx.sh
##4. 自動化
2020/09/10 更新
「おは」のメッセージを送るxxxx.sh(xxxxは任意)をcrontabコマンドによって自動実行させる。
少々手こずったため、うまくいかなかった原因と解決方法についても載せる。
crontabファイルには、指定した日時に実行するコマンドやスクリプトを記入する。
ファイル編集は$ crontab -e
のオプション: -e で行う。
(直接ファイル /var/spool/cron/crontabs/user に書いてはいけない。)
$ crontab -e
でファイルを開き、最後の行に日時とコマンドまたはシェルスクリプトの設定を行う。
crontabの書式は、「分」「時」「日」「月」「曜日」「コマンド」を半角スペースで区切って指定する。行頭に「#」が記載された行はコメントとなる。
# コメント
分 時 日 月 曜日 コマンドやスクリプト
例として、~/bin/ 内にあるxxxx.shというシェルスクリプトを1分ごとに実行する記入方法を以下に記述する。
* * * * * sh ~/bin/xxxx.sh
「*」はワイルドカードで全てを意味する。
このとき、xxxx.shに実行権限が与えられていない場合実行されないため、権限を与える。
↓これでもよい。
* * * * * sh +x ~/bin/xxxx.sh
このとき、注意点がある。
これでファイルに書き込みをしてもエラーが発生した。
エラーは new crontab file is missing newline before EOF, can't install. というものである。
意味は保存前のcrontabファイルと書き込みをしたファイルと比べて、書き込みをしたファイルの記述方法が間違っているということだと思われる。
解決方法を探したところ、最後に改行が必要だということが分かったため、
* * * * * sh ~/bin/xxxx.sh
(改行)
と一文改行を行ったらうまく毎分メッセージを送ることができた。
#まとめ
以上の手順でslackにメッセージを自動送信することができた。
このcrontabファイルはサーバーに置いておく。
また、8時に「おは」と送信されるようにcrontabファイルも編集する。
しかし、slackで「おは」といったら「おはようございます」と返すシステムはメンバー管理で承認されていないと反応しないため、このアプリで「おは」といっても反応してくれなかった。
crontabのいい勉強になったし、また別の活用を考えてみようと思う。