なか日記

一度きりの人生、楽しく生きよう。

Outgoing WebHookを使ってSlackのメッセージを監視する

タイトルに「ASP.NET MVC」の文字を入れたいところですが、「ASP.NET」の文字にTwitterが自動でリンクを張ってくれるのでやめておきます。

ゆるふわ.rbの勉強会でSlack APIについてかじったのをきっかけに、下のような復習をしました。

その勢いで、今日はOutgoing WebHookを使ってみます。

Outgoing WebHookとは

条件を満たすメッセージが投稿された際、事前に設定したURL(Webサービス)にHTTPリクエストを投げてくれます。

条件というのは下記いずれかになります。もちろん「両方の条件を満たす場合のみ~」というのもOK。

  • 特定のチャンネル
  • 特定の文字列で始まるメッセージ

詳しくは公式APIのドキュメント「Outgoing Webhooks | Slack」を見て下さい。英語がわからなくても何となく雰囲気はわかるんじゃないかと思います。

作るもの

Incoming WebHookを使って、C#でSlackに投稿してみる - なか日記」の最後に書いてた

次はチャンネルに
 大丈夫でしょうか?
という投稿があったら、
 大丈夫だ。問題ない。
って返すボットを作ってみたいですね。

をやってみようかなと思いますが、あまり推奨される使い方じゃないかも。

必要なもの

1.SlackのアカウントとIntegrationを追加できるチーム

これがないと始まりませんね。

2.デプロイできる環境

HTTPでリクエストが飛んでくるのでそれを受け取るためのWebサイトが必要です。今回は「ASP.NET MVCでSlackのスラッシュコマンドを作ってみる - なか日記」で作った時の環境(Visual StudioからAzure上にWebサイトをちょちょいっと作ったもの)を利用しました。

ASP.NET Web APIを作る

ASP.NET MVCでSlackのスラッシュコマンドを作ってみる - なか日記」の時と同じように、VisualStudioから「ASP.NET Web アプリケーション」プロジェクトを作成します。

テンプレートはWeb APIでいいでしょう。

プロジェクトを作成する際、「クラウドにホストする」にチェックを入れておくと、Azure上に環境を作ってくれるので楽ちんです。

Azure上に環境を作成する際、URLが決まります。 今回は次のようなURLにしました*1http://slacksample.azurewebsites.net/

コードを書く

    public class NoProblemController : ApiController
    {
        public class SlackRequest
        {
            public string text { get; set; }
        }

        public class SlackResponse
        {
            public string text { get; set; }
            public string icon_emoji { get; set; }
            public string username { get; set; }
        }

        public SlackResponse Post([FromBody]SlackRequest req)
        {
            if (!req.text.Contains("?")) return new SlackResponse { text = "" };

            return new SlackResponse()
            {
                text = "大丈夫だ。問題ない。",
                //icon_emoji = ":ghost:", //アイコンを動的に変更することも可能
                //username = "イーノック"  //名前を動的に変更することも可能
            };
        }
    }

POSTされたtextの内容に「?」が含まれていると「大丈夫だ。問題ない。」って応答を返すようにしています。

Slackでの設定

https://slack.com/apps」を開きます。ここで、「Outgoing」って入力すると、「Outgoing WebHooks」というのが出てくるのでこれを選択します。

f:id:nakaji999:20160211050015p:plain

どこのチームにインストールするか聞かれますので、設定したいチームを選択(Installをクリック)します。

f:id:nakaji999:20160207044557p:plain

Outgoing WebHookの設定画面になりますので、ここでトリガーとなる条件と呼び出すWebAPIのURLを設定します。

今回はChannelのみ設定して、Trigger Word(s)は設定していません。この場合ちょっと注意が必要ですが、それは最後に書きます。

f:id:nakaji999:20160211050321p:plain

また、設定画面の下の方にあるCustomize NameやCustomize Iconなんかを編集しておきます。

Slackから実行してみる

f:id:nakaji999:20160211050807p:plain

できた!

なんだか懐かしいですね。これが流行ったのって、2011年のことらしいですよ…

注意点

全てのメッセージをトリガーとした場合、WebAPIからのメッセージもトリガーの対象となります。

例えば、常に「ok」というメッセージを返すWebAPIに接続した場合、以下のような状況に陥ることになります。

f:id:nakaji999:20160210050453p:plain

「ああ」に反応してWebAPIが呼び出され、「OK」を返す。その「OK」に反応してWebAPIが呼び出され・・・まぁ、応答返す場合にはちゃんと考えようねってことですね。

まとめ

そのチャンネルの全てのメッセージを対象にできるので、例えば「全てのメッセージをGoogleドキュメントに保存する」とかもできそうですね。

それと、メッセージに「BOT」って表示されてしまいますので、悪用はできません*2。 これをやるにはBot Usersを使えばいいのかな?

ゆるふわ.rbで、Bot Usersを使うにはハードルがぐっと高くなるという話をしてましたが、公式ドキュメント見た感じだと確かに今までのように「なんとなく」理解するのは難しそうです。

Bot Usersについては、一旦脇に置いといて、別のことしようかなと思います。

おしまい。

*1:ASP.NET MVCでSlackのスラッシュコマンドを作ってみる - なか日記」で作ったプロジェクトの使い回しです

*2:「仕事してますか?」に反応して、「はい。めっちゃしてます。」って自動応答するとか