はじめに
本記事では私がLRの機能開発をしながら学んだC#からSlackに投稿するやり方を整理したものです。結構簡単なので、よかったら参考にしてみてください!
使用するAPIについて
今回、SlackのIncoming WebhooksというAPIを使用します。これは外部サービスからSlackにメッセージを送信するための機能です。
この機能は外部からHTTPリクエストでメッセージを送っています。そのため、HTTP通信ができる言語・環境であれば使うことができます。(本記事ではC#を使って紹介しています。)
この機能を使用するためにはメッセージ送信先のURLを作成しておく必要があります。
Slackで送信先のURLを作成する
チャンネルの詳細のApp管理からAppディレクトリを表示しIncoming Webhooksを検索、 Slackに追加してください。次に、Post先のチャンネルを選択し、Incoming Webhooksインテグレーションの追加を行い、インテグレーションの設定欄にあるWebhook URLをコピーしておいてください。
このUrlを使って外部からチャンネルにメッセージをPostできます。(インテグレーションの設定欄でデフォルトで表示される名前、アイコンなどが設定できる)
こちらも参考にしてください。
プロジェクト側の準備
SlackにPostする情報はJson形式にシリアライズして送信するため、Jsonデータが扱えるようにNewtonsoft.JsonをNuGetからインストールしてください。
SlackにテキストをPostする
準備完了です。早速テキストを送信してみましょう。
まずは、Slackに送信するJsonデータの変換元となるペイロードクラスを作成しましょう。
今回は簡単に、送り主の名前と本文テキストを設定します。
/// <summary>
/// Slackに送信するjsonの変換元となるデータを保持するクラス
/// 送信チャンネルはデフォルト
/// </summary>
public class SlackPayload
{
#region プロパティ
/// <summary>
/// ユーザ名
/// </summary>
public string username { get; set; }
/// <summary>
/// 本文
/// </summary>
public string text { get; set; }
#endregion
}
それでは、SlackにPostするクラスを作成します。
HTTPリクエストを送信するためにHttpClientクラスを使用しますので、インスタンスを生成しておきます。 HttpClientは無闇に作成したり破棄したりするのではなく、Static宣言をして使いまわすのが良いみたいです。詳しくはこちら。
送信したいテキストをJson形式にシリアライズします。作成したJsonパラメータをURLに変換し、WebhookURLにPostします。
/// <summary>
/// Slackに対してHttpリクエストの送信を行うクラス
/// 送信先はデフォルトとして設定されたチャンネル
/// </summary>
class SlackNotificationService
{
#region 定数
/// <summary>
/// POST先のURL
/// </summary>
private const string c_PostUrl =
"https://hooks.slack.com/services/xxxxxxxxxxxxxxxxxxxxxxx";
/// <summary>
/// ペイロード用のKey値
/// JsonをUrlに変換する際に必要なデータをディクショナリに詰める必要がある。
/// その際にペイロードの値はこのKey値で格納する。
/// </summary>
private const string c_PayloadKeyValue = "payload";
#endregion
#region フィールド
/// <summary>
/// SlackにPOSTするために使用するHttpClient
/// </summary>
private static HttpClient m_HttpClient = new HttpClient();
#endregion
#region 公開サービス
/// <summary>
/// HttpリクエストをPOSTする
/// </summary>
/// <param name="text"></param>
/// <param name="username"></param>
/// <returns></returns>
public async Task<bool> Post(string text, string username)
{
// 送信パラメータを作成
var slackPayload = new SlackPayload()
{
text = text,
username = username
};
// 送信パラメータオブジェクトをJSONに変換
var jsonSlackPayload = JsonConvert.SerializeObject(slackPayload);
// Jsonの送信パラメータ情報をURLに変換
var slackPayloadDictionary = new Dictionary<string, string>()
{
{c_PayloadKeyValue, jsonSlackPayload}
};
var urlParameter = new FormUrlEncodedContent(slackPayloadDictionary);
var response = await m_HttpClient.PostAsync(c_PostUrl, urlParameter);
return (response.StatusCode == HttpStatusCode.OK);
}
#endregion
}
最後に、上記のPostメソッドを呼び出せば、Slackにテキストを送信することができます!
以上です。最後まで読んでいただき、ありがとうございました。