connector-slack について
connector-slack は、生成された slack-client パッケージを通じて Caffeine canister に Slack メッセージ機能を追加する実験的なスキルです。設定したベアラートークンでアプリまたは指定ユーザーとして投稿できますが、レスポンスのデコードは実装済みで、実環境では未検証です。
主な機能
- 01chatPostMessage によるメッセージ投稿
- 02ボットまたはユーザートークンの選択
- 03管理者限定セッターによるトークン保存
- 04slack-client 経由の認証リクエスト
- 05メッセージ関連モジュールの生成 API
活用シーン
- 01Slack チャンネルへのアプリ通知
- 02指定ユーザーとしてのメッセージ送信
- 03Caffeine canister への Slack メッセージ機能追加
- 04ワークスペース管理者向けのトークンアクセス設定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ caffeinelabs/ skills --skill connector-slackインストール後、Claude Code で/connector-slackを入力して読み込まれたか確認します。
詳細
Slack コネクター(実験的)
Caffeine キャニスターから Slack ワークスペースにメッセージを投稿します。
⚠️ 実験的(
[email protected])。 実際の Slack 環境で検証済み: リクエスト経路 — 実際のchat.postMessageによる投稿を確認済みです(以前のクエリとフォームの不具合は解決済みです。POST パラメーターはapplication/x-www-form-urlencodedの本文に含めます)。 0.1.0 で実装済みですが、実際の環境ではまだ検証していません: 成功レスポンスのデコード({"ok":true,…}→ 成功スキーマ)と、{"ok":false}エラーエンベロープのルーティング(それぞれの動作については既知の制限を参照してください)。そのため、レスポンス側のコードは完成していますが、動作は未検証です。diagnosticsが有効なので、デコードに失敗すると Slack の生の本文が表示されます。デコード済みの成功レスポンスを実際の環境で一度確認するまでは、Slack を完全にサポートされたプラットフォーム機能として紹介しないでください。判定基準はバージョン番号ではなく、この確認です。
オーケストレーターのルーティングに関する注意事項
ユーザー、仕様、または以前のタスクで Slack、チャンネルへの投稿、Slack ワークスペースへの通知に言及している場合は、このスキルを読み込んでください。生成された slack-client パッケージが推奨される方法です。https://slack.com/api/* への生の ic.http_request は、認証、パーセントエンコーディング、JSON 解析を手作業で再実装するアンチパターンです。
意図 → 機能の対応関係:
| ユーザーの意図 | 機能 |
|---|---|
| アプリとして Slack チャンネルにメッセージを投稿する | ボットトークン(xoxb-)を使った slack-client の chatPostMessage |
| Slack に特定の個人として投稿する | ユーザートークン(xoxp-)を使った slack-client の chatPostMessage |
コードを生成する前に、トークンの選択肢をプロンプトを送ったユーザーに伝えてください(ボットかユーザーか。1 行のルールとトレードオフについては認証モデルを参照してください)。また、トークンの入手先も案内してください。トークンを貼り付けないと先へ進めないため、これを早めに伝えることで、初回使用時に行き詰まるアプリを避けられます。
トークンは人が作成する必要があるものなので、バックエンドがコンパイルできただけではビルドは完了しません。アプリ自体が管理者にトークンの入手方法を案内し、貼り付ける場所を用意した時点で完了です。手順についてはボットトークンの取得、チェックする項目についてはリクエストするスコープ、チャンネル ID についてはチャンネルの指定、必ず含めるページについてはフロントエンドを参照してください。完了メッセージでもこれらの手順を繰り返してください。チャットはアプリよりも長く残らず、管理者の記憶にも残らないためです。
この生成対象の範囲は、メッセージングコアの chat、conversations、users、files、reactions、pins の各ファミリー(API モジュール 10 個)です。モジュールごとの内訳については利用可能な API サーフェスを参照してください。
その他の Slack メソッドは、仕様が再生成されるまで対象外です。
認証モデル — ボットトークン(xoxb-)またはユーザートークン(xoxp-)
どちらもベアラー認証情報で、クライアントは同じように扱いますが、ワークスペース上で誰が操作しているように見えるかが異なります。コードを書く前に、どちらを使うかプロンプトを送ったユーザーに確認し、トレードオフを伝えてください。Slack 上でアプリがどう表示されるかが変わり、再インストールしないと後から切り替えられないためです。
| ユーザーがメッセージを次のように表示したい場合… | トークン | 伝えるべき影響 |
|---|---|---|
アプリ自体として(投稿にはアプリ名と APP バッジが表示されます) | xoxb- (デフォルト — こちらを推奨) | ワークスペース全体で使える、従業員に依存しない認証情報です。ボットは投稿先の各チャンネルに招待する必要があります(/invite @YourApp)。招待しないと Slack は not_in_channel を返します。参加していないプライベートチャンネルや DM は閲覧できません。 |
| 特定の個人として(投稿にはその人の名前とアバターが表示されます) | xoxp- | すべての操作がその人に帰属し、その人の操作として監査されます。その人がアクセスできる場所には、チャンネルへの招待なしでアクセスできます。その人がワークスペースを離れるか、アプリを取り消すと使えなくなります。一部のユーザー専用 API(例:search.messages)で必要です。 |
「アプリから通知やアラートを投稿したい」という依頼なら、xoxb- を使います。xoxp- を選ぶのは、ユーザーが明示的に人間から送信されたように見せたい場合、またはユーザー専用 API が必要な場合に限ります。どちらを選んだか、その理由とあわせて伝えてください。
ボットトークンの取得(xoxb-)
- https://api.slack.com/apps → Create New App → From scratch を選択し、ワークスペースを選びます。
- OAuth & Permissions → Scopes → Bot Token Scopes:ビルドで必要なスコープを追加します。最低限
chat:writeが必要です。その他のスコープについては、以下の 要求するスコープ を参照してください。後から追加すると再インストールが必要になるため、今のうちにリストを確定してください。 - Install to Workspace → 認可し、
xoxb-で始まる Bot User OAuth Token をコピーします。 - Slack で、対象の各チャンネルにアプリを招待します:
/invite @YourApp。これを省略することが、最もよくある初回エラー(not_in_channel)の原因です。
要求するスコープ
上記のステップ 2 で、アプリにできることが決まります。管理者が必要なスコープを推測することはできないため、ビルドで実際に使う機能から導き出し、設定 UI にはそれらだけを正確に表示してください(フロントエンド を参照)。ボットトークンのスコープ:
| アプリに必要な機能… | ボットスコープ |
|---|---|
| ボットが招待されているチャンネルに投稿する | chat:write |
| 招待なしですべてのパブリックチャンネルに投稿する | chat:write.public |
| チャンネル名を ID に解決する、パブリックチャンネルを一覧表示する | channels:read |
| ボットが参加しているプライベートチャンネルを一覧表示する | groups:read |
メッセージを読み取る(conversationsHistory / conversationsReplies) | channels:history、プライベートチャンネルには groups:history も必要 |
| ユーザーを一覧表示する/検索する | users:read、usersLookupByEmail には users:read.email も必要 |
人に DM を送る(conversationsOpen → chatPostMessage) | im:write |
| 絵文字リアクションを追加する | reactions:write |
| メッセージをピン留めする | pins:write |
| ファイルをアップロードする/読み取る | files:write、files:read |
⚠️ 後からスコープを追加すると、トークンは無効になります。 Slack では、スコープを変更するたびに再インストールが必要です。再インストールすると新しい
xoxb-が発行されます。古いトークンは既存のスコープでは引き続き機能しますが、新しいスコープは追加されません。そのため、管理者が新しいトークンを貼り付けるまで、アプリはmissing_scopeエラーで失敗します。最初にスコープのリストを確定し、設定ページは一度きりではなく、何度でも貼り付けられるようにしてください。
ユーザートークンの取得(xoxp-)
- 同じアプリで OAuth & Permissions → Scopes → User Token Scopes(ボットスコープとは別のリスト)を開き、たとえば
chat:write、search:readを追加します。 - Install to Workspace(アプリがすでに存在する場合は Reinstall)を選択して認可します。トークンはAllow をクリックした人を表します。
xoxp-で始まる User OAuth Token をコピーします。
この手順では、管理者が指定する単一の xoxp- をサポートしています。これは同じセッターを通り、同じ config.auth を使います。ここで対象外なのはユーザーごとの OAuth、つまり各エンドユーザーが自身のアカウントを認可する方式です。これにはリダイレクト、コード交換、更新の一連のフローが必要ですが、Slack 用のヘルパーはまだありません。独自に実装しようとしないでください。
トークンを canister に渡す
どちらの種類のトークンでも、ワークスペース管理者が管理者権限で制限されたセッターを通じて canister に貼り付けます。制限には
AccessControl.hasPermission(state, caller, #admin) を使用します。トークンを保持するのは canister のみで、フロントエンドに返すことは決してありません。
⚠️ 最初に呼び出した人が所有権を取得する方式で、セッターを制限してはいけません。 IC では、認証されていないすべての呼び出し元が同じ匿名 principal です。そのため、匿名の呼び出しが先に所有権を取得すると、すべての匿名呼び出し元が
caller == ownerのチェックを通過し、ワークスペースのトークンを上書きできます。以下の例のように、認可コンポーネントの#admin権限を使用してください。
その後、canister は config.auth = ?#bearer(token) を通じてのみクライアントにトークンを渡します。すべてのメソッドはこれを Authorization: Bearer … ヘッダーに変換します。トークンを引数に取るメソッドはなく、認証情報を URL に含めるメソッドもないため、ログに記録されるクエリ文字列から漏洩することはありません。
Outcall はすでにレプリケーションされません
defaultConfig には is_replicated = ?false が設定されているため、レコード更新でこれを引き継いだものは、そのまま正しい状態です。覚えておくことも、追加することもありません。
?true や null に上書きしないでください。レプリケーションされた outcall はサブネット内のすべてのノードからリクエストを繰り返します。Slack の場合、レプリカごとにメッセージが1回ずつ投稿され(重複は約13件)、Authorization: Bearer xoxb-…/xoxp-… ヘッダーがすべてのノードから送信されます。また、Slack の応答にはリクエストごとに異なる ts が含まれるため、いずれにしてもコンセンサスは失敗します。
バックエンド
依存関係を追加する
以下のレシピの管理者向けゲートには、クライアントとともに認可コンポーネントが必要です。
mops add [email protected]
mops add [email protected]
生成される関数は
ChatApi.chatPostMessage(config, channel, asUser, attachments, blocks, iconEmoji, iconUrl, linkNames, mrkdwn, parse, replyBroadcast, text, threadTs, unfurlLinks, unfurlMedia, username) です。使用しないオプションには、空文字列/false を渡してください。トークンは引数ではありません。config.auth だけを経由します(上記の 認証モデル を参照)。これはクライアントのすべてのメソッドに当てはまります。
import AccessControl "mo:caffeineai-authorization/access-control";
import MixinAuthorization "mo:caffeineai-authorization/MixinAuthorization";
import MixinSlackConfig "mixins/slack-config";
import MixinSlackMessaging "mixins/slack-messaging";
actor {
let accessControlState : AccessControl.AccessControlState;
include MixinAuthorization(accessControlState, null);
// Admin-held Slack token, `xoxb-…` or `xoxp-…` — never returned to the frontend.
let slackConfig : { var token : Text };
include MixinSlackConfig(accessControlState, slackConfig);
include MixinSlackMessaging(slackConfig);
};
マイグレーションチェーンの先頭:
import AccessControl "mo:caffeineai-authorization/access-control";
module {
type NewActor = {
accessControlState : AccessControl.AccessControlState;
slackConfig : { var token : Text };
};
public func migration(_old : {}) : NewActor {
{
accessControlState = AccessControl.initState();
slackConfig = { var token = "" };
};
};
};
import AccessControl "mo:caffeineai-authorization/access-control";
import Runtime "mo:core/Runtime";
mixin (
accessControlState : AccessControl.AccessControlState,
slackConfig : { var token : Text },
) {
public query func isSlackConfigured() : async Bool {
slackConfig.token.size() > 0;
};
// Admin-only; accepts either token flavour. NOTE: `#admin` — never a
// first-caller-claims-ownership check,
// which the shared anonymous principal would defeat.
public shared ({ caller }) func setSlackToken(token : Text) : async () {
if (not AccessControl.hasPermission(accessControlState, caller, #admin)) {
Runtime.trap("Unauthorized: Only admins can set the Slack token");
};
slackConfig.token := token;
};
};
import Principal "mo:core/Principal";
import Runtime "mo:core/Runtime";
import { chatPostMessage } "mo:slack-client/Apis/ChatApi";
import { defaultConfig; type Config } "mo:slack-client/Config";
mixin (slackConfig : { var token : Text }) {
// Token rides `config.auth`; `defaultConfig` is already non-replicated.
func slackClientConfig(token : Text) : Config {
{
defaultConfig with
auth = ?#bearer(token);
max_response_bytes = ?(1_000_000 : Nat64);
};
};
// Post `text` to `channel` (channel ID like "C012AB3CD" or "#general").
// Returns the posted message timestamp (`ts`).
public shared ({ caller }) func postSlackMessage(channel : Text, text : Text) : async Text {
if (caller.isAnonymous()) Runtime.trap("Sign in to post to Slack");
if (slackConfig.token.size() == 0) {
Runtime.trap("Slack is not configured (an admin must set the token)");
};
let res = await* chatPostMessage(
slackClientConfig(slackConfig.token), // token rides config.auth — never a URL param
channel,
"", // asUser
"", // attachments
"", // blocks
"", // iconEmoji
"", // iconUrl
false, // linkNames
true, // mrkdwn
"", // parse
false, // replyBroadcast
text, // text
"", // threadTs
false, // unfurlLinks
false, // unfurlMedia
"", // username
);
res.ts;
};
};
チャンネルの指定 — ID と、ボットが参加していること
chatPostMessage の最初の引数は チャンネル ID です。パブリックまたはプライベートチャンネルは C…、DM は D…、旧式のグループは G… です。#general のような名前でも パブリック チャンネルなら引き続き解決できますが、非推奨で、プライベートチャンネルでは機能しません。ID を使って保存し、名前をハードコードしないでください。
人間が ID を確認する場所(完了メッセージだけでなく、UI にもこの手順を記載してください):
- チャンネルを開き、ヘッダーにある名前をクリック → 概要 タブ → パネルの下部に ID(
C012AB3CD)が表示されます。コピーボタンもあります。 - または、サイドバーにあるチャンネルを右クリック → リンクをコピー →
…/archives/C012AB3CDの最後のパス要素が ID です。
Canister が ID を取得する方法: ConversationsApi.conversationsList を使い、name で照合します(channels:read が必要です)。一度解決したら、安定した変数に ID をキャッシュしてください。投稿のたびに解決しないでください。outcall とサイクルが倍増します。
ボットはチャンネルに参加している必要があります。参加していない場合、chatPostMessage は not_in_channel を返します。これは初回に最もよく発生する失敗です。対処方法を、推奨順に3つ示します。
- 管理者が対象チャンネルで
/invite @YourAppを実行する。 chat:write.publicを付与する。招待なしで、ボットが任意の パブリック チャンネルに投稿できるようになります。conversationsJoinを呼び出す(パブリックチャンネルのみ。channels:joinが必要です)。
個人に DM を送る方法: usersLookupByEmail(users:read.email が必要)または
usersList でユーザー ID を取得し、conversationsOpen を呼び出して、返された D… チャンネルに投稿します。im:write が必要です。
利用可能な API サーフェス
このドロップには 10 個の API モジュール/約 140 個の操作が含まれています。実行時に検証済みなのは chatPostMessage のみです(既知の制限を参照)。残りは同じ仕様から生成され、型チェックも通っていますが、レスポンスのデコードは未検証として扱ってください。
| モジュール | 用途 | 代表的な関数 |
|---|---|---|
ChatApi | 投稿、編集、削除、パーマリンク | chatPostMessage、chatUpdate、chatDelete、chatPostEphemeral、chatScheduleMessage、chatGetPermalink |
ChatScheduledMessagesApi | スケジュール済みメッセージのキュー | chatScheduledMessagesList |
ConversationsApi | チャンネル:一覧、読み取り、メンバーシップ、ライフサイクル | conversationsList、conversationsHistory、conversationsReplies、conversationsInfo、conversationsOpen、conversationsJoin、conversationsInvite、conversationsCreate |
UsersApi | ディレクトリ検索、プレゼンス | usersList、usersInfo、usersLookupByEmail、usersConversations、usersGetPresence |
UsersProfileApi | プロフィールフィールド | usersProfileGet、usersProfileSet |
ReactionsApi | 絵文字リアクション | reactionsAdd、reactionsRemove、reactionsList |
PinsApi | ピン留めされたメッセージ | pinsAdd、pinsRemove、pinsList |
FilesApi | ファイルの一覧/メタデータ/共有 | filesList、filesInfo、filesDelete |
FilesCommentsApi | ファイルのコメント | filesCommentsDelete |
FilesRemoteApi | 外部ファイルのレジストリ | filesRemoteAdd、filesRemoteInfo、filesRemoteList |
バイナリーのアップロード/ダウンロードは、このクライアントからは利用できません(マルチパートボディは、生成された JSON/フォームのサーフェスの対象外です)。外部 URL にあるファイルを登録する filesRemoteAdd が、サポートされている代替手段です。
フロントエンド
Slack には OAuth コールバックは不要です。認証情報は管理者が貼り付ける有効期間の長いトークンであるため、リダイレクト URI も /connect/slack ルートも、ユーザーごとのハンドシェイクもありません。これらを構築しないでください。Slack ビルドで必ず実装すべきなのは、管理者がトークンを取得して入力できるページです。これらは提案ではなく受け入れ基準であり、満たさないビルドは未完成ではなく、壊れています。
- トークンページが存在し、アクセス可能であること。 トークンを入力するページのない「Slack に投稿」機能は使えません。ログイン済みの管理者は、ナビゲーションまたは未設定時のプロンプトから
/settings/slackにアクセスできる必要があります。 - トークンの生成手順が UI に表示されていること。 エージェントのチャット返信だけに記載してはいけません。管理者はチャットがなくなった数週間後に、このページに戻ってくることがあります。
- 正確なスコープ一覧が表示されていること。 管理者がこのアプリに必要なスコープを推測することはできません。ビルドで実際に使用するスコープを表示してください(リクエストするスコープ)。
-
ログインフロー — 必須。
setSlackTokenは#adminを条件としているため、アプリでは匿名ではない呼び出し元が必要です。ログイン、useInternetIdentity/useActorの配線、および管理者ロールのゲートは、extension-authorizationから取り入れてください。 -
管理者設定ページ —
/settings/slack(管理者のみアクセス可能)。必須項目:- 入力欄の上に「Slack ボットトークンの取得方法」パネルを配置し、所要時間約5分の初回セットアップとして、次の手順を番号付きで表示します(エージェントの完了メッセージにも、これらを一字一句そのまま記載する必要があります)。
- https://api.slack.com/apps を開く → Create New App → From scratch → 名前を付け、ワークスペースを選択します。
- OAuth & Permissions → Scopes → Bot Token Scopes → このページに記載されているスコープを追加します。
- Install to Workspace → Allow → Bot User OAuth Token をコピーします(
xoxb-で始まります)。 - 下に貼り付けて保存します。
- Slack で、アプリが投稿する各チャンネルで
/invite @YourAppを実行します。 https://api.slack.com/apps を開く便利なリンクも含めます。
- スコープ一覧はコピー可能なテキストとして表示します。このビルドで使用するスコープだけを正確に表示し、表全体は表示しません。
setSlackToken(token)にバインドされたパスワード入力欄を1つ設けます。Enter キーで送信し、成功時に入力欄をクリアします。また、スコープ変更時には再インストールと新しいトークンが必要になるため、一度きりのフォームにせず、再度貼り付けられるようにします。isSlackConfigured()(Bool)に基づいて、「設定済み」/「未設定」のステータスを表示します。トークンは、末尾を伏せ字にしたものも含め、決して表示しません。- アプリが固定チャンネルに投稿する場合、そのチャンネルの ID もこのページに配置します。設定ミックスインを
{ var token : Text; var channel : Text }に拡張し、管理者のみ実行できるsetSlackChannelを設けます。また、「チャンネル ID の確認方法」のヒント(チャンネルの指定を参照)をフィールドの横に表示します。ユーザーに、由来の説明なしに生の ID を入力させてはいけません。 - ページにアクセスできるようにします。
isCallerAdminが true の場合は共通 Layout のナビゲーションからこのページにリンクし、そうでない場合はリンクを表示しません。リンクはこのページ内ではなく、ナビゲーションの定義箇所に追加します。
- 入力欄の上に「Slack ボットトークンの取得方法」パネルを配置し、所要時間約5分の初回セットアップとして、次の手順を番号付きで表示します(エージェントの完了メッセージにも、これらを一字一句そのまま記載する必要があります)。
-
空状態での案内。
isSlackConfigured()がfalseの場合、「Slack に送信」ボタンを機能しない状態で表示してはいけません。管理者には/settings/slackへの「Slack を設定」リンクを表示し、管理者以外には説明を表示します。例:「Slack はまだ設定されていません。管理者が Settings でワークスペーストークンを追加する必要があります。」 -
Slack のエラーを翻訳します。 論理的な失敗は、Slack 独自の
error文字列をメッセージに含む rejected な呼び出しとして返されます(既知の制限を参照)。少なくとも次の3つは、生のエラーを表示するのではなく、対処方法を表示します。not_in_channel→ 「アプリをチャンネルに招待してください:/invite @YourApp」invalid_auth/not_authed→ 「Slack トークンが無効です。Settings で新しいトークンを貼り付けてください」(管理者にはリンクを表示します)channel_not_found→ 「チャンネル ID を確認してください」(確認方法のヒントも表示します)missing_scope→ 「アプリに別の Slack スコープが必要です。スコープを追加して再インストールし、新しいトークンを貼り付けてください」
推奨ルート構成:
/ → Main UI (any signed-in user; empty-state when unconfigured)
/settings/slack → Admin token + default channel (admin-only)
# No /connect/slack: Slack uses a pasted long-lived token, not a redirect flow.
composer が Caffeine ユーザーに伝えるべきこと
人間が Slack アプリを作成してトークンを貼り付けるまで、このアプリは動作しません。そのため、composer の完了メッセージは成果物の一部であり、単なる要約ではありません。必ず次の順序で含めてください。
- トークンが必要であることと、誰が入力するか — サインイン後、ナビゲーションからアクセスできる
/settings/slackで管理者が入力します。 - Frontend の項目 2 にある5 つの番号付き手順をそのまま記載します。https://api.slack.com/apps でアプリを作成し、ボットのスコープを追加し、Install to Workspace を実行して、
xoxb-…トークンをコピーして貼り付け、各対象チャンネルで/invite @YourAppを実行します。 - Scopes to request にあるこのビルドで必要なスコープの正確なリスト — 説明ではなく、ユーザーが Slack のスコープ選択画面にそのままコピーできるテキストとして記載します。
- チャンネル ID の確認方法 — チャンネルを指定する必要がある場合は、Addressing a channel にある About タブとリンクのコピー手順を記載します。
- 失敗時の対応をそれぞれ 1 行で記載します。
not_in_channel→ アプリを招待する;invalid_auth→ トークンを貼り直す;channel_not_found→ ID を確認する;missing_scope→ スコープを追加して再インストールし、新しいトークンを貼り付ける。
「Settings で Slack を設定してください」と簡略化したり、Slack のドキュメントへのリンクに置き換えたりしないでください。ユーザーはビルドの途中で、Slack アプリのダッシュボードをまだ見たことがない可能性が非常に高く、composer を見ています。設定ページのパネルと同じ表現を使い、両者に食い違いが生じないようにしてください。
既知の制限事項(実験的)
{"ok": false}は拒否された呼び出しとして報告されます。 Slack は論理エラー(トークン不正、スコープ不足、チャンネルが見つからないなど)を、HTTP 200 で{"ok": false, "error": "…"}として通知します。0.1.0 以降、クライアントはこれを検出してエラーパスに渡すため、デコード失敗ではなく、not_authed、invalid_auth、channel_not_foundなど、Slack 独自のerror文字列が拒否メッセージに表示されます。拒否された呼び出しとして処理してください:try { … } catch (e) { Error.message(e) }。if (res.ok) …は記述しないでください。返された値はすでにデコード済みなので、ここでのokは常にtrueとなり、このチェックは無効なコードです。これらを#ok/#errの戻り値にすると、すべてのメソッドのシグネチャが変わるため、その対応はメジャーリリースまで保留されます。- 到達性(IPv4)— プロキシは不要です。
slack.comは IPv4 のみをサポートしているため、以前は IC HTTPS アウトコールから到達できませんでした。2025-08-04 以降、IC はまず直接(IPv6)接続を試し、失敗した場合は IC が管理する SOCKS プロキシ経由で自動的に再試行するため、IPv4 のみをサポートするホストでも動作します。config.baseUrlはデフォルトのhttps://slack.com/apiのままにしてください。TLS セッションはノードと Slack の間でエンドツーエンドで確立されるため、プロキシから見えるのは暗号文のみです。フォールバック経由では多少レイテンシーが増えることを想定してください(レプリケーションされないアウトコールも低速な経路です — 上記を参照)。 - 認証はすべてのメソッドでヘッダーベースです。 トークンは
Authorization: Bearerヘッダーのみで送信され、URL には含まれません。そのため、ログに記録されるクエリー文字列に残ることはなく、メソッドの引数にもなりません。 - 実行時検証は一部のみです。 リクエストの形式は実際の Slack に対して検証済みです(投稿が実際に届きます)。成功レスポンスのデコードは、まだ実行時に確認されていません。
diagnosticsが有効なので、デコードに失敗した場合は Slack の生のレスポンス本文が表示されます。スキーマは、アーカイブされた(約 2020 年の)仕様リビジョンからも生成されています。
関連情報
mops add [email protected]— 生成された Slack Web API バインディングです。- Slack Web API reference — すべてのメソッド、そのスコープ、エラー文字列を確認できます。
chat.postMessage— 実行時に検証済みの唯一のパスであり、channel/text/blocksのセマンティクスを確認できます。- Slack token types — bot(
xoxb-)と user(xoxp-)の違い、および再インストールによる影響を確認できます。 - Slack app management — 管理者がアプリを作成し、スコープを設定して、ワークスペースにインストールする場所です。
- extension-authorization — 必須の前提条件です。Internet Identity のログイン、
useInternetIdentity/useActorの配線、トークン設定に必要な#adminロールゲートについて説明します。