Twitch (플러그인)

IRC 연결을 통한 Twitch 채팅 지원입니다. OpenClaw는 Twitch 사용자(봇 계정)로 연결하여 채널에서 메시지를 수신하고 전송합니다.

플러그인 필요

Twitch는 플러그인으로 제공되며 기본 코어에 포함되지 않습니다.

CLI로 설치 (npm 레지스트리):

openclaw plugins install @openclaw/twitch

로컬 체크아웃 (git 저장소에서 실행 시):

openclaw plugins install ./extensions/twitch

자세한 내용: Plugins

빠른 설정 (초보자)

  1. 봇 전용 Twitch 계정을 생성합니다 (또는 기존 계정 사용).
  2. 자격 증명을 생성합니다: Twitch Token Generator
    • Bot Token을 선택합니다
    • chat:readchat:write 스코프가 선택되었는지 확인합니다
    • Client IDAccess Token을 복사합니다
  3. Twitch 사용자 ID를 찾습니다: https://www.streamweasels.com/tools/convert-twitch-username-to-user-id/
  4. 토큰을 설정합니다:
    • 환경 변수: OPENCLAW_TWITCH_ACCESS_TOKEN=... (기본 계정만)
    • 또는 설정: channels.twitch.accessToken
    • 둘 다 설정된 경우 설정이 우선합니다 (환경 변수 폴백은 기본 계정에만 적용).
  5. 게이트웨이를 시작합니다.

참고: 비인가 사용자가 봇을 트리거하지 못하도록 접근 제어(allowFrom 또는 allowedRoles)를 추가하세요. requireMention은 기본적으로 true입니다.

최소 설정:

{
  channels: {
    twitch: {
      enabled: true,
      username: "openclaw", // 봇의 Twitch 계정
      accessToken: "oauth:abc123...", // OAuth Access Token (또는 OPENCLAW_TWITCH_ACCESS_TOKEN 환경 변수 사용)
      clientId: "xyz789...", // Token Generator의 Client ID
      channel: "vevisk", // 참여할 Twitch 채널의 채팅 (필수)
      allowFrom: ["123456789"], // (권장) 본인의 Twitch 사용자 ID만 - https://www.streamweasels.com/tools/convert-twitch-username-to-user-id/ 에서 확인
    },
  },
}

기능 설명

  • 게이트웨이가 소유하는 Twitch 채널.
  • 결정적 라우팅: 응답은 항상 Twitch로 돌아갑니다.
  • 각 계정은 격리된 세션 키 agent:<agentId>:twitch:<accountName>에 매핑됩니다.
  • username은 봇의 계정(인증 주체), channel은 참여할 채팅방입니다.

설정 (상세)

자격 증명 생성

Twitch Token Generator를 사용합니다:

  • Bot Token을 선택합니다
  • chat:readchat:write 스코프가 선택되었는지 확인합니다
  • Client IDAccess Token을 복사합니다

별도의 앱 등록이 필요 없습니다. 토큰은 몇 시간 후에 만료됩니다.

봇 설정

환경 변수 (기본 계정만):

OPENCLAW_TWITCH_ACCESS_TOKEN=oauth:abc123...

또는 설정:

{
  channels: {
    twitch: {
      enabled: true,
      username: "openclaw",
      accessToken: "oauth:abc123...",
      clientId: "xyz789...",
      channel: "vevisk",
    },
  },
}

환경 변수와 설정 모두 있으면 설정이 우선합니다.

접근 제어 (권장)

{
  channels: {
    twitch: {
      allowFrom: ["123456789"], // (권장) 본인의 Twitch 사용자 ID만
    },
  },
}

allowFrom을 하드 허용 목록으로 사용하세요. 역할 기반 접근을 원하면 대신 allowedRoles를 사용하세요.

사용 가능한 역할: "moderator", "owner", "vip", "subscriber", "all".

사용자 ID를 사용하는 이유: 사용자 이름은 변경 가능하여 사칭이 가능합니다. 사용자 ID는 영구적입니다.

Twitch 사용자 ID 찾기: https://www.streamweasels.com/tools/convert-twitch-username-%20to-user-id/

토큰 갱신 (선택)

Twitch Token Generator에서 발급한 토큰은 자동 갱신이 불가능합니다. 만료되면 재생성하세요.

자동 토큰 갱신을 위해 Twitch Developer Console에서 직접 Twitch 애플리케이션을 만들고 설정에 추가합니다:

{
  channels: {
    twitch: {
      clientSecret: "your_client_secret",
      refreshToken: "your_refresh_token",
    },
  },
}

봇이 만료 전에 자동으로 토큰을 갱신하고 갱신 이벤트를 로그에 기록합니다.

다중 계정 지원

channels.twitch.accounts에 계정별 토큰을 사용합니다. 공유 패턴은 gateway/configuration을 참조하세요.

예시 (한 봇 계정을 두 채널에서 사용):

{
  channels: {
    twitch: {
      accounts: {
        channel1: {
          username: "openclaw",
          accessToken: "oauth:abc123...",
          clientId: "xyz789...",
          channel: "vevisk",
        },
        channel2: {
          username: "openclaw",
          accessToken: "oauth:def456...",
          clientId: "uvw012...",
          channel: "secondchannel",
        },
      },
    },
  },
}

참고: 각 계정에는 자체 토큰이 필요합니다 (채널당 하나의 토큰).

접근 제어

역할 기반 제한

{
  channels: {
    twitch: {
      accounts: {
        default: {
          allowedRoles: ["moderator", "vip"],
        },
      },
    },
  },
}

사용자 ID 허용 목록 (가장 안전)

{
  channels: {
    twitch: {
      accounts: {
        default: {
          allowFrom: ["123456789", "987654321"],
        },
      },
    },
  },
}

역할 기반 접근 (대안)

allowFrom은 하드 허용 목록입니다. 설정하면 해당 사용자 ID만 허용됩니다. 역할 기반 접근을 원하면 allowFrom을 설정하지 않고 대신 allowedRoles를 구성하세요:

{
  channels: {
    twitch: {
      accounts: {
        default: {
          allowedRoles: ["moderator"],
        },
      },
    },
  },
}

@멘션 요구 비활성화

기본적으로 requireMentiontrue입니다. 모든 메시지에 응답하려면 비활성화하세요:

{
  channels: {
    twitch: {
      accounts: {
        default: {
          requireMention: false,
        },
      },
    },
  },
}

문제 해결

먼저 진단 명령을 실행하세요:

openclaw doctor
openclaw channels status --probe

봇이 메시지에 응답하지 않는 경우

접근 제어 확인: 사용자 ID가 allowFrom에 있는지 확인하거나, 테스트를 위해 allowFrom을 일시적으로 제거하고 allowedRoles: ["all"]을 설정하세요.

봇이 채널에 있는지 확인: 봇은 channel에 지정된 채널에 참여해야 합니다.

토큰 문제

“Failed to connect” 또는 인증 오류:

  • accessToken이 OAuth 액세스 토큰 값인지 확인 (일반적으로 oauth: 접두사로 시작)
  • 토큰에 chat:readchat:write 스코프가 있는지 확인
  • 토큰 갱신을 사용하는 경우 clientSecretrefreshToken이 설정되었는지 확인

토큰 갱신이 작동하지 않는 경우

로그에서 갱신 이벤트 확인:

Using env token source for mybot
Access token refreshed for user 123456 (expires in 14400s)

“token refresh disabled (no refresh token)“이 보이면:

  • clientSecret이 제공되었는지 확인
  • refreshToken이 제공되었는지 확인

설정

계정 설정:

  • username - 봇 사용자 이름
  • accessToken - chat:readchat:write가 있는 OAuth 액세스 토큰
  • clientId - Twitch Client ID (Token Generator 또는 직접 생성한 앱)
  • channel - 참여할 채널 (필수)
  • enabled - 이 계정 활성화 (기본값: true)
  • clientSecret - 선택: 자동 토큰 갱신용
  • refreshToken - 선택: 자동 토큰 갱신용
  • expiresIn - 토큰 만료 시간 (초)
  • obtainmentTimestamp - 토큰 발급 타임스탬프
  • allowFrom - 사용자 ID 허용 목록
  • allowedRoles - 역할 기반 접근 제어 ("moderator" | "owner" | "vip" | "subscriber" | "all")
  • requireMention - @멘션 필요 (기본값: true)

제공자 옵션:

  • channels.twitch.enabled - 채널 시작 활성화/비활성화
  • channels.twitch.username - 봇 사용자 이름 (단순화된 단일 계정 설정)
  • channels.twitch.accessToken - OAuth 액세스 토큰 (단순화된 단일 계정 설정)
  • channels.twitch.clientId - Twitch Client ID (단순화된 단일 계정 설정)
  • channels.twitch.channel - 참여할 채널 (단순화된 단일 계정 설정)
  • channels.twitch.accounts.<accountName> - 다중 계정 설정 (위의 모든 계정 필드)

전체 예시:

{
  channels: {
    twitch: {
      enabled: true,
      username: "openclaw",
      accessToken: "oauth:abc123...",
      clientId: "xyz789...",
      channel: "vevisk",
      clientSecret: "secret123...",
      refreshToken: "refresh456...",
      allowFrom: ["123456789"],
      allowedRoles: ["moderator", "vip"],
      accounts: {
        default: {
          username: "mybot",
          accessToken: "oauth:abc123...",
          clientId: "xyz789...",
          channel: "your_channel",
          enabled: true,
          clientSecret: "secret123...",
          refreshToken: "refresh456...",
          expiresIn: 14400,
          obtainmentTimestamp: 1706092800000,
          allowFrom: ["123456789", "987654321"],
          allowedRoles: ["moderator"],
        },
      },
    },
  },
}

도구 액션

에이전트가 twitch 액션을 호출할 수 있습니다:

  • send - 채널에 메시지 전송

예시:

{
  action: "twitch",
  params: {
    message: "Hello Twitch!",
    to: "#mychannel",
  },
}

보안 및 운영

  • 토큰은 비밀번호처럼 취급하세요 - 토큰을 git에 커밋하지 마세요
  • 장기 실행 봇에는 자동 토큰 갱신을 사용하세요
  • 접근 제어에는 사용자 이름 대신 사용자 ID 허용 목록을 사용하세요
  • 토큰 갱신 이벤트와 연결 상태를 로그로 모니터링하세요
  • 토큰 스코프를 최소화하세요 - chat:readchat:write만 요청
  • 문제가 발생하면: 다른 프로세스가 세션을 소유하지 않는 것을 확인한 후 게이트웨이를 재시작하세요

제한

  • 메시지당 500자 (단어 경계에서 자동 분할)
  • 마크다운은 분할 전에 제거됩니다
  • 속도 제한 없음 (Twitch의 내장 속도 제한 사용)