xin9le.net

Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。

Slack.Integration - Slack 連携ライブラリを公開しました

もはや 2 番煎じ、3 番煎じどころか 10 番煎じくらいのものですが、.NET アプリと Slack を繋ぐライブラリ Slack.Integration を作成し、公開しました!現時点では Incoming Webhook *1 にだけ対応していますが、そのうち Slash Command にも対応させる予定です。

どうして車輪の再発明を?

Incoming Webhook において以下の機能を満たしたものが欲しかった、というのが主な理由です。

  • ドキュメントで見た Incoming Webhook のメッセージ投稿の表現を可能な限り使いたい
  • ASP.NET Core MVC 上で扱うときに HttpClientFactory の TypedClient を使った Dependency Injection に準拠したい
  • 標準の絵文字定義を使いたい
  • 特別扱いされている既定のカラー定義を使いたい

また今後 Slash Command を作るときに、同一のライブラリ内に Slash Command の機能も閉じ込めておきたいなぁという思惑もあります。

メッセージ表現の網羅

ドキュメントからの起こし漏れがなければですが、たぶん提供されているすべての表現ができます。たとえば下記のような感じです。REST API で飛ばす必要がある JSON に忠実なプロパティ名なので、困ったとしてもドキュメントとの対比が容易かと思います。

var payload = new Payload
{
    UserName = "Incoming Webhook",
    Text = "Hello, @xin9le !!\n\nThis posts is test for _Incoming WebHook_ .\nDocument is <https://api.slack.com/incoming-webhooks|here>.",
    Markdown = true,
    Channel = "#random",  // override channel
    LinkNames = true,  // linkify names and channels 
    IconEmoji = KnownEmoji.PlusOne,
    Attachments = new []
    {
        new Attachment
        {
            Fallback = "脱・読みづらいコード!今日から一段上のプログラマーになる方法 5 選",
            Color = Color.AliceBlue.ToHex(),
            PreText = "This text is optional that is displayed at the top of _attachment block_ .",
            AuthorName = "xin9le",
            AuthorLink = "http://xin9le.net",
            AuthorIcon = "https://pbs.twimg.com/profile_images/1047114972118114305/vw07RO7H_normal.jpg",
            Title = "脱・読みづらいコード!今日から一段上のプログラマーになる方法 5 選",
            TitleLink = "http://blog.xin9le.net/entry/2016/02/26/043557",
            Text = "「ソースコードを綺麗に書く」というのは、プログラマーであれば誰しもが心掛けたいと思っている *極めて重要な事柄* です。そもそも「綺麗なコードってなんぞ?」という感じですが、いくつかあると思います。",
            ImageUrl = "http://cdn-ak.f.st-hatena.com/images/fotolife/x/xin9le/20160226/20160226040749.png",
            ThumbUrl = "https://pbs.twimg.com/profile_images/1047114972118114305/vw07RO7H_normal.jpg",
            Footer = "xin9le",
            FooterIcon = "https://pbs.twimg.com/profile_images/1047114972118114305/vw07RO7H_normal.jpg",
            Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds(),
            Fields = new []
            {
                new Field
                {
                    Title = "Unique User",
                    Value = "345",
                    Short = true,
                },
                new Field
                {
                    Title = "Page View",
                    Value = "12345",
                    Short = true,
                },
            },
            Actions = new []
            {
                new Slack.Integration.IncomingWebhook.Action
                {
                    Type = ActionType.Button,
                    Text = "GitHub",
                    Url = "https://github.com/xin9le",
                    Style = ActionStyle.Default,
                },
                new Slack.Integration.IncomingWebhook.Action
                {
                    Type = ActionType.Button,
                    Text = "Blog",
                    Url = "https://blog.xin9le.net",
                    Style = ActionStyle.Primary,
                },
                new Slack.Integration.IncomingWebhook.Action
                {
                    Type = ActionType.Button,
                    Text = "Twitter",
                    Url = "https://twitter.com/xin9le",
                    Style = ActionStyle.Danger,
                },
            },
        },
    },
};

表示サンプル

ASP.NET Core MVC の DI に対応

ASP.NET Core MVC 2.1 から HttpClientFactory がサポートされるようになり、HttpClient のインスタンスをフレームワークに管理させつつ効率的に利用することができるようになりました。ASP.NET Core MVC なサービスから直接 Slack にメッセージを飛ばすようなケースでは、自分でインスタンスを作るのではなく先の HttpClientFactory の機構に乗っかるのが良いだろうと思い、それに準拠させられるようにしました。

以下のような感じで DI に登録し、利用することができます。

// Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpClient<WebhookClient>();  // supports Typed Client pattern
}
// XxxController.cs

public async Task<IActionResult> DoSomethingAction([FromServices] WebhookClient client)
{
    await client.SendAsync(url, payload);
}

ご利用は NuGet から

すでに NuGet からダウンロードして利用することができます。Slack にメッセージを飛ばしたいという方は、ぜひ使ってみてください。お手軽で便利です。

PM> Install-Package Slack.Integration

*1:Slack への投稿