LINE (플러그인)
LINE은 LINE Messaging API를 통해 OpenClaw에 연결됩니다. 플러그인은 게이트웨이에서 웹훅 수신기로 실행되며 채널 접근 토큰 + 채널 시크릿을 인증에 사용합니다.
상태: 플러그인으로 지원됩니다. 다이렉트 메시지, 그룹 채팅, 미디어, 위치, Flex 메시지, 템플릿 메시지, 빠른 응답을 지원합니다. 리액션과 스레드는 지원되지 않습니다.
플러그인 필요
LINE 플러그인을 설치하세요:
openclaw plugins install @openclaw/line
로컬 체크아웃 (git 저장소에서 실행 시):
openclaw plugins install ./extensions/line
설정
- LINE Developers 계정을 만들고 콘솔을 엽니다: https://developers.line.biz/console/
- Provider를 생성(또는 선택)하고 Messaging API 채널을 추가합니다.
- 채널 설정에서 Channel access token과 Channel secret을 복사합니다.
- Messaging API 설정에서 Use webhook을 활성화합니다.
- 웹훅 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_TOKENLINE_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 | disabledchannels.line.allowFrom: DM 허용 LINE 사용자 IDchannels.line.groupPolicy:allowlist | open | disabledchannels.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를 높이세요.