いままで忘備録的に、twitter にメモを投稿していたのだけど、半年ほど独り slack に投稿するということをやっている。ツイッターの自分の投稿をググるのも大変というのもあり、仕事に関係するものを投稿して、逆に仕事自体を推測されるのもアレなので(そういアピールだったらいいんだけど、実際、そういうこともやるし)、手元のものは手元でやるということで。
で、せっかくのクローズドな独り slack なのだから、redmine への投稿も slack 経由でやったり、逆に新規のチケットがでてきたら slack のほうに投げ返したりしたらどうか?と思ったりする。
slack の場合、http://slack.com/apps に各種アプリケーションがアップしてあって(twitter の連携アプリのような感じか?)、直接 slack api を触れなくて、適当な連携アプリを探してくるのがベターだったりするみたい。
Incoming WebHooks を使う
そんな中で、Incoming WebHookを使って、C#でSlackに投稿してみる – なか日記 というのがあったので、Incomming WebHook を使ってみる。
Incoming WebHooks | Slack App Directory
https://slack.com/apps/A0F7XDUAZ-incoming-webhooks?page=1
- Add Configuration する
- 投稿先のチャンネルを選んで、Add Incoming WebHooks Integration する
- Webhook URL が作成されるので、これを自前アプリで使う。
なか日記さんのほうでは、WebClient が使われているので、HttpClient を使うように書き替えてみる。JSON を送るときの content-type は StringContent を作成するときに指定すれば ok. DynamicJson を使っているけど、Newtonsoft.Json でシリアライズしてもよい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class Program { static string WEBHOOK_URL = “”; static void Main( string [] args) { var hc = new HttpClient(); var json = DynamicJson.Serialize( new { text = args.Length == 0 ? DateTime.Now.ToString( "yyyy/MM/dd HH:mm:ss" ): args[0], icon_emoji = ":ghost:" , //アイコンを動的に変更する username = "slackpost" //名前を動的に変更する }); var content = new StringContent(json, Encoding.UTF8, "application/json" ); var res = hc.PostAsync(WEBHOOK_URL, content).Result; Console.WriteLine( "投稿しました" ); } } |
ちなみに、WebHook URL を取得するときにチャンネルを指定するけど、登校時に JSON で channel プロパティを指定すれば、指定したチャンネルが使われるので、実質何処にでも投稿ができる。
詳しい解説は Incoming Webhooks | Slack にある。curl を使って post すればよいので、わざわざツールを作るまでもないんだけど、まあ、あれこれ複雑なオプションを外してしまった単発ツールをスクリプトで作ってもよいだろう。
逆にメッセージを監視するときは、Outgoing WebHookを使ってSlackのメッセージを監視する – なか日記 に Outgoing WebHooks の使い方がある…のだけど、別途 Web API を立てる必要がある。外部サーバーで何かをやる場合はこれでいいのだが、結局のところ手元なPCへ通知を出す場合が多いので、真面目に slack api を使ってメッセージをポーリングするのが良いかなと思ったり。message event | Slack このあたり。