Skip to content

디스코드(봇 API)

상태: 공식 Discord 게이트웨이를 통해 DM 및 길드 채널을 사용할 준비가 되었습니다.

빠른 설정

Create a Discord bot and enable intents

Discord 개발자 포털에서 애플리케이션을 생성하고 봇을 추가한 후 다음을 활성화하세요.

  • 메시지 내용 의도
  • 서버 구성원 의도(역할 허용 목록 및 역할 기반 라우팅에 필요, 이름-ID 허용 목록 일치에 권장)
Configure token
json5
{
  channels: {
    discord: {
      enabled: true,
      token: "YOUR_BOT_TOKEN",
    },
  },
}
기본 계정에 대한 환경 대체:
bash
DISCORD_BOT_TOKEN=...
Invite the bot and start gateway
메시지 권한으로 봇을 서버에 초대하세요.
bash
openclaw gateway
Approve first DM pairing
bash
openclaw pairing list discord
openclaw pairing approve discord <CODE>
페어링 코드는 1시간 후에 만료됩니다.

INFO

토큰 확인은 계정을 인식합니다. 구성 토큰 값은 환경 폴백보다 우선합니다. DISCORD_BOT_TOKEN는 기본 계정에만 사용됩니다.

런타임 모델

  • 게이트웨이는 Discord 연결을 소유합니다.
  • 회신 라우팅은 결정적입니다. Discord 인바운드는 Discord에 다시 응답합니다.
  • 기본적으로(session.dmScope=main) 직접 채팅은 에이전트 기본 세션(agent:main:main)을 공유합니다.
  • 길드 채널은 분리된 세션 키입니다(agent:<agentId>:discord:channel:<channelId>).
  • 그룹 DM은 기본적으로 무시됩니다(channels.discord.dm.groupEnabled=false).
  • 기본 슬래시 명령은 격리된 명령 세션(agent:<agentId>:discord:slash:<userId>)에서 실행되는 동시에 라우팅된 대화 세션에 CommandTargetSessionKey를 전달합니다.

액세스 제어 및 라우팅

channels.discord.dm.policy는 DM 액세스를 제어합니다.

  • pairing (기본값)
  • allowlist
  • open ("*"를 포함하려면 channels.discord.dm.allowFrom 필요)
  • disabled

DM 정책이 열려 있지 않으면 알 수 없는 사용자가 차단됩니다(또는 pairing 모드에서 페어링하라는 메시지가 표시됨).

배송을 위한 DM 대상 형식:

  • user:<id>
  • <@id> 언급

명시적인 사용자/채널 대상 종류가 제공되지 않는 한 단순 숫자 ID는 모호하며 거부됩니다.

길드 처리는 `channels.discord.groupPolicy`에 의해 제어됩니다:

- `open`
- `allowlist`
- `disabled`

`channels.discord`이 존재할 때의 보안 기준은 `allowlist`입니다.

`allowlist` 행동:

- 길드는 `channels.discord.guilds`와 일치해야 합니다(`id` 선호, 슬러그 허용).
- 선택적 발신자 허용 목록: `users`(ID 또는 이름) 및 `roles`(역할 ID만) 둘 중 하나가 구성된 경우 `users` 또는 `roles`와 일치하면 발신자가 허용됩니다.
- 길드에 `channels`가 설정되어 있는 경우 목록에 없는 채널은 거부됩니다.
- 길드에 `channels` 블록이 없으면 허용된 길드의 모든 채널이 허용됩니다.

예:
json5
{
  channels: {
    discord: {
      groupPolicy: "allowlist",
      guilds: {
        "123456789012345678": {
          requireMention: true,
          users: ["987654321098765432"],
          roles: ["123456789012345678"],
          channels: {
            general: { allow: true },
            help: { allow: true, requireMention: true },
          },
        },
      },
    },
  },
}

DISCORD_BOT_TOKEN만 설정하고 channels.discord 블록을 생성하지 않으면 런타임 폴백은 groupPolicy="open"입니다(로그에 경고 표시).

길드 메시지는 기본적으로 멘션 게이트로 처리됩니다.

멘션 감지에는 다음이 포함됩니다.

  • 명시적인 봇 언급
  • 구성된 멘션 패턴(agents.list[].groupChat.mentionPatterns, 대체 messages.groupChat.mentionPatterns)
  • 지원되는 경우 암시적인 봇에 대한 응답 동작

requireMention는 길드/채널별로 구성됩니다(channels.discord.guilds...).

그룹 DM:

  • 기본값: 무시됨 (dm.groupEnabled=false)
  • dm.groupChannels를 통한 선택적 허용 목록(채널 ID 또는 슬러그)

역할 기반 상담원 라우팅

bindings[].match.roles를 사용하여 Discord 길드원을 역할 ID별로 다른 에이전트에게 라우팅할 수 있습니다. 역할 기반 바인딩은 역할 ID만 허용하며 피어 또는 상위-피어 바인딩 이후, 길드 전용 바인딩 이전에 평가됩니다.

json5
{
  bindings: [
    {
      agentId: "opus",
      match: {
        channel: "discord",
        guildId: "123456789012345678",
        roles: ["111111111111111111"],
      },
    },
    {
      agentId: "sonnet",
      match: {
        channel: "discord",
        guildId: "123456789012345678",
      },
    },
  ],
}

개발자 포털 설정

Create app and bot
  1. Discord 개발자 포털 -> 애플리케이션 -> 새 애플리케이션
  2. -> 봇 추가
  3. 봇 토큰 복사
Privileged intents

Bot -> Privileged Gateway Intents에서 다음을 활성화합니다.

  • 메시지 내용의 의도
  • 서버 구성원 의도(권장)

현재 상태 의도는 선택 사항이며 현재 상태 업데이트를 받으려는 경우에만 필요합니다. 봇 존재 여부 설정(setPresence)에는 구성원에 대한 현재 상태 업데이트를 활성화할 필요가 없습니다.

OAuth scopes and baseline permissions

OAuth URL 생성기:

  • 범위: bot, applications.commands

일반적인 기본 권한:

  • 채널 보기
  • 메시지 보내기
  • 메시지 기록 읽기
  • 링크 삽입
  • 파일 첨부
  • 반응 추가(선택 사항)

명시적으로 필요한 경우가 아니면 Administrator를 사용하지 마세요.

Copy IDs

Discord 개발자 모드를 활성화한 후 다음을 복사하세요.

  • 서버 ID
  • 채널 ID
  • 사용자 ID

안정적인 감사 및 프로브를 위해 OpenClaw 구성에서 숫자 ID를 선호합니다.

기본 명령 및 명령 인증

  • commands.native의 기본값은 "auto"이며 Discord에서 활성화됩니다.
  • 채널별 재정의: channels.discord.commands.native.
  • commands.native=false는 이전에 등록된 Discord 네이티브 명령어를 명시적으로 삭제합니다.
  • 기본 명령 auth는 일반 메시지 처리와 동일한 Discord 허용 목록/정책을 사용합니다.
  • 승인되지 않은 사용자의 경우 Discord UI에 명령이 계속 표시될 수 있습니다. 실행은 여전히 ​​OpenClaw 인증을 시행하고 "승인되지 않음"을 반환합니다.

명령 카탈로그 및 동작은 슬래시 명령을 참조하세요.

기능 세부정보

Reply tags and native replies

Discord는 상담원 출력에서 응답 태그를 지원합니다.

  • [[reply_to_current]]
  • [[reply_to:<id>]]

channels.discord.replyToMode에 의해 제어됨:

  • off (기본값)
  • first
  • all

메시지 ID는 컨텍스트/기록에 표시되므로 상담원이 특정 메시지를 타겟팅할 수 있습니다.

History, context, and thread behavior

길드 역사 내용:

  • channels.discord.historyLimit 기본값 20
  • 대체: messages.groupChat.historyLimit
  • 0 비활성화

DM 기록 제어:

  • channels.discord.dmHistoryLimit
  • channels.discord.dms["<user_id>"].historyLimit

스레드 동작:

  • Discord 스레드는 채널 세션으로 라우팅됩니다.
  • 상위 스레드 메타데이터는 상위 세션 연결에 사용될 수 있습니다.
  • 스레드 특정 항목이 존재하지 않는 한 스레드 구성은 상위 채널 구성을 상속합니다.

채널 주제는 신뢰할 수 없는 컨텍스트(시스템 프롬프트가 아님)로 삽입됩니다.

Reaction notifications

길드별 반응 알림 모드:

  • off
  • own (기본값)
  • all
  • allowlist (guilds.<id>.users 사용)

반응 이벤트는 시스템 이벤트로 전환되어 라우팅된 Discord 세션에 첨부됩니다.

Config writes
채널 시작 구성 쓰기는 기본적으로 활성화됩니다.

이는 `/config set|unset` 흐름에 영향을 미칩니다(명령 기능이 활성화된 경우).

비활성화:
json5
{
  channels: {
    discord: {
      configWrites: false,
    },
  },
}
PluralKit support
PluralKit 확인을 활성화하여 프록시 메시지를 시스템 구성원 ID에 매핑합니다.
json5
{
  channels: {
    discord: {
      pluralkit: {
        enabled: true,
        token: "pk_live_...", // optional; needed for private systems
      },
    },
  },
}
참고:

- 허용 목록은 `pk:<memberId>`를 사용할 수 있습니다.
- 멤버 표시 이름은 이름/슬러그와 일치합니다.
- 조회는 원본 메시지 ID를 사용하며 기간이 제한되어 있습니다.
- 조회가 실패하면 프록시 메시지는 봇 메시지로 처리되어 `allowBots=true`가 아닌 이상 삭제됩니다.
Exec approvals in Discord

Discord는 DM에서 버튼 기반 실행 승인을 지원합니다.

구성 경로:

  • channels.discord.execApprovals.enabled
  • channels.discord.execApprovals.approvers
  • agentFilter, sessionFilter, cleanupAfterResolve

알 수 없는 승인 ID로 승인이 실패하는 경우 승인자 목록 및 기능 활성화를 확인하세요.

관련 문서: 실행 승인

도구 및 액션 게이트

Discord 메시지 작업에는 메시징, 채널 관리, 중재, 현재 상태 및 메타데이터 작업이 포함됩니다.

핵심 예:

  • 메시지: sendMessage, readMessages, editMessage, deleteMessage, threadReply
  • 반응: react, reactions, emojiList
  • 중재: timeout, kick, ban
  • 존재: setPresence

액션 게이트는 channels.discord.actions.* 아래에 있습니다.

기본 게이트 동작:

액션 그룹기본값
반응, 메시지, 스레드, 핀, 여론 조사, 검색, memberInfo, roleInfo, 채널 정보, 채널, voiceStatus, 이벤트, 스티커, emojiUploads, 스티커 업로드, 권한활성화
역할장애인
절제장애인
존재장애인

문제 해결

Used disallowed intents or bot sees no guild messages
  • 메시지 콘텐츠 의도 활성화
  • 사용자/멤버 해결에 의존하는 경우 서버 멤버 의도를 활성화합니다.
  • 의도 변경 후 게이트웨이 다시 시작
Guild messages blocked unexpectedly
- `groupPolicy` 확인
- `channels.discord.guilds`에서 길드 허용 목록을 확인하세요.
- 길드 `channels` 맵이 존재하는 경우, 나열된 채널만 허용됩니다.
- `requireMention` 행동 및 언급 패턴을 확인합니다.

유용한 점검 사항:
bash
openclaw doctor
openclaw channels status --probe
openclaw logs --follow
Require mention false but still blocked

일반적인 원인:

  • groupPolicy="allowlist" 길드/채널 허용 목록이 일치하지 않음
  • requireMention가 잘못된 위치에 구성되었습니다(channels.discord.guilds 또는 채널 항목 아래에 있어야 함).
  • 길드/채널 users 허용 목록에 의해 차단된 발신자
Permissions audit mismatches

channels status --probe 권한 확인은 숫자 채널 ID에 대해서만 작동합니다.

슬러그 키를 사용하는 경우 런타임 일치는 계속 작동할 수 있지만 프로브는 권한을 완전히 확인할 수 없습니다.

DM and pairing issues
  • DM 비활성화: channels.discord.dm.enabled=false
  • DM 정책 비활성화: channels.discord.dm.policy="disabled"
  • pairing 모드에서 페어링 승인 대기 중
Bot to bot loops

기본적으로 봇이 작성한 메시지는 무시됩니다.

channels.discord.allowBots=true를 설정한 경우 루프 동작을 방지하려면 엄격한 멘션 및 허용 목록 규칙을 사용하세요.

구성 참조 포인터

기본 참조:

신호가 높은 Discord 필드:

  • 시작/인증: enabled, token, accounts.*, allowBots
  • 정책: groupPolicy, dm.*, guilds.*, guilds.*.channels.*
  • 명령: commands.native, commands.useAccessGroups, configWrites
  • 답글/기록: replyToMode, historyLimit, dmHistoryLimit, dms.*.historyLimit
  • 배송: textChunkLimit, chunkMode, maxLinesPerMessage
  • 미디어/재시도: mediaMaxMb, retry
  • 행동: actions.*
  • 기능: pluralkit, execApprovals, intents, agentComponents, heartbeat, responsePrefix

안전 및 운영

  • 봇 토큰을 비밀로 취급합니다(감독 환경에서는 DISCORD_BOT_TOKEN 선호).
  • 최소 권한의 Discord 권한을 부여하세요.
  • 명령 배포/상태가 오래되면 게이트웨이를 다시 시작하고 openclaw channels status --probe로 다시 확인하세요.

관련

비공식 커뮤니티 번역 · 공식 영문 문서