LoginSignup
7
6

More than 5 years have passed since last update.

Slash Commandを外部から実行する

Posted at

はじめに

※本投稿記載の内容は、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実行例と同じ)

7
6
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
7
6