当サイトを最適な状態で閲覧していただくにはブラウザのJavaScriptを有効にしてご利用下さい。
JavaScriptを無効のままご覧いただいた場合には一部機能がご利用頂けない場合や正しい情報を取得できない場合がございます。
承知しました
本サイトではWebサイトのエクスペリエンスを向上させるために、Cookieを使用しています。Cookieはブラウザの設定から無効にできます。本サイトで使用するCookieについては、プライバシーポリシーをご確認ください。

Blog

ブログ

統合

KenticoCloudでのSlackWebhookの使用

By Bryan Soltis  

Kentico CloudのWebhookサポートは、開発者がアプリケーション内で使用するための優れたツールです。この機能を構成することにより、プロセスを簡単に自動化し、カスタムコードを簡素化できます。 Webhookは、外部システムを更新し、データの整合性を確保し、コンテンツの変更に応じてすべてのシステム(およびユーザー)の同期を維持できます。この新機能を使用して、コンテンツが公開されたときにチームのSlackチャネルを更新する方法を紹介します。

注:この記事は廃止されました。更新されたバージョンはここにあります

統合により、すべての人の生活が楽になります。開発者からマーケターまで、誰もが日常業務の小さな自動化から利益を得ることができます。最近、KenticoCloudでのWebhookサポートを発表しました。この新機能により、コンテンツの更新をビジネスのあらゆる側面に統合できます。これは、コンテンツの変更に関しては、暗闇の中で座っている時間が減り、マインスイーパをプレイする時間が増えることを意味します(ah、1996…)。

チームを最新の状態に保つことの大きな部分はコミュニケーションです。ますます多くの企業が、チームメンバーに更新、会議出席依頼、および休憩室にケーキがあることを通知するためにインスタントメッセージングに依存しています。 Slackは最も人気のあるクライアントの1つであるため、チームのコミュニケーションプラットフォームでKenticoCloudのWebhookサポートを活用する方法を紹介したいと思います。 Kentico EMSについても同様の記事を公開しましたが、これについては何度か参照します。

方法をお見せしましょう…

プロセスの定義

プロセスの最初のステップは、統合がどのように見えるかを定義することです。会社やプロジェクトはそれぞれ異なるため、システムを接続する方法はすべて要件によって異なります。私の場合、Kentico Cloudコンテンツアイテムが公開および非公開のときに、チャネルにメッセージを投稿したかっただけです。このプロセスは、私のマーケティング担当者が新しいコンテンツの最新情報を入手するのに役立ちます。これは、プロジェクト内でコンテンツを作成および公開している外部の編集者が複数いる場合に特に役立ちます。

これが私の機能のワークフローです。

Kentico Kontent

Webhookの作成

ワークフローを定義したら、統合を作成する準備が整いました。 Webhookを使用すると、コンテンツが更新されたときにKenticoCloudが呼び出すことができる関数が必要でした。これは、MVCアプリケーション内のルート/関数、Amazon Lambda関数、または(私の場合はそうなる傾向がありますが)Azure関数である可能性があります。 Azure Functionsにはこのニーズに固有の構成があるため、私のソリューションに適していました。

Azure Functionsで、新しいGenericWebhook関数を作成しました。

Kentico Kontent


構成については、単純なHTTPサポートのみが必要だったため、デフォルトのままにしました。

Kentico Kontent


また、GenericJSONタイプを選択したままにすることも選択しました。 Azure Functionsは、 Slack固有の関数のサポートを提供します。これにより、呼び出しが簡素化されます。以前の記事の統合コードを利用していたため、代わりに汎用呼び出しを使用することにしました。

Azure Function Slack Webhookのサポートについて詳しくは、 こちらをご覧ください

KenticoCloudの構成

プロセスの次のステップは、KenticoCloud内でWebhookを構成することでした。私のプロジェクトでは、Azure関数のURLを使用して新しいWebhookを作成しました。

Kentico Kontent


シークレット値はプロセスの後半で使用されることに注意してください。

Kenticoクラウド統合の追加

関数が作成されたら、コードを追加する準備ができました。私は他のブログでプロセスを数回文書化したので、ここに私がしたことの概要があります。

  • project.jsonを作成しました
  • KenticoCloud.DeliveryAPIへの参照を追加しました
  • run.csxにKCプロジェクトID /プレビューAPIキーを追加しました

基本機能が整ったので、Slack統合を移植する準備ができました。 Azure Functionsは追加のファイルをサポートしているため、既存のSlackコードファイルをアップロードし、拡張子を.csxに変更しました。これらは、以前のSlack統合で使用したファイルです。

ペイロード.csx
このファイルはSlackメッセージのモデルです。

 using Newtonsoft.Json;public class Payload{ [JsonProperty('channel')] public string Channel { get; set; } [JsonProperty('username')] public string Username { get; set; } [JsonProperty('text')] public string Text { get; set; }}


slackclient.csx
このファイルには、Slackにメッセージを投稿するための投稿機能が含まれています。

 using System.Text;using System.Net;using Newtonsoft.Json;using System.Collections.Specialized;//A simple C# class to post messages to a Slack channel//Note: This class uses the Newtonsoft Json.NET serializer available via NuGetpublic class SlackClient{ private readonly Uri _uri; private readonly Encoding _encoding = new UTF8Encoding(); public SlackClient(string urlWithAccessToken) { _uri = new Uri(urlWithAccessToken); } //Post a message using simple strings public void PostMessage(string text, string username = null, string channel = null) { Payload payload = new Payload() { Channel = channel, Username = username, Text = text }; PostMessage(payload); } //Post a message using a Payload object public void PostMessage(Payload payload) { string payloadJson = JsonConvert.SerializeObject(payload); using (WebClient client = new WebClient()) { NameValueCollection data = new NameValueCollection(); data['payload'] = payloadJson; var response = client.UploadValues(_uri, 'POST', data); //The response text is usually 'ok' string responseText = _encoding.GetString(response); } }}


Slackファイルを配置したら、関数を更新する準備ができました。まず、Kentico Cloudのシークレット値を使用して、通話を検証するコードを追加しました。

 // Get the signature for validation IEnumerable headerValues = req.Headers.GetValues('X-KC-Signature'); var sig = headerValues.FirstOrDefault(); // Get the content var content = req.Content; string jsonContent = content.ReadAsStringAsync().Result; // Generate a hash using the content and the webhook secret var hash = GenerateHash(jsonContent, strWebhookSecret); // Verify the notification is valid if(sig != hash) { log.Info('Unauthorized attempt!'); log.Info(sig); log.Info(hash); return req.CreateResponse(HttpStatusCode.Unauthorized, new { error = 'Unauthorized!' }); }…


通話が検証されたら、更新されたすべてのアイテムと更新のステータスのリストを作成しました。

 dynamic data = JsonConvert.DeserializeObject(jsonContent, settings); if (data == null) { return req.CreateResponse(HttpStatusCode.BadRequest, new { error = 'Please pass data properties in the input object' }); } // Determine the operation // Only process if it is publish or unpublish string strOperation = data.message.operation.ToString().ToLower(); switch(strOperation) { case 'publish': blnValid = true; blnPublish = true; break; case 'unpublish': blnValid = true; blnPublish = false; break; } // Make sure it's a valid operation if(blnValid) { List lstCodeNames = new List(); foreach(var item in data.data.items) { lstCodeNames.Add(item.codename.ToString()); }


次のステップは、アップデートをSlackに投稿することでした。これを行うために、更新された各アイテムをループし、Kentico Cloudから詳細を取得して、指定されたSlackチャネルにメッセージを投稿しました。

 ... // Post to Slack if(lstCodeNames.Count > 0) { await PostToSlack(lstCodeNames, log); } ...private static async Task PostToSlack(List list, TraceWriter log){ try { SlackClient slackclient = new SlackClient(strSlackURL); DeliveryClient deliveryclient = new DeliveryClient(strKenticoCloudProjectID, strKenticoCloudPreviewAPIKey); foreach(string codename in list) { // Get the details from Kentico Cloud DeliveryItemResponse response = await deliveryclient.GetItemAsync(codename); if(response != null) { var item = response.Item; log.Info(item.GetString('name')); slackclient.PostMessage(username: strSlackUsername, text: 'Content update:' + item.GetString('name') + (blnPublish ? ' PUBLISHED!' : ' UNPUBLISHED!'), channel: strSlackChannel); } else { log.Info($'Item not found!'); } } } catch (Exception ex) { log.Info(ex.Message.ToString()); }}

テスト

構成と機能が整ったので、テストする準備ができました。 Kentico Cloudを開いて、コンテンツアイテムを更新しました。まず、新しいコンテンツアイテムを公開しました。

Kentico Kontent


次に、メッセージがSlackチャネルに投稿されたことを確認しました。

Kentico Kontent


次に、アイテムを非公開にしました。

Kentico Kontent


最後に、新しいメッセージが正しく投稿されたことを確認しました。

Kentico Kontent

前進する

このブログでは、会社のSlackチャネルをコンテンツ管理プロセスに簡単に統合できることを紹介しました。この機能は、更新をリアルタイムで配信することにより、チームの生産性を高めるのに役立ちます。これにより、問題をより早く通知し、カスタム開発を削減できます。それがあなたがいくつかの素晴らしい解決策を作り、あなたのチームがスムーズに働くのを助けることを願っています。さて、休憩室のあのケーキについて…。

コードを取得する

Headless CMSの導入をお考えでしょうか?

クラウドとマルチデバイスに最適化されたKentico Kontentをお試しください