はじめに
※本投稿記載の内容は、Slackのオフィシャル情報ではありません。
Slack側の仕様変更により利用不可になる可能性が高いので、ご注意ください
最近、こちらの「SlackのSlash commandの処理をAWS Lambdaで実装」を参考にSlash Commandを作ってみました。
Slash Commandは基本的にSlackのユーザが能動的に入力し、各種処理を実行させるものです。
せっかくなのでこの処理部分を再利用して、定期的に自動実行させてみよう思い、SlackのAPI経由でSlash Commandを投稿してみようと試してみましたが、このAPIからは投稿できませんでした。
# 「/command arguments」のような文字列がそのまま投稿されます。
Webではどうやっている?
API経由ではSlash Commandが送れないので、Webインターフェースでは何をやっているか、ブラウザの開発ツールで覗いてみました。
すると、Slash Commandの実行は通常の投稿と異なり、以下のRequest URLにmultipart/form-dataのRequest BodyをPOSTしていました。
# 通常の投稿はWebSocket経由っぽいです
Request URL
https://{TEAM_NAME}.slack.com/api/chat.command
Request body
------{boundary_string}
Content-Disposition: form-data; name="command"{COMMAND}
------{boundary_string}
Content-Disposition: form-data; name="text"{COMMAND_ARGS}
------{boundary_string}
Content-Disposition: form-data; name="channel"{CHANNEL_ID}
------{boundary_string}
Content-Disposition: form-data; name="token"{TOKEN}
------{boundary_string}--
**{CHANNEL_ID}**はこちらの「Slack | APIに使う「チャンネルID」を取得する方法」を参考に投稿先のチャンネルIDを取得してください。チャンネルの名前では動作しません。
**{TOKEN}**は有効なトークン文字列を指定してください。こちらから取得できるテスト用トークンで動作しました。またbot用トークンでは動作しませんのでご注意ください。
その他はご利用の環境に合わせて適宜変更してください。
curlで実行する場合
下記のようになります。
curl "https://{TEAM_NAME}.slack.com/api/chat.command" -H 'Content-Type: multipart/form-data; boundary=----{boundary_string}' --data-binary $'------{boundary_string}\r\nContent-Disposition: form-data; name="command"\r\n\r\n {COMMAND} \r\n------{boundary_string}\r\nContent-Disposition: form-data; name="text"\r\n\r\n {COMMAND_ARGS} \r\n------{boundary_string}\r\nContent-Disposition: form-data; name="channel"\r\n\r\n {CHANNEL_ID} \r\n------{boundary_string}\r\nContent-Disposition: form-data; name="token"\r\n\r\n {TOKEN} \r\n------{boundary_string}--\r\n'
Slash Commandを定期自動実行する
Slash Commandを定期的に自動実行してみます。
例えば毎日7時にSlash Commandを実行するには、cronを使って上記curlコマンドを実行したらよいので、以下のようになります。
0 7 * * * curl -s "https://{TEAM_NAME}.slack.com/api/chat.command" (以下、略. 上記curl実行例と同じ)
おまけ
毎日7時から「平日の」7時としたい場合は、curlコマンドの前にtestコマンドを使って、平日かどうかの判定を入れればよいでしょう。
# 「国民の祝日チェック」を使わせてもらいました。
0 7 * * * test $(curl -s "http://s-proj.com/utils/checkHoliday.php?kind=h") == "else" && curl -s "https://{TEAM_NAME}.slack.com/api/chat.command" (以下、略. 上記curl実行例と同じ)