C#でSlackに(ちょっとリッチな)メッセージを送る。
SlackAPIは使用可能な状態であることとする!
- リファレンスを読む(https://api.slack.com/methods/chat.postMessage)
- SlackApp を作成(https://api.slack.com/apps)
- 適切なパーミッションを指定(chat:write, chat:write.customize あたり)
- アクセストークンを払い出す
- App を Slackワークスペース にインストール
- 投稿したいチャンネルに↑のAppを追加
詳しくはリファレンスを見てもらうとして、要するにSlackAPIのURLにJSONデータをアクセストークン付きでPOSTすればいいのだな。
c#とJSONの関係はPHPとのそれより冷めている。C#くんは融通が利かないのだ。(いいところでもある)
JSONデコード、エンコードをするためには大変面倒くさいが、専用クラスを作ったほうが早い。
というわけでリファレンスを見ながら SlackMessage クラスを作る。
こんな感じ。
1 2 3 4 5 6 7 |
public class SlackMessage { public string channel { get; set; } = ""; public string text { get; set; } = ""; public string icon_emoji { get; set; } = ""; public List<SlackMessageAttachment> attachments { get; set; } = new List<SlackMessageAttachment>(); } |
リッチな書式は Attachments で指定するらしいので、こちらもクラスにしておく。
こんな感じ。
1 2 3 4 5 6 7 8 9 |
public class SlackMessageAttachment { public string color { get; set; } = ""; public string pretext { get; set; } = ""; public string title { get; set; } = ""; public string title_link { get; set; } = ""; public string text { get; set; } = ""; public string footer { get; set; } = ""; } |
その他のプロパティはリファレンスを見ながら追加していけばいいが、大体これで足りるんではないか。
次に送信する部分にとりかかる。HttpClient を使って認証情報付きのPOSTを行う。
これがセオリー通りなのかはわからない。誰か教えてください。
こんな感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public static string PostJson(SlackMessage message) { var token = アクセストークン; var _hc = new HttpClient(); _hc.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); var payload = JsonConvert.SerializeObject(message); var content = new StringContent(payload, Encoding.UTF8, "application/json"); var response = _hc.PostAsync("https://slack.com/api/chat.postMessage", content).Result; var result = response.Content.ReadAsStringAsync().Result; switch (response.StatusCode) { case HttpStatusCode.OK: case HttpStatusCode.Created: // OK break; default: // NG throw new Exception($"エラー!({response.StatusCode})" + Environment.NewLine + result); } return result; } |
メソッドが返している result にも色々有用な情報が入っているので、実行時は見てみるとよいかもしれない。
(投稿idを使って返信したりできるとかできないとか)
では実際に送信してみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
{ var message = new NotifyService.SlackMessage(); // シンプルメッセージ。これだけでも送信できるが… message.channel = "#チャンネル名"; message.text = "メッセージ本文"; // message.icon_emoji = ":fire:"; // Attachmentを使うと装飾できる message.attachments.Add(new NotifyService.SlackMessageAttachment { color = "#ff0000", pretext = "見出し1", title = "タイトル1", title_link = "http://www.google.com", text = "本文1", footer = "フッタに表示される文字列1", }); // Attachmentは配列にして複数送信できる message.attachments.Add(new NotifyService.SlackMessageAttachment { color = "#00ff00", pretext = "見出し2", title = "タイトル2", title_link = "http://www.google.com", text = "本文2", footer = "フッタに表示される文字列2", }); NotifyService.PostJson(message); return; } |
実際に送られるメッセージはこんな感じになる。
リッチな装飾が不要なら Attachments は省略してもよい。