show_widget, dan penangan tombol peluncuran hanya ketika channels.discord.activities tersedia dan rahasia klien dapat diperoleh. Alias discord_widget yang tidak digunakan lagi tetap tersedia selama satu rilis.
Prasyarat
- bot Discord OpenClaw yang sudah ada
- nama host HTTPS publik yang dapat menjangkau Gateway OpenClaw
- izin untuk mengonfigurasi Activities dan OAuth2 bagi aplikasi Discord milik bot
Penyiapan
1
Ekspos Gateway melalui HTTPS
Jalankan tunnel atau proksi balik Anda dan pastikan bahwa
https://openclaw.example.com/discord/activity/ dapat menjangkau Gateway setelah konfigurasi Activities ditambahkan. Ganti nama host contoh dengan nama host Anda sendiri.2
Aktifkan Activities di Discord
Buka aplikasi bot yang sudah ada di Discord Developer Portal. Buka Activities, aktifkan Activities, lalu buat pemetaan URL:
- prefiks:
ROOT(/) - target:
openclaw.example.com/discord/activity
/discord/activity, tanpa garis miring di bagian akhir.3
Salin rahasia klien OAuth2
Buka OAuth2 di Developer Portal. Discord memerlukan setidaknya satu URI pengalihan, jadi tambahkan placeholder lokal seperti alamat loopback jika aplikasi belum memilikinya; Embedded App SDK menangani alur pengembalian Activity. Salin atau atur ulang rahasia klien aplikasi. Perlakukan nilai tersebut sebagai kredensial: jangan tempelkan ke dalam obrolan, log, atau berkas konfigurasi yang dikomit.
4
Konfigurasikan OpenClaw
Tambahkan satu blok ke akun Discord yang harus menyediakan widget:Anda dapat menghilangkan
clientSecret dari blok ketika DISCORD_CLIENT_SECRET ditetapkan. Blok itu sendiri harus tetap ada untuk mengaktifkan fitur ini.Pengaturan akses Discord normal tetap terpisah. Misalnya, allowFrom tetap mengontrol siapa yang dapat mengirim DM kepada agen; pengaturan tersebut tidak mengontrol siapa yang dapat membuka widget yang sudah diposting di sebuah channel.5
Mulai ulang dan uji
Mulai ulang Gateway. Dalam percakapan Discord, minta agen menampilkan widget interaktif. Agen memanggil
show_widget; klik Open widget pada pesan yang diposting.Model keamanan
- OAuth mengidentifikasi pengguna Discord sebelum metadata widget dikembalikan.
- API Get Activity Instance milik Discord harus mengonfirmasi bahwa pengguna OAuth berada dalam instans Activity saat ini. Channel instans harus cocok dengan channel tempat widget diposting.
- Semua orang yang diizinkan Discord untuk masuk ke channel tersebut dapat membuka widgetnya. Untuk mempersempit audiens, gunakan izin channel Discord. Daftar yang diizinkan untuk perintah dan DM OpenClaw tidak memberikan atau menghapus akses ke konten channel yang sudah diposting.
- Sesi OAuth kedaluwarsa setelah 15 menit. Kapabilitas dokumen widget kedaluwarsa setelah 60 detik dan hanya dapat digunakan sekali.
- Widget kedaluwarsa setelah tujuh hari, dengan maksimal 64 widget dipertahankan per instans plugin Discord.
- HTML widget dibuat oleh agen Anda dan harus diperlakukan sebagai konten tepercaya. Jangan menyematkan rahasia yang tidak ingin Anda biarkan terekspos oleh widget yang bermasalah.
- Widget dapat bernavigasi di dalam frame bersarangnya sendiri. iframe
sandbox="allow-scripts"memblokir navigasi tingkat atas, popup, dan akses asal yang sama, sementara Content Security Policy-nya memblokir koneksi jaringan dan sumber daya eksternal. Kontrol ini merupakan pertahanan berlapis, bukan batas keamanan terhadap agen yang membuat widget. - Ketika Activities dinonaktifkan,
/discord/activitysama sekali tidak didaftarkan.
Pemecahan masalah
Activity menampilkan “Gateway offline”
- pastikan tunnel berjalan dan merutekan ke port pengikatan Gateway yang sebenarnya
- pastikan target Developer Portal menyertakan
/discord/activity - mulai ulang Gateway setelah mengubah konfigurasi Discord atau OpenClaw
- periksa log Gateway untuk peringatan satu baris tentang rahasia klien Activities yang tidak tersedia
Discord membuka halaman kosong atau melaporkan blocked:csp
- pastikan pemetaan URL menggunakan
ROOTdan tidak menambahkan segmen/discord/activitykedua - pastikan shell,
shell.js, dan modul SDK semuanya dikembalikan melalui proksi Discord - periksa log Gateway untuk permintaan di bawah
/discord/activity/