Developer and self-hosted
Mattermost
ステータス: ダウンロード可能なPlugin(ボットトークン + WebSocketイベント)。チャンネル、プライベートチャンネル、グループDM、DMに対応しています。Mattermostはセルフホスト可能なチームメッセージングプラットフォームです(mattermost.com)。
インストール
npmレジストリ
openclaw plugins install @openclaw/mattermostローカルチェックアウト
openclaw plugins install ./path/to/local/mattermost-plugin詳細: Plugin
クイックセットアップ
Pluginが利用可能であることを確認する
上記のコマンドで@openclaw/mattermostをインストールし、Gatewayがすでに実行中の場合は再起動します。
Mattermostボットを作成する
Mattermostボットアカウントを作成し、ボットトークンをコピーして、ボットが読み取る必要のあるチームとチャンネルに追加します。
ベースURLをコピーする
MattermostのベースURL(例: https://chat.example.com)をコピーします。末尾の/api/v4は自動的に削除されます。
OpenClawを設定してGatewayを起動する
最小構成:
{ channels: { mattermost: { enabled: true, botToken: "mm-token", baseUrl: "https://chat.example.com", dmPolicy: "pairing", }, },}非対話形式の代替方法:
openclaw channels add --channel mattermost --bot-token <token> --http-url https://chat.example.comネイティブスラッシュコマンド
ネイティブスラッシュコマンドはオプトインです。有効にすると、OpenClawはボットが所属するすべてのチームにoc_*スラッシュコマンドを登録し、Gateway HTTPサーバーでコールバックPOSTを受信します。
{ channels: { mattermost: { commands: { native: true, nativeSkills: true, callbackPath: "/api/channels/mattermost/command", // MattermostからGatewayへ直接到達できない場合に使用します(リバースプロキシ/公開URL)。 callbackUrl: "https://gateway.example.com/api/channels/mattermost/command", }, }, },}登録されるコマンド: /oc_status、/oc_model、/oc_models、/oc_new、/oc_help、/oc_think、/oc_reasoning、/oc_verbose、/oc_queue。nativeSkills: trueを指定すると、スキルコマンドも/oc_<skill>として登録されます。
動作に関する注意事項
nativeとnativeSkillsのデフォルトは"auto"で、Mattermostでは無効として解決されます。明示的にtrueに設定してください。callbackPathのデフォルトは/api/channels/mattermost/commandです。callbackUrlを省略すると、OpenClawはhttp://<gateway.customBindHost or localhost>:<gateway.port, default 18789><callbackPath>を導出します。ワイルドカードバインドホスト(0.0.0.0、::)はlocalhostにフォールバックします。- マルチアカウント構成では、
commandsをトップレベルまたはchannels.mattermost.accounts.<id>.commandsの下に設定できます(アカウントの値がトップレベルのフィールドを上書きします)。 - 他のインテグレーションによって作成された同じトリガーの既存スラッシュコマンドは変更されません(登録時にスキップされます)。ボットが作成したコマンドは、コールバックURLにずれが生じると更新または再作成されます。
- コマンドコールバックは、OpenClawが
oc_*コマンドを登録した際にMattermostから返されるコマンドごとのトークンで検証されます。 - OpenClawは各コールバックを受け入れる前に現在のMattermostコマンド登録を更新するため、削除または再生成されたスラッシュコマンドの古いトークンは、Gatewayを再起動しなくても受け入れられなくなります。
- Mattermost APIがコマンドが引き続き最新であることを確認できない場合、コールバック検証はフェイルクローズします。失敗した検証は短時間キャッシュされ、同時ルックアップはまとめられ、新しいルックアップの開始はリプレイ負荷を制限するためコマンドごとにレート制限されます。
- 登録に失敗した場合、起動が部分的だった場合、またはコールバックトークンが解決されたコマンドの登録済みトークンと一致しない場合、スラッシュコールバックはフェイルクローズします(あるコマンドで有効なトークンを使用して、別のコマンドの上流検証に到達することはできません)。
- 受け入れられたコールバックには、一時的な「処理中...」という応答で受信確認が行われます。実際の回答は通常のメッセージとして届きます。
到達可能性の要件
コールバックエンドポイントはMattermostサーバーから到達可能でなければなりません。
- MattermostがOpenClawと同じホスト/ネットワーク名前空間で実行されている場合を除き、
callbackUrlをlocalhostに設定しないでください。 - そのURLが
/api/channels/mattermost/commandをOpenClawにリバースプロキシしている場合を除き、callbackUrlをMattermostのベースURLに設定しないでください。 - 簡単な確認方法は
curl https://<gateway-host>/api/channels/mattermost/commandです。GETは404ではなく、OpenClawから405 Method Not Allowedを返す必要があります。
Mattermostの送信許可リスト
コールバック先がプライベート/tailnet/内部アドレスの場合は、コールバックのホスト/ドメインを含めるようにMattermostのServiceSettings.AllowedUntrustedInternalConnectionsを設定します。
完全なURLではなく、ホスト/ドメインのエントリを使用してください。
- 良い例:
gateway.tailnet-name.ts.net - 悪い例:
https://gateway.tailnet-name.ts.net
環境変数(デフォルトアカウント)
環境変数を使用する場合は、Gatewayホストに以下を設定します。
MATTERMOST_BOT_TOKEN=...MATTERMOST_URL=https://chat.example.com
チャットモード
Mattermost は DM に自動的に応答します。チャンネルでの動作は chatmode で制御します。
oncall (default)
チャンネルでは @メンションされた場合にのみ応答します。
onmessage
チャンネルのすべてのメッセージに応答します。
onchar
メッセージがトリガープレフィックスで始まる場合に応答します。
設定例:
{ channels: { mattermost: { chatmode: "onchar", oncharPrefixes: [">", "!"], // デフォルト }, },}注:
oncharでも明示的な @メンションには応答します。channels.mattermost.requireMentionも引き続き適用されますが、chatmodeが推奨されます。チャンネルごとのgroups.<channelId>.requireMention設定は、どちらよりも優先されます。- ボットがチャンネルのスレッドに表示される返信を送信した後は、同じスレッド内の後続メッセージに新たな @メンションや
oncharプレフィックスがなくても応答するため、複数ターンのスレッド会話が継続します。参加状態は、そのスレッドでボットが最後に返信してから 7 日間記憶され、Gateway の再起動後も保持されます。ボットが閲覧しただけのスレッドには影響しません。明示的なメンションを再び必須にするには、新しいトップレベルメッセージを開始してください。 - 参加済みスレッドのフォローアップがメンションゲートを回避しないようにするには、
channels.mattermost.implicitMentions.threadParticipation: falseを設定します。アカウント単位のオーバーライドにはchannels.mattermost.accounts.<id>.implicitMentionsを使用します。現在 Mattermost はreplyToBotまたはquotedBotの情報を生成しないため、これらのフラグはここでは効果がありません。
スレッドとセッション
チャンネルおよびグループへの返信をメインチャンネルに残すか、トリガーとなった投稿の下にスレッドを開始するかを制御するには、channels.mattermost.replyToMode を使用します。
off(デフォルト):受信した投稿がすでにスレッド内にある場合にのみ、スレッド内で返信します。first:トップレベルのチャンネル/グループ投稿では、その投稿の下にスレッドを開始し、会話をスレッドスコープのセッションにルーティングします。allとbatched:現在の Mattermost ではfirstと同じ動作です。Mattermost にスレッドルートが作成されると、後続のチャンクとメディアも同じスレッド内で継続するためです。replyToModeが設定されている場合でも、ダイレクトメッセージのデフォルトはoffです。
direct、group、または channel のチャットでモードをオーバーライドするには、channels.mattermost.replyToModeByChatType を使用します。ダイレクトメッセージでスレッドを使用するには、direct を設定します。
off(デフォルト):ダイレクトメッセージはスレッド化されず、1 つの継続的なセッションに保持されます。first、all、またはbatched:トップレベルのダイレクトメッセージごとに、新しい独立したセッションを使用する Mattermost スレッドを開始します。
{ channels: { mattermost: { replyToMode: "all", replyToModeByChatType: { direct: "first", }, }, },}注:
- スレッドスコープのセッションでは、トリガーとなった投稿 ID をスレッドルートとして使用します。
firstとallは現在同等です。Mattermost にスレッドルートが作成されると、後続のチャンクとメディアも同じスレッド内で継続するためです。- チャット種別ごとのオーバーライドは
replyToModeより優先されます。directのオーバーライドがなければ、既存のデプロイではスレッド化されていないフラットな DM が維持されます。
アクセス制御(DM)
- デフォルト:
channels.mattermost.dmPolicy = "pairing"(不明な送信者にはペアリングコードが発行されます)。その他の値:allowlist、open、disabled。 - 承認方法:
openclaw pairing list mattermostopenclaw pairing approve mattermost <CODE>
- 公開 DM:
channels.mattermost.dmPolicy="open"とchannels.mattermost.allowFrom=["*"](設定スキーマによりワイルドカードが必須になります)。 channels.mattermost.allowFromにはユーザー ID(推奨)とaccessGroup:<name>エントリを指定できます。アクセスグループを参照してください。
チャンネル(グループ)
- デフォルト:
channels.mattermost.groupPolicy = "allowlist"(メンション必須)。 channels.mattermost.groupAllowFromで送信者を許可リストに登録します(ユーザー ID を推奨)。channels.mattermost.groupAllowFromにはaccessGroup:<name>エントリを指定できます。アクセスグループを参照してください。- チャンネルごとのメンションのオーバーライドは
channels.mattermost.groups.<channelId>.requireMentionに、デフォルト設定はchannels.mattermost.groups["*"].requireMentionに配置します。 @usernameの照合は変更可能で、channels.mattermost.dangerouslyAllowNameMatching: trueの場合にのみ有効になります。- 公開チャンネル:
channels.mattermost.groupPolicy="open"(メンション必須)。 - 解決順序:
channels.mattermost.groupPolicy、次にchannels.defaults.groupPolicy、最後に"allowlist"。 - ランタイムに関する注記:
channels.mattermostセクションが完全に欠落している場合、グループチェックではランタイムがフェイルクローズしてgroupPolicy="allowlist"になります(channels.defaults.groupPolicyが設定されている場合も同様)。また、警告が一度だけログに記録されます。
例:
{ channels: { mattermost: { groupPolicy: "open", groups: { "*": { requireMention: true }, "team-channel-id": { requireMention: false }, }, }, },}外部配信のターゲット
openclaw message send または cron/webhooks では、次のターゲット形式を使用します。
| ターゲット | 配信先 |
|---|---|
channel:<id> |
ID で指定したチャンネル |
channel:<name> または #channel-name |
ボットが所属するチーム全体から名前で検索したチャンネル |
user:<id> または mattermost:<id> |
そのユーザーとの DM |
@username |
DM(Mattermost API でユーザー名を解決) |
外部への送信では、メッセージごとに添付ファイルを最大 1 個までサポートします。複数のファイルは別々に分けて送信してください。
DM チャンネルの再試行
OpenClaw が Mattermost の DM ターゲットに送信する際、最初にダイレクトチャンネルを解決する必要がある場合、デフォルトでは一時的なダイレクトチャンネル作成エラーを再試行します。
Mattermost plugin 全体でこの動作を調整するには channels.mattermost.dmChannelRetry を、1 つのアカウントで調整するには channels.mattermost.accounts.<id>.dmChannelRetry を使用します。デフォルト値:
{ channels: { mattermost: { dmChannelRetry: { maxRetries: 3, initialDelayMs: 1000, maxDelayMs: 10000, timeoutMs: 30000, }, }, },}注:
- これは DM チャンネルの作成(
/api/v4/channels/direct)のみに適用され、すべての Mattermost API 呼び出しには適用されません。 - 再試行ではジッター付き指数バックオフを使用し、レート制限、5xx レスポンス、ネットワークエラー、タイムアウトエラーなどの一時的なエラーに適用されます。
429以外の 4xx クライアントエラーは永続的なエラーとして扱われ、再試行されません。
プレビューストリーミング
Mattermost は、思考、ツールのアクティビティ、返信の部分的なテキストを 下書きプレビュー投稿 にストリーミングし、最終回答を安全に送信できるようになると、その場で確定します。partial モードでは、チャンクごとのメッセージでチャンネルを埋め尽くす代わりに、同じ投稿 ID のプレビューを更新します。block モードでは、完了したテキストとツールアクティビティのブロックの間でプレビューが切り替わるため、前のブロックは次のブロックで上書きされず、それぞれ独立した投稿として表示されたままになります。メディアまたはエラーを含む最終回答では、保留中のプレビュー編集をキャンセルし、使い捨てのプレビュー投稿を確定する代わりに通常の配信を使用します。
プレビューストリーミングは partial モードで デフォルトで有効 です。channels.mattermost.streaming.mode で設定します(従来のスカラー値またはブール値の streaming は openclaw doctor --fix によって移行されます):
{ channels: { mattermost: { streaming: { mode: "partial" }, // off | partial | block | progress }, },}ストリーミングモード
partial(デフォルト):返信が増えるにつれて編集され、最後に完全な回答で確定される 1 つのプレビュー投稿です。blockは、完了したテキストとツールアクティビティのブロックの間でプレビューを切り替えるため、各ブロックはその場で上書きされず、それぞれ独立した投稿として表示されたままになります。並列および連続するツール更新は、現在のツールアクティビティ投稿を共有します。progressは生成中にステータスプレビューを表示し、完了時にのみ最終回答を投稿します。offはプレビューストリーミングを無効にします。streaming.block.enabled: trueを指定すると、完了したアシスタントブロックは、1 つにまとめられた最終投稿ではなく、通常のブロック返信(個別の投稿)として引き続き配信されます。
ストリーミング動作に関する注記
- ストリームをその場で確定できない場合(たとえば、ストリーミング中に投稿が削除された場合)、OpenClaw は新しい最終投稿の送信にフォールバックするため、返信が失われることはありません。
- 思考のみのペイロードは、
> Thinkingブロック引用として届くテキストも含め、チャンネル投稿では抑制されます。他の画面で思考を表示するには/reasoning onを設定します。Mattermost の最終投稿には回答のみが保持されます。 - チャンネルマッピングの対応表については、ストリーミングを参照してください。
リアクション(メッセージツール)
message action=reactをchannel=mattermostとともに使用します。messageIdは Mattermost の投稿 ID です。emojiには、thumbsupや:+1:のような名前を指定できます(コロンは省略可能です)。- リアクションを削除するには
remove=true(ブール値)を設定します。 - リアクションの追加および削除イベントは、メッセージと同じ DM/グループポリシーチェックに従い、ルーティングされたエージェントセッションへシステムイベントとして転送されます。
例:
message action=react channel=mattermost target=channel:<channelId> messageId=<postId> emoji=thumbsupmessage action=react channel=mattermost target=channel:<channelId> messageId=<postId> emoji=thumbsup remove=true設定:
channels.mattermost.actions.reactions:リアクション操作を有効または無効にします(デフォルトは true)。- アカウントごとの上書き:
channels.mattermost.accounts.<id>.actions.reactions。
インタラクティブボタン(メッセージツール)
クリック可能なボタン付きのメッセージを送信します。ユーザーがボタンをクリックすると、エージェントは選択内容を受信して応答できます。
ボタンは、セマンティックな presentation ペイロード(通常のエージェント返信および message action=send 内)から生成されます。OpenClaw は値ボタンを Mattermost のインタラクティブボタンとしてレンダリングし、URL ボタンをメッセージテキスト内に表示したままにし、選択メニューを読みやすいテキストにダウングレードします。
message action=send channel=mattermost target=channel:<channelId> presentation={"blocks":[{"type":"buttons","buttons":[{"label":"Yes","value":"yes"},{"label":"No","value":"no"}]}]}プレゼンテーションボタンのフィールド:
labelstringrequired表示ラベル(別名:text)。
valuestringクリック時に返され、アクション ID として使用される値(別名:callback_data、callbackData)。url が設定されていない限り、クリック可能なボタンには必須です。
urlstringリンクボタン。インタラクティブボタンではなく、メッセージ本文内の label: url テキストとしてレンダリングされます。
style"primary" | "secondary" | "success" | "danger"ボタンのスタイル。Mattermost は、サポートしていない値にデフォルトのスタイルを適用します。
エージェントのシステムプロンプトでボタンのサポートを通知するには、チャンネル機能に inlineButtons を追加します:
{ channels: { mattermost: { capabilities: ["inlineButtons"], }, },}ユーザーがボタンをクリックした場合:
アクセスチェック
クリックしたユーザーは、メッセージ送信者と同じ DM/グループポリシーチェックに合格する必要があります。権限のないクリックには一時的な通知が表示され、無視されます。
ボタンを確認表示に置換
すべてのボタンが確認行(例:「✓ Yes selected by @user」)に置き換えられます。
エージェントが選択内容を受信
エージェントは選択内容を受信メッセージ(およびシステムイベント)として受け取り、応答します。
実装に関する注記
- ボタンのコールバックでは HMAC-SHA256 検証が使用されます(自動で行われ、設定は不要です)。
- クリック時に添付ブロック全体が置き換えられるため、すべてのボタンがまとめて削除されます。一部のみを削除することはできません。
- ハイフンまたはアンダースコアを含むアクション ID は自動的にサニタイズされます(Mattermost のルーティング制限)。
action_idが元の投稿上のアクションと一致しないクリックは、403(「不明なアクション」)として拒否されます。
設定と到達可能性
channels.mattermost.capabilities:機能文字列の配列。エージェントのシステムプロンプトでボタンツールの説明を有効にするには、"inlineButtons"を追加します。channels.mattermost.interactions.callbackBaseUrl:ボタンコールバック用の外部ベース URL(任意。例:https://gateway.example.com)。Mattermost から Gateway のバインドホストへ直接到達できない場合に使用します。- 複数アカウントの構成では、
channels.mattermost.accounts.<id>.interactions.callbackBaseUrl配下に同じフィールドを設定することもできます。 interactions.callbackBaseUrlを省略すると、OpenClaw はgateway.customBindHost+gateway.port(デフォルトは 18789)からコールバック URL を導出し、その後http://localhost:<port>にフォールバックします。コールバックパスは/mattermost/interactions/<accountId>です。- 到達可能性のルール:ボタンのコールバック URL は Mattermost サーバーから到達可能である必要があります。
localhostが機能するのは、Mattermost と OpenClaw が同じホスト/ネットワーク名前空間で実行されている場合のみです。 channels.mattermost.interactions.allowedSourceIps:ボタンコールバックの送信元 IP 許可リスト。指定しない場合、ループバックの送信元(127.0.0.1、::1)のみが許可されるため、リモートの Mattermost サーバーをここで許可リストに追加しないと、そのクリックは403で拒否されます。リバースプロキシの背後では、転送ヘッダーから実際のクライアント IP を導出できるようにgateway.trustedProxiesも設定します。- コールバック先がプライベート、tailnet、または内部にある場合は、そのホスト/ドメインを Mattermost の
ServiceSettings.AllowedUntrustedInternalConnectionsに追加します。
API の直接統合(外部スクリプト)
外部スクリプトと Webhook は、エージェントの message ツールを経由せず、Mattermost REST API を介してボタンを直接投稿できます。OpenClaw の message ツールを推奨します。直接統合する場合は、@openclaw/mattermost/api.js から buildButtonAttachments をインポートしてください。生の JSON を投稿する場合は、次のルールに従ってください:
ペイロード構造:
{ channel_id: "<channelId>", message: "Choose an option:", props: { attachments: [ { actions: [ { id: "mybutton01", // alphanumeric only - see below type: "button", // required, or clicks are silently ignored name: "Approve", // display label style: "primary", // optional: "default", "primary", "danger" integration: { url: "https://gateway.example.com/mattermost/interactions/default", context: { action_id: "mybutton01", // must match button id action: "approve", // ... any custom fields ... _token: "<hmac>", // see HMAC section below }, }, }, ], }, ], },}HMAC トークンの生成
Gateway は HMAC-SHA256 を使用してボタンのクリックを検証します。外部スクリプトでは、Gateway の検証ロジックと一致するトークンを生成する必要があります:
ボットトークンからシークレットを導出
HMAC-SHA256(key="openclaw-mattermost-interactions", data=botToken)。16 進数でエンコードします。
コンテキストオブジェクトを構築
_token 以外のすべてのフィールドを含むコンテキストオブジェクトを構築します。
ソート済みキーでシリアライズ
再帰的にソートしたキーを使用し、空白なしでシリアライズします(Gateway はネストされたオブジェクトも正規化し、コンパクトな JSON を生成します)。
ペイロードに署名
HMAC-SHA256(key=secret, data=serializedContext)
トークンを追加
生成された 16 進ダイジェストをコンテキスト内の _token として追加します。
Python の例:
secret = hmac.new( b"openclaw-mattermost-interactions", bot_token.encode(), hashlib.sha256).hexdigest() ctx = {"action_id": "mybutton01", "action": "approve"}payload = json.dumps(ctx, sort_keys=True, separators=(",", ":"))token = hmac.new(secret.encode(), payload.encode(), hashlib.sha256).hexdigest() context = {**ctx, "_token": token}HMAC でよくある落とし穴
- Python の
json.dumpsはデフォルトでスペースを追加します({"key": "val"})。JavaScript のコンパクトな出力({"key":"val"})に一致させるには、separators=(",", ":")を使用してください。 - 常にコンテキストのすべてのフィールド(
_tokenを除く)に署名してください。Gateway は_tokenを取り除き、残りすべてに署名します。一部だけに署名すると、検証が通知なく失敗します。 sort_keys=Trueを使用してください。Gateway は署名前にキーをソートし、Mattermost はペイロードの保存時にコンテキストフィールドの順序を変更する場合があります。- シークレットはランダムバイトではなく、bot トークンから導出してください(決定論的)。ボタンを作成するプロセスと検証を行う Gateway の間で、シークレットが同一である必要があります。
ディレクトリアダプター
Mattermost Plugin には、Mattermost API を介してチャンネル名とユーザー名を解決するディレクトリアダプターが含まれています。これにより、openclaw message send および cron/webhook 配信で #channel-name と @username のターゲットを使用できます。
設定は不要です。アダプターはアカウント設定の bot トークンを使用します。
複数アカウント
Mattermost は channels.mattermost.accounts 配下で複数のアカウントをサポートします。
{ channels: { mattermost: { accounts: { default: { name: "Primary", botToken: "mm-token", baseUrl: "https://chat.example.com" }, alerts: { name: "Alerts", botToken: "mm-token-2", baseUrl: "https://alerts.example.com" }, }, }, },}アカウントの値はトップレベルのフィールドを上書きします。アカウントが指定されていない場合に使用するアカウントは、channels.mattermost.defaultAccount で選択します。
トラブルシューティング
チャンネルで返信がない
bot がチャンネルに参加していることを確認してメンションする(oncall)か、トリガープレフィックスを使用する(onchar)か、chatmode: "onmessage" を設定してください。
認証または複数アカウントのエラー
- bot トークン、ベース URL、およびアカウントが有効になっているかを確認してください。
- 複数アカウントの問題:環境変数は
defaultアカウントにのみ適用されます。 - プライベート/LAN の Mattermost ホストには
network.dangerouslyAllowPrivateNetwork: trueが必要です(SSRF ガードはデフォルトでプライベート IP をブロックします)。
ネイティブスラッシュコマンドが失敗する
Unauthorized: invalid command token.:OpenClaw がコールバックトークンを受け入れませんでした。一般的な原因:- スラッシュコマンドの登録が失敗したか、起動時に一部しか完了しなかった
- コールバックが誤った Gateway/アカウントに到達している
- Mattermost に、以前のコールバックターゲットを指す古いコマンドがまだ残っている
- スラッシュコマンドを再有効化せずに Gateway が再起動した
- ネイティブスラッシュコマンドが動作しなくなった場合は、ログで
mattermost: failed to register slash commandsまたはmattermost: native slash commands enabled but no commands could be registeredを確認してください。 callbackUrlが省略され、コールバックがhttp://localhost:18789/...のようなループバック URL に解決されたという警告がログに表示される場合、その URL は Mattermost が OpenClaw と同じホスト/ネットワーク名前空間で実行されている場合にしか到達できない可能性があります。代わりに、外部から到達可能なcommands.callbackUrlを明示的に設定してください。
ボタンの問題
- ボタンが白いボックスとして表示されるか、まったく表示されない:ボタンデータの形式が不正です。各プレゼンテーションボタンには
labelとvalueが必要です(どちらかが欠けているボタンは破棄されます)。 - ボタンは表示されるが、クリックしても何も起きない:Mattermost サーバーから Gateway に到達できること、Mattermost サーバーの IP が
channels.mattermost.interactions.allowedSourceIpsに含まれていること(これがない場合はループバックのみ許可されます)、およびプライベートターゲットの場合はServiceSettings.AllowedUntrustedInternalConnectionsにコールバックホストが含まれていることを確認してください。 - ボタンをクリックすると 404 が返される:ボタンの
idにハイフンまたはアンダースコアが含まれている可能性があります。Mattermost のアクションルーターは英数字以外の ID では機能しません。[a-zA-Z0-9]のみを使用してください。 - Gateway のログに
rejected callback sourceが記録される:クリック元の IP がinteractions.allowedSourceIpsの範囲外です。Mattermost サーバーまたはイングレスを許可リストに追加し、リバースプロキシの背後ではgateway.trustedProxiesを設定してください。 - Gateway のログに
invalid _tokenが記録される:HMAC が一致しません。コンテキストフィールドの一部ではなくすべてに署名していること、キーをソートしていること、およびコンパクトな JSON(スペースなし)を使用していることを確認してください。上記の HMAC セクションを参照してください。 - Gateway のログに
missing _token in contextが記録される:_tokenフィールドがボタンのコンテキストにありません。インテグレーションペイロードを構築するときに含まれていることを確認してください。 - Gateway が
Unknown actionでクリックを拒否する:context.action_idが投稿上のどのアクションidとも一致しません。両方を同じサニタイズ済みの値に設定してください。 - エージェントがボタンを提示しない:Mattermost チャンネル設定に
capabilities: ["inlineButtons"]を追加してください。
関連項目
- チャンネルルーティング - メッセージのセッションルーティング
- チャンネルの概要 - サポートされているすべてのチャンネル
- グループ - グループチャットの動作とメンションによる制御
- ペアリング - DM の認証とペアリングの流れ
- セキュリティ - アクセスモデルと堅牢化