前回、Webhook URLでSalesforceから、Slackのチャンネルに投稿する記事を公開した。非常にシンプルでした。今回、やや複雑なSlack Web APIを使って、投稿することをチャレンジしてみたいと思います。Salesforce側で、HttpのPOSTメソッドでWebhook URLを用いて、Slackに投稿することが十分です。投稿・リンク付き投稿・添付ファイル付き投稿もできます。しかし、普段のインテグレーションはWEB APIを使って、アクセスし、操作するです。そして、セキュリティ問題や権限問題などを考慮する場合、ズバリWeb API使用です。Slack web api もちゃんとしたアクセス権限を設定可能です。アプリケーションを作成後にスコープを設定するによって、外部アプリケーション(Salesforceなど)がSlackにアクセスする範囲を決められるです。外部にアクセスしてほしくないチャンネルはあるでしょう。そこにある添付ファイルなどがあるでしょう。不注意によって、アクセスされてしまったとか、なにが起こり、どんなことにつながり、どれほど炎上になってしまうかわからないので、慎重に外部にアクセスしてほしい範囲を決めたほうが間違いないです。slack webhook urlは確かに簡単ですが、とはいえ、slack web apiで外部からアクセスして、投稿もそんなに複雑じゃないけどね。エンドポイントは変わり、設定もやや多いだけです。
Contents
SalesforceとSlackをつながるため、Slack Web APIが必要
SalesforceとSlackをつながるため、Slack Web APIが必要。WEB APIを用いて、Slackチャンネルに投稿するにはSlack側で、アプリケーションを作成しないと使えない。つまろ アプリケーションの作成を行わなければSlack Web APIを使用することができません よ。
Slack Web APIのアプリケーション作成
- Slack API サイトにアクセスする(もちろん、ログイン情報が必要)
- 新規アプリケーションを作成する(Start BuildingボタンもYour AppsもOK)
Slack API サイト

新規アプリケーション作成
アプリケーション名の入力と含みたいワークスペースを選択する

アプリケーション作成後に OAuth & Permissions
権限で、スコープを設定する、僕の場合、SalesforceでSlackに投稿だけなので、
chat:writer:user権限に設定しています。
スコープを設定してから、Install App to Workspace緑のボタンも有効になります。
投稿したいワークスペースをインストールすればいい

上記の画像のインストールボタンによって、対象ワークスペースをインストールしてから下記のようになります。アクセストークンが発行されます(機密情報だぞ)
「xoxp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx」の部分
これを使って、SalesforceのAPEXでHTTPメソッドPOSTで送信すれば、投稿可能

Apexサンプルコード(匿名コンソール)
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 37 38 39 40 |
// 内部ラッパークラス Message msg = new Message(); // ケースのテキスト項目の内容を投稿 msg.text = '初めてのSlack Web APIからのメッセージ'; if(String.isNotEmpty(testCase[0].Channel__c)){ msg.channel = testCase[0].Channel__c; } System.debug('カスタム設定 : ' + Slack_Settings__c.getInstance().Webhook_URL__c); String jsonMsg = JSON.serialize(msg); Http http = new Http(); HttpRequest req = new HttpRequest(); // SFDCのリモートサイトに登録してね:https://slack.com/api/chat.postMessage req.setEndpoint('https://slack.com/api/chat.postMessage'); req.setMethod('POST'); // アプリケーションをワークスペースにインストールしてから、発行されるアクセストークンに置き換えて req.setHeader('Authorization', 'Bearer xoxb-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); req.setHeader('Content-Type', 'application/json;charset=UTF-8'); req.setBody(jsonMsg); system.debug('送信内容:' + jsonMsg); system.debug('送信内容req:' + req); HttpResponse res = http.send(req); String responseBody = res.getBody(); System.debug('responseBody: ' + responseBody); 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 String as_user {get;set;} public Message() { this.username = 'Salesforce'; this.icon_emoji = ':sfdc:'; this.as_user = 'false'; } } |
終わりに
ポスト設定に誤りがある場合は
・okはfalseでerrorにはinvalid_authが設定されて戻されます。
・okはfalseでerrorにはnot_in_channelが設定されて戻されます。
様々なエラーありますよ。
webhook URLで一番簡単だが Scopeを使ってSlackが公開しているどの機能を範囲として公開することができます。機能の制限せずに一括で設定したいと思うかもしれませんが、アカウント情報など重要なデータへのアクセスもできるため使用範囲を限定して設定するほうが安全にWEB APIを利用することができます。
リファレンス
- Slack メッセージ・アクション API を使ってディスカバラブルなアプリを作ろう
- Slack Web APIを使ってアカウントに直接メッセージを送る
- 【Salesforce】(Tips) APEXからHTTP API Callを呼ぶ/テストもする
- Slack API の概要
- Sending messages using Incoming Webhooks
- chat.postMessage