IT業界では、インテグレーションをすれば、いろいろな製品をつながって、弱点やできないことを補うことができる、良いところですね。
今回、Slackの投稿をSalesforceから操作したいので、関連設定やコードを共有したいと思います。
Contents
SalesforceとSlackをつながるため
難しいことはないが、Slack側で、Webhook URLを発行すれば、Salesforceがそのリンクに対して、データを送信すれば、OK。これで大まかな つながる 方法です。
Slack側の設定
- Webhook URLを発行すれば、基本これだけで良い、つまりIncoming Webhookを対象Slackに追加すること。 Slack APIを利用する場合Incoming WebHookの設定ページでWebHokURLを取得します 。

Salesforce側
Salesforce側では、設定と実装2つ部分が必要
なぜ、設定がいるかというと、まずリモートサイトに登録しないと、HTTPのPostメソッドのコールで、セキュリティ問題で、飛ばせない。次にWebhook URLはあっちこっちのところで、POSTを行うときに、使うendpointになるため、組織全体的に持ったほうがいい。僕の場合、カスタム設定にした。
設定
- リモートサイト登録(Webhook URL: https://hooks.slack.comここまでよい)
- カスタム設定やカスタムメタデータに Webhook URL (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 25 26 27 28 29 30 31 32 33 34 35 36 |
/* *シンプル実装:匿名コンソール */ //ケースオブジェクのテキスト項目の内容をSlackに投稿、任意のレコードをクエリする List<Case> testCase = [select Id, Text__c,Bot_Name__c,Icon_Emoji__c,Icon_URL__c, IsNotice__c, Channel__c From Case Where IsNotice__c = true]; //ケースのSlackに通知フラグがtrueのケースなら、内容をSlackに投稿していいよ if(testCase[0].IsNotice__c){ // 内部ラッパークラス Message msg = new Message(); msg.text = testCase[0].Text__c; System.debug('カスタム設定 : ' + Slack_Settings__c.getInstance().Webhook_URL__c); String jsonMsg = JSON.serialize(msg); Http http = new Http(); HttpRequest req = new HttpRequest(); // Webhook URLがカスタム設定の項目に保持している req.setEndpoint(Slack_Settings__c.getInstance().Webhook_URL__c); req.setMethod('POST'); req.setHeader('Content-Type', 'application/json'); req.setBody(jsonMsg); HttpResponse res = http.send(req); } public class Message { public String text {get;set;} public String channel {get;set;} public String icon_emoji {get;set;} public String icon_url {get;set;} public String username {get;set;} public Message() { this.username = 'Salesforce'; this.icon_emoji = ':sfdc:'; } } |

サンプルコードの内部ラッパークラスMessageについて
この内部ラッパークラスのプロパティは全部、Slackに投稿する際に固定の文字列です。投稿チャンネルを変更したい場合、ポストメソッドに内容に下記のように構成することが前提となります。
1 2 3 4 5 |
Content-type: application/json { "text": "Danny Torrence left a 1 star review for your property.", "channel":"#yourchannel" } |
なので、チャンネルを変更し、投稿するなら、ラッパークラスのプロパティ変数:channelの値を変えるか、ポストメソッドの内容に直接「”channel”:”#yourchannel”」を含めるようになにかをする必要がある。絵文字や対象アカウントを変更したい時にも同じ。
終わりに
Webhook URLさえあれば、Apexコードを叩いて、すんなり投稿できます。
これで、Salesforceで、webhook URLに対して、データをHTTP のpostメソッドで送信した検証です。
リファレンス
Salesforce→Slack通知をオープンソースで公開しました
Sending messages using Incoming Webhooks
[…] 前回、Webhook URLでSalesforceから、Slackのチャンネルに投稿する記事を公開した。非常にシンプルでした。今回、やや複雑なSlack Web APIを使って、投稿することをチャレンジしてみたいと思います。 […]