スクリーンショット_2018-05-20_19

Slackで毎週、会議の出席確認をするbotを作ってみた

(2020年4月7日追記)ただリマインダーを設定するだけならSlackのコマンドでできました。(参照)この記事ではメッセージの中に自動でミーティングの日時を入力したい!という方法を書いています。ただし、現在のところ自分のPCを閉じると動かなくなってしまうようです。PCをずっと開いたままにしている私のような人なら使えますが、完全ではありません。解決案を模索中です。

Slack使ってると、週次ミーティングの出欠とる機会ありませんか? 毎週リーダーが手動でやってて面倒そうだな、と思ったので作ってみました。WebHook(Slack API), PHP, cronを使えばWebとphpが使えるターミナル(コマンドプロンプト)があれば簡単に作れます。(すみませんがphpの導入の仕方は書いてません・・・)

はじめに言っておきますが私はphpもcronにも詳しくないです。ほぼコピペで作りました。何もわからなくてもコピペだけで作れるように書いていくつもりです。

主に参考にしたのは以下のページです。


1. Slack APIの設定

まず以下のページに飛びます。

Create New Appsを押し、botの名前(なんでもいい)とbotを流すワークスペースを選択します。

画像1

Incoming Webhooksを押し、Activeにします。

画像2

画像3

スライドボタンをOnにすると下に設定が出てきます。

画像4

Add New Webhook to Workspaceを押します。すると以下のような画面になります。

botを流したいチャンネルを選んで「許可する」をクリックします。

画像5

Webhook URLが表示されます。あとで使うのでブラウザは開いたままにしておきます。

画像6


2. PHPでメッセージの自動送信プログラムを作る

この先が、はじめに貼ったリンクのページに書いてなかったので苦戦しました。

まずターミナルを開きます。適当に「meeting_bot.php」というファイルを作ります。以下のように打てばファイルが作れ、編集画面が開きます。そのあと「a」と打つと編集モードになります。

vi meeting_bot.php
a

この中に、以下のコードをコピペします。これは例として、毎週土曜日に開かれる会議の出欠をとるプログラムです。

<?php
//次の土曜日の日付を取得
$now = new DateTimeImmutable();    // 今日
$w = (int)$now->format('w');
$diff = 6 - $w;

$sat = $now->add(new DateInterval('P' . $diff . 'D'));
$satu =  $sat->format('m/d');    // 土曜日


//メッセージの設定
define('SLACK_WEBHOOK', 'https://hooks.slack.com/services/XXX');
$message = array('payload' => json_encode(array('text' => "【会議出欠】
日時:$satu(土) 11:00〜
場所:**
参加◯、不参加×、Skype💫でお願いします!")));
$c = curl_init(SLACK_WEBHOOK);
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($c, CURLOPT_POST, true);
curl_setopt($c, CURLOPT_POSTFIELDS, $message);
curl_exec($c);
curl_close($c);
?>

https://hooks.slack.com/services/xxx の部分を、自分のWebhook URLに変え、送りたいメッセージを記入します。

土曜日以外にしたい場合は以下のようにして設定できます。

$sun = $now->add(new DateInterval('P' . ($diff + 1)  . 'D'));
$mon = $now->add(new DateInterval('P' . ($diff + 2)  . 'D'));

以下を参考にしました。

変更が終わったら保存します。半角英数で

:wq

と打てば保存できます。

この時点で、slackに自動投稿するプログラムは完成です。

php meeting_bot.php

と打てば動作確認ができます。これでslackにメッセージが届けばOKです。


3. cronで毎週自動的に送信されるようにする

cronというのはコードを自動で実行してくれる便利なものらしいです。以下に詳しく書いてあります。が、詳しすぎるので今回はあまり見ませんでした。

代わりに参考にしたのが以下です。

これによると、まずcron.txtというのを作ってその中にコードを書きます。ユーザー設定とか色々あるみたいですが今回は省略しました。とりあえず以下をターミナルに打ち込みます。

vi cron.txt

そうすると編集画面が開きます。「a」で編集モードに入り、そこに例えば以下のように打ち込みます。

00 20 * * 4 /usr/bin/php /Users/yumi/meeting_bot.php

これは、毎週木曜日の20時に出欠確認を流すという設定です。

「分」「時」「日」「月」「曜日」[phpの場所] [書いたmeeting_bot.phpがある場所]

というように設定します。曜日は以下のようになっているようです。
0=日、1=月、2=火、3=水、4=木、5=金、6=土、7=日

最後に保存します。

:wq

cronを実行します。

crontab cron.txt

以上で完了です!私のコードをコピペすればできるはずなのでお仕事などで必要な方はどうぞお使いください。面倒なタスクを自動化してマンパワーを別のところに割いてください。


※7月6日追記
この方法だと自分のPCを閉じると動かなくなってしまうようです。解決案を模索中です。

※7月13日追記
cronの実行の仕方をより安全なものに変更しました。


サポートは私の執筆時のおやつになります。よろしくお願いします。