外部と共有されるチャンネルをサポートする
学習の目的
この単元を完了すると、次のことができるようになります。
- アプリで外部と共有されるチャンネルをサポートする必要がある場合を判断する。
- 外部と共有されるチャンネルをアプリでどのようにサポートできるかを説明する。
Slack コネクト
Slack コネクトチャンネルでは社内ユーザーとほかの企業やオーガナイゼーションのメンバーがつながり、全員が Slack 内でシームレスにコラボレーションできます。この共有チャンネルによって、一緒に仕事をするチーム同士がつながり、メールで何度もやり取りしたり、それぞれ別の Slack ワークスペースで作業したりする必要がなくなります。ユーザーは、普段一緒に働いている同僚と同じように、簡単にチャットしたり、ファイルを共有したり、アプリを使用したりできます。
考慮事項
外部組織とつながるチャンネルも、ほとんどの場合、ユーザーは通常のチャンネルと同じように利用できます。アプリが想定どおりに動作するよう、次の点を確認しておきましょう。
-
メッセージとファイル: 共有チャンネルに参加しているすべてのワークスペースでは、メッセージの送受信、ファイルの共有、共有チャンネルの履歴へのアクセスが可能です。
-
チャンネル設定: 組織間で共有されるチャンネルは、参加するワークスペースごとに設定が異なる場合があります。たとえば、次のような違いがあります:
- チャンネル名はワークスペースごとに異なる場合があるため、チャンネル名で判断せず、常にチャンネル ID を使用しましょう。
- 同じチャンネルでも、プライバシー設定 (パブリック/プライベート) がワークスペースごとに異なる場合があります。
- 同じチャンネルでも、データ保持ポリシーがチームごとに異なるため、参照できるメッセージ履歴の範囲も異なる場合があります。
- チャンネル名はワークスペースごとに異なる場合があるため、チャンネル名で判断せず、常にチャンネル ID を使用しましょう。
こうした違いがあるため、channels.*、groups.*、im.*、mpim.* などのレガシー API メソッドではなく、新しい Conversations API (conversations.*) を使用する必要があります。
外部と共有されるチャンネルをサポートする方法
チャンネル、メッセージ、ユーザー、チームなどのオブジェクトには、共有チャンネル特有の細かな違いがあるので注意してください。チャンネルが複数のワークスペースに接続されている場合、ほかのワークスペースから送信されたメッセージや、ほかのワークスペースのユーザーを扱うことになります。
具体的なケースをいくつか見てみましょう。
1. チャンネルに複数のワークスペースまたはオーガナイゼーションのメンバーがいることを検出する
ワークスペース間でチャンネルが共有または共有解除されたことを検出するには、channel_shared と channel_unshared イベント種別を登録します。すべての共有イベントを受信するには、アプリに channels:read (パブリックの場合) または groups:read (プライベートの場合) スコープが必要です。ボットが参加している会話では、対応するボットトークンスコープを使用してボットイベント種別を登録します。
共有イベントのコールバックペイロードには、チャンネル ID と、そのチャンネルの共有先または共有解除先となったチームの ID が含まれます。
{
"type": "channel_shared",
"connected_team_id": "TLL6DGUHX",
"channel": "CLZT0MJHZ",
"event_ts": "1565722340.000000"
}こうしたイベントコールバックペイロードの connected_team_id 項目をアプリで記録しておくと便利です。アプリは、その外部チームのユーザーから送信されたメッセージのイベントを受信するようになるためです。
2. 見知らぬユーザー (stranger) とやり取りする

アプリは外部ユーザーからのメッセージやイベントを受信しますが、そのユーザー情報はアプリがインストールされているワークスペースのユーザーとは異なります。
-
外部メンバーとは、別のオーガナイゼーションの Slack ワークスペースに属し、アプリまたはチームとチャンネルを共有しているユーザーです。
-
見知らぬユーザー (stranger) とは、アプリとチャンネルを 1 つも共有していない外部メンバーのことです。メンションや共有コンテンツによって、その存在に気づくことがあります。
外部メンバーは user 型オブジェクト (たとえば users.info から取得したオブジェクト) によって識別できますが、通常は含まれている情報の一部が欠けていることがあります。
ユーザープロファイルの is_stranger フラグは、見知らぬユーザー (stranger) であることを示します。
外部メンバーと見知らぬユーザー (stranger) のどちらについても、プライバシー上の制限により、プロファイルデータには (users:read.email 範囲が指定されていても) メールアドレスや (include_locale フラグが指定されていても) ロケール情報は含まれません。
users.info API のレスポンス例を次に示します。
{
"ok": true,
"user": {
"id": "U0BNRNDKJ",
"team_id": "T07QCRP7S",
"name": "rex",
"real_name": "Devon Rex",
"profile": {
"image_24": "https:\/\/.../11662770033.jpg",
"team": "T07QCRP7S",
"display_name": "eshellstrop"
// all that other stuff
},
"is_stranger": true
}
}ユーザーを指定するときは、ユーザー名ではなく必ずユーザー ID を使用してください。username 属性は、特に外部ユーザーや見知らぬユーザー (stranger) にとって信頼できる一意の識別子ではないため、chat.postMessage などの API メソッドでは機能しません。
ボットユーザーは、共通のチャンネルを共有していれば、接続されたワークスペースをまたいでユーザーにダイレクトメッセージを送信できます。
3. 同じチャンネルで設定が異なる場合
チャンネルに別のワークスペースまたはオーガナイゼーションのメンバーが加わると、チャンネル ID の大部分は同じままですが、設定によってプレフィックス (先頭の 1 文字) が異なる場合があります。チャンネルがプライベートに設定されていても、ID のプレフィックスが G から C に変換される (たとえば G1234567890 が C1234567890 になる) 場合があります。
チャンネルを共有する各チームは、自分たちの側でチャンネルをパブリックにするかプライベートにするかを個別に決められるため、API にもいくつか違いがあります。
-
conversations.* メソッドでは、あらゆるチャンネル種別 (パブリックとプライベートの両方) と DM を扱えます。
- channel 型オブジェクトには、チャンネル種別の情報 (パブリック、プライベートなど) も含まれるようになりました。
-
conversations.info メソッドは、共有チャンネルに接続されているワークスペースと、ホストワークスペースのチーム ID に関する追加情報を提供します。
- 適切な権限スコープを要求していれば、conversations.* メソッドでパブリックチャンネルとプライベートチャンネルの両方を扱えます (任意)。
-
conversations.infoなどのメソッドから返される channel 型オブジェクトでは、チャンネルに関する追加情報を取得できます。チャンネルが外部と共有されている場合、is_ext_sharedプロパティが true に設定されます。プライベートチャンネルの場合は is_private、グループ DM の場合は is_mpim プロパティがそれぞれ true に設定されます。
特定のチャンネルのプライバシーと種別を判断するときは、is_ext_shared、is_private、is_mpim の各フラグのみを使用します。is_shared には、同じ OrG 内の複数のワークスペース間で共有されるチャンネルも含まれるため注意してください。
conversations.list API のレスポンス例:
{
"ok": true,
"channels": [
{
"id": "C0A1NBPT3",
"name": "product-qa",
"is_channel": true,
"created": 1491332036,
"creator": "U0A379ZT2",
"is_archived": false,
"is_general": false,
"is_shared": true,
"is_org_shared": false,
"is_member": false,
"is_private": true,
"is_mpim": false,
"members": [
"U0A379ZT2",
"U0AU7DMHN"
],
...
},
{ ... },
]
}4. オーガナイゼーション間の共有チャンネルを単一オーガナイゼーションのチャンネルに戻す
オーガナイゼーション間またはワークスペース間のチャンネルについて、ホストワークスペースが共有を解除しても、各ワークスペースは、それまでのすべてのメッセージや活動を含むチャンネル履歴に引き続きアクセスできます。ただし、切断されたワークスペースのチャンネルには新しい ID が割り当てられ、ホストワークスペースでは元のチャンネル ID が維持されます。
5. オーガナイゼーション間のプライベートチャンネル
オーガナイゼーション間で共有されるチャンネルは、ワークスペースごとに異なるプライバシー設定を持つことができ、あるワークスペースではパブリックでも、別のワークスペースではプライベートになっている場合があります。チャンネルのプライバシーを正確に判断するには、Conversations API を使用します。
共有されているプライベートチャンネルの共有を解除しても、プライベートのままですが、その ID プレフィックス (たとえば C) は変わりません。したがって、チャンネルのプレフィックスからプライバシーを確実に判断することはできません。
想定しておくべき新たな挙動
複数のワークスペースやオーガナイゼーションのメンバーが参加する共有チャンネルでも、多くのアプリ、ボット、そのほかのインテグレーションは引き続き動作しますが、アプリで予期しない挙動が発生する場合があります。
一般に、アプリはワークスペース間でも透過的に動作します。ですが、複数のワークスペースに接続する性質上、アプリのインフラストラクチャの設計によっては、一部のシナリオで制限が生じる場合があります。
たとえば、特定のワークスペースのユーザーに紐付けられた Salesforce のような商用アプリでは、別のワークスペースのユーザーに自動的にアクセス権を与えるべきではありません。アプリに適したデータアクセスを判断するには、conversations.* と users.info API メソッドを使用する必要があります。
共有チャンネルのボットユーザーには、すべてのワークスペースユーザーと外部メンバーがアクセスできます。team 項目はメッセージの送信元チームを示し、team_id はアプリがインストールされているワークスペースを示します。この 2 つが異なる場合、送信者は外部ユーザーです。機密情報を共有するときは、それに応じてアプリの動作を調整します。
スラッシュコマンドとメッセージアクションはインストール先のチームでのみ機能しますが、外部メンバーも投稿されたメッセージを表示して操作できます。たとえば、Catnip Inc. が /poll を使用する投票アプリをインストールした場合、共有チャンネルのパートナーである Woof Inc. のユーザーは投票に参加できますが、投票を作成することはできません。

機能別のサポート戦略を確認する
API |
サポート戦略 |
|---|---|
Events API |
共有チャンネルの外部ユーザーから届くイベントは、重複することなくサポートされます。authorizations 項目には表示可能な関係者が 1 件だけ示されます。すべての承認済み関係者を取得するには、apps.event.authorizations.list を使用します。 |
Web API |
共有チャンネルの外部ユーザーには制限された権限しか付与されません。users.list に含まれないチーム横断の外部ユーザー ID の詳細を取得するには、users.info を使用します。 |
Incoming Webhook |
Incoming Webhook のメッセージは共有チャンネルのすべてのメンバーに表示されますが、ダイレクトメッセージを送信できるのはアプリがインストールされているワークスペースのユーザーだけです。 |
スラッシュコマンド |
スラッシュコマンドは、アプリがインストールされているワークスペースのユーザーに対してのみ機能します。外部ユーザーを含むユーザーを ID で識別するには、エスケープ形式を有効にします ( |
メッセージアクション |
アプリがインストールされているワークスペースに属するユーザーのみが、メッセージアクションを呼び出せます。 |
インタラクティブメッセージ |
外部ユーザーからのアクションを処理し、権限によってアクセスが制限される場合はユーザーに通知します。 |
リンクの展開 |
アプリがインストールされているワークスペースのユーザーが投稿したリンクは、プライバシーにかかわるものでない限り、チャンネル全体に展開されます。外部メンバーが投稿したリンクでは、アプリがそのメンバーのワークスペースにもインストールされていない限り、 |
ボットユーザー |
ボットユーザーは、インストール先のワークスペースにいるすべてのローカルユーザーに加えて、共通の共有チャンネルがある外部ユーザーにもダイレクトメッセージ (DM) を送信できます。 |
オーガナイゼーション間で共有されるチャンネルの計画とサポートに関する API ドキュメントで、これらの考慮事項やそのほかの情報について確認してください。
これで、外部と共有されるチャンネルへの対応が必要な場面を判断し、アプリでそのチャンネルをどのようにサポートできるかを説明できるようになりました。こうした知識を活用して、アプリの機能とユーザー体験を向上させることができます。
