LINE (플러그인)

LINE은 LINE Messaging API를 통해 OpenClaw에 연결됩니다. 플러그인은 게이트웨이에서 웹훅 수신기로 실행되며 채널 접근 토큰 + 채널 시크릿을 인증에 사용합니다.

상태: 플러그인으로 지원됩니다. 다이렉트 메시지, 그룹 채팅, 미디어, 위치, Flex 메시지, 템플릿 메시지, 빠른 응답을 지원합니다. 리액션과 스레드는 지원되지 않습니다.

플러그인 필요

LINE 플러그인을 설치하세요:

openclaw plugins install @openclaw/line

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

openclaw plugins install ./extensions/line

설정

  1. LINE Developers 계정을 만들고 콘솔을 엽니다: https://developers.line.biz/console/
  2. Provider를 생성(또는 선택)하고 Messaging API 채널을 추가합니다.
  3. 채널 설정에서 Channel access token과 Channel secret을 복사합니다.
  4. Messaging API 설정에서 Use webhook을 활성화합니다.
  5. 웹훅 URL을 게이트웨이 엔드포인트로 설정합니다 (HTTPS 필수):
https://gateway-host/line/webhook

게이트웨이는 LINE의 웹훅 검증(GET)과 인바운드 이벤트(POST)에 응답합니다. 커스텀 경로가 필요하면 channels.line.webhookPath 또는 channels.line.accounts.<id>.webhookPath를 설정하고 URL을 맞추세요.

참고: LINE 서명 검증은 본문에 의존하므로(원시 본문에 대한 HMAC), OpenClaw는 검증 전에 엄격한 사전 인증 본문 제한과 타임아웃을 적용합니다.

구성

최소 설정:

{
  channels: {
    line: {
      enabled: true,
      channelAccessToken: "LINE_CHANNEL_ACCESS_TOKEN",
      channelSecret: "LINE_CHANNEL_SECRET",
      dmPolicy: "pairing",
    },
  },
}

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

  • LINE_CHANNEL_ACCESS_TOKEN
  • LINE_CHANNEL_SECRET

토큰/시크릿 파일:

{
  channels: {
    line: {
      tokenFile: "/path/to/line-token.txt",
      secretFile: "/path/to/line-secret.txt",
    },
  },
}

tokenFile과 secretFile은 일반 파일을 가리켜야 합니다. 심볼릭 링크는 거부됩니다.

다중 계정:

{
  channels: {
    line: {
      accounts: {
        marketing: {
          channelAccessToken: "...",
          channelSecret: "...",
          webhookPath: "/line/marketing",
        },
      },
    },
  },
}

접근 제어

다이렉트 메시지는 기본적으로 페어링 모드입니다. 알 수 없는 발신자에게 페어링 코드가 전송되며 승인될 때까지 메시지가 무시됩니다.

openclaw pairing list line
openclaw pairing approve line <CODE>

허용 목록 및 정책:

  • channels.line.dmPolicy: pairing | allowlist | open | disabled
  • channels.line.allowFrom: DM 허용 LINE 사용자 ID
  • channels.line.groupPolicy: allowlist | open | disabled
  • channels.line.groupAllowFrom: 그룹 허용 LINE 사용자 ID
  • 그룹별 재정의: channels.line.groups.<groupId>.allowFrom
  • 런타임 참고: channels.line이 완전히 없으면, channels.defaults.groupPolicy가 설정되어 있어도 그룹 검사에서 groupPolicy="allowlist"로 폴백합니다.

LINE ID는 대소문자를 구분합니다. 유효한 ID 형태:

  • 사용자: U + 32자리 hex
  • 그룹: C + 32자리 hex
  • 룸: R + 32자리 hex

메시지 동작

  • 텍스트는 5000자 단위로 분할됩니다.
  • Markdown 서식은 제거됩니다. 코드 블록과 표는 가능한 경우 Flex 카드로 변환됩니다.
  • 스트리밍 응답은 버퍼링됩니다. 에이전트가 작업하는 동안 LINE은 로딩 애니메이션과 함께 전체 청크를 수신합니다.
  • 미디어 다운로드는 channels.line.mediaMaxMb(기본 10)로 제한됩니다.

채널 데이터 (리치 메시지)

channelData.line을 사용하여 빠른 응답, 위치, Flex 카드, 또는 템플릿 메시지를 보낼 수 있습니다.

{
  text: "Here you go",
  channelData: {
    line: {
      quickReplies: ["Status", "Help"],
      location: {
        title: "Office",
        address: "123 Main St",
        latitude: 35.681236,
        longitude: 139.767125,
      },
      flexMessage: {
        altText: "Status card",
        contents: {
          /* Flex 페이로드 */
        },
      },
      templateMessage: {
        type: "confirm",
        text: "Proceed?",
        confirmLabel: "Yes",
        confirmData: "yes",
        cancelLabel: "No",
        cancelData: "no",
      },
    },
  },
}

LINE 플러그인은 Flex 메시지 프리셋을 위한 /card 명령도 제공합니다:

/card info "Welcome" "Thanks for joining!"

문제 해결

  • 웹훅 검증 실패: 웹훅 URL이 HTTPS이고 channelSecret이 LINE 콘솔과 일치하는지 확인하세요.
  • 인바운드 이벤트 없음: 웹훅 경로가 channels.line.webhookPath와 일치하고 게이트웨이에 LINE에서 접근 가능한지 확인하세요.
  • 미디어 다운로드 오류: 미디어가 기본 제한을 초과하면 channels.line.mediaMaxMb를 높이세요.