channels.discord.activities が存在し、クライアントシークレットを解決できる場合にのみ、Activity HTTP ルート、show_widget エージェントツール、起動ボタンハンドラーを登録します。非推奨の discord_widget エイリアスは、1 リリースの間、引き続き使用できます。
前提条件
- 既存の OpenClaw Discord ボット
- OpenClaw Gateway に到達可能な公開 HTTPS ホスト名
- ボットの Discord アプリケーションに対して Activities と OAuth2 を設定する権限
セットアップ
1
Gateway を HTTPS 経由で公開する
トンネルまたはリバースプロキシを起動し、Activities の設定を追加した後に
https://openclaw.example.com/discord/activity/ が Gateway に到達することを確認します。例のホスト名は自分のものに置き換えてください。2
Discord で Activities を有効にする
Discord Developer Portal で既存のボットアプリケーションを開きます。Activities を開いて Activities を有効にし、URL マッピングを作成します。
- プレフィックス:
ROOT(/) - ターゲット:
openclaw.example.com/discord/activity
/discord/activity を加えたもので、末尾にスラッシュは付けません。3
OAuth2 クライアントシークレットをコピーする
Developer Portal で OAuth2 を開きます。Discord ではリダイレクト URI が少なくとも 1 つ必要なため、アプリケーションにまだ設定されていない場合は、ループバックアドレスなどのローカルプレースホルダーを追加してください。Activity のリターンフローは Embedded App SDK が処理します。アプリケーションのクライアントシークレットをコピーするか、リセットします。これは認証情報として扱い、チャット、ログ、またはコミットされる設定ファイルに貼り付けないでください。
4
OpenClaw を設定する
ウィジェットを提供する Discord アカウントに、次のブロックを 1 つ追加します。
DISCORD_CLIENT_SECRET が設定されている場合は、ブロックから clientSecret を省略できます。オプトインするには、ブロック自体は必ず残す必要があります。通常の Discord アクセス設定は別に適用されます。たとえば、allowFrom は引き続きエージェントに DM を送信できるユーザーを制御しますが、チャンネルにすでに投稿されたウィジェットを開けるユーザーは制御しません。5
再起動してテストする
Gateway を再起動します。Discord の会話で、インタラクティブなウィジェットを表示するようエージェントに依頼します。エージェントが
show_widget を呼び出したら、投稿されたメッセージの Open widget をクリックします。セキュリティモデル
- ウィジェットのメタデータが返される前に、OAuth によって Discord ユーザーを識別します。
- Discord の Get Activity Instance API は、OAuth ユーザーが現在の Activity インスタンスに参加していることを確認する必要があります。インスタンスのチャンネルは、ウィジェットが投稿されたチャンネルと一致する必要があります。
- Discord によってそのチャンネルへの参加を許可された全員が、そのチャンネルのウィジェットを開けます。対象者を限定するには、Discord のチャンネル権限を使用してください。OpenClaw のコマンドおよび DM の許可リストは、すでに投稿されたチャンネルコンテンツへのアクセスを付与または削除しません。
- OAuth セッションは 15 分後に期限切れになります。ウィジェットのドキュメントケイパビリティは 60 秒後に期限切れになり、1 回だけ使用できます。
- ウィジェットは 7 日後に期限切れになり、Discord Plugin インスタンスごとに最大 64 個が保持されます。
- ウィジェットの HTML はエージェントによって作成されるため、信頼できるコンテンツとして扱う必要があります。不具合のあるウィジェットに公開されたくないシークレットを埋め込まないでください。
- ウィジェットは、独自の入れ子になったフレーム内を移動できます。
sandbox="allow-scripts"iframe はトップレベルのナビゲーション、ポップアップ、同一オリジンへのアクセスをブロックし、Content Security Policy はネットワーク接続と外部リソースをブロックします。これらの制御は多層防御であり、ウィジェットを作成したエージェントに対するセキュリティ境界ではありません。 - Activities が無効な場合、
/discord/activityは一切登録されません。
トラブルシューティング
Activity に「Gateway offline」と表示される
- トンネルが実行中であり、Gateway の実際のバインドポートにルーティングされていることを確認する
- Developer Portal のターゲットに
/discord/activityが含まれていることを確認する - Discord または OpenClaw の設定を変更した後、Gateway を再起動する
- Activities のクライアントシークレットが見つからないことを示す 1 行の警告が Gateway ログにないか確認する
Discord で空白ページが開く、または blocked:csp が報告される
- URL マッピングが
ROOTを使用し、2 つ目の/discord/activityセグメントを追加していないことを確認する - シェル、
shell.js、SDK モジュールのすべてが Discord プロキシ経由で返されることを確認する - Gateway ログで
/discord/activity/配下のリクエストを調べる