WhatsApp (웹 채널)
상태: WhatsApp Web (Baileys)을 통해 프로덕션 준비 완료. 게이트웨이가 연결된 세션을 소유합니다.빠른 설정
OpenClaw는 가능하면 별도의 번호에서 WhatsApp을 실행하는 것을 권장합니다. (채널 메타데이터 및 온보딩 흐름은 해당 설정에 최적화되어 있으나 개인 번호 설정도 지원됩니다.)
배포 패턴
전용 번호 (권장)
전용 번호 (권장)
가장 깔끔한 운영 모드입니다:
- OpenClaw 전용 WhatsApp 식별
- 더 명확한 다이렉트 메시지 허용 목록 및 라우팅 경계
- 셀프 챗 혼동 가능성 낮음
개인 번호 대체
개인 번호 대체
온보딩은 개인 번호 모드를 지원하고 셀프 챗에 친화적인 기본값을 작성합니다:
dmPolicy: "allowlist"allowFrom에 개인 번호가 포함됨selfChatMode: true
allowFrom을 기준으로 셀프 챗 보호가 동작합니다.WhatsApp Web 전용 채널 범위
WhatsApp Web 전용 채널 범위
메시징 플랫폼 채널은 현재 OpenClaw 채널 아키텍처에서 WhatsApp Web 기반(Baileys)입니다.내장된 채팅 채널 레지스트리에 별도의 Twilio WhatsApp 메시징 채널은 없습니다.
런타임 모델
- 게이트웨이 소유: WhatsApp 소켓 및 재연결 루프.
- 아웃바운드 전송은 대상 계정에 대한 활성 WhatsApp 리스너가 필요합니다.
- 상태 및 브로드캐스트 채팅은 무시됩니다 (
@status,@broadcast). - 직접 채팅은 다이렉트 메시지 세션 규칙을 사용합니다 (
session.dmScope; 기본값main은 에이전트 메인 세션으로 다이렉트 메시지를 통합). - 그룹 세션은 격리됩니다 (
agent:<agentId>:whatsapp:group:<jid>).
접근 제어 및 활성화
- DM 정책
- 그룹 정책 + 허용 목록
- 멘션 + /activation
channels.whatsapp.dmPolicy는 직접 채팅 접근을 제어합니다:pairing(기본값)allowlistopen(allowFrom에"*"포함 필요)disabled
allowFrom은 E.164 스타일의 번호를 수용합니다 (내부적으로 정규화됨).다중 계정 재정의: channels.whatsapp.accounts.<id>.dmPolicy (및 allowFrom)가 해당 계정에 대한 채널 수준 기본 설정보다 우선합니다.런타임 동작 세부 사항:- 페어링은 채널 허용 저장소에 영구 저장되며, 구성된
allowFrom과 병합됩니다. - 허용목록이 구성되지 않은 경우 연결된 셀프 번호가 기본적으로 허용됩니다.
- 아웃바운드
fromMe다이렉트 메시지는 자동 페어링되지 않습니다.
개인 번호 및 셀프 챗 동작
연결된 셀프 번호가allowFrom에도 있는 경우, WhatsApp 셀프 챗 보호 기능이 활성화됩니다:
- 셀프 챗 차례에서는 읽음 확인을 건너뜁니다.
- 멘션 JID 자동 트리거 동작을 무시하여 자신을 핑하지 않습니다.
messages.responsePrefix가 설정되지 않은 경우, 셀프 챗 응답은 기본적으로[{identity.name}]또는[openclaw]로 설정됩니다.
메시지 정규화 및 컨텍스트
인바운드 봉투 + 응답 컨텍스트
인바운드 봉투 + 응답 컨텍스트
들어오는 WhatsApp 메시지는 공유된 인바운드 봉투에 감싸져 있습니다.인용된 응답이 존재하는 경우, 이는 다음 형식으로 컨텍스트가 추가됩니다:사용 가능한 경우 응답 메타데이터 필드도 채워집니다 (
ReplyToId, ReplyToBody, ReplyToSender, 발신자 JID/E.164).미디어 자리 표시자 및 위치/연락처 추출
미디어 자리 표시자 및 위치/연락처 추출
미디어 전용 인바운드 메시지는 다음과 같은 자리 표시자로 정규화됩니다:
<media:image><media:video><media:audio><media:document><media:sticker>
대기 중인 그룹 히스토리 주입
대기 중인 그룹 히스토리 주입
그룹의 경우, 처리되지 않은 메시지는 버퍼링될 수 있으며, 봇이 최종적으로 실행될 때 컨텍스트로 주입될 수 있습니다.
- 기본 한도:
50 - 구성:
channels.whatsapp.historyLimit - 대체:
messages.groupChat.historyLimit 0은 비활성화됩니다.
[Chat messages since your last reply - for context][Current message - respond to this]
읽음 확인
읽음 확인
기본적으로 수신 WhatsApp 메시지가 수락되면 읽음 확인이 활성화됩니다.전역 비활성화:계정별 재정의:전역적으로 활성화된 경우에도 셀프 챗 차례는 읽음 확인을 건너뜁니다.
전송, 청크 처리, 미디어
텍스트 청크 처리
텍스트 청크 처리
- 기본 청크 한도:
channels.whatsapp.textChunkLimit = 4000 channels.whatsapp.chunkMode = "length" | "newline"newline모드는 문단 경계 (빈 줄)를 우선한 후 길이 안전한 청크 처리를 사용합니다.
아웃바운드 미디어 동작
아웃바운드 미디어 동작
- 이미지, 비디오, 오디오 (PTT 음성 메모) 및 문서 페이로드를 지원합니다.
audio/ogg는 음성 메모 호환성을 위해audio/ogg; codecs=opus로 재작성됩니다.- 비디오 전송 시
gifPlayback: true로 애니메이션 GIF 재생이 지원됩니다. - 첫 번째 미디어 항목 전송 시 캡션이 적용됩니다.
- 미디어 소스는 HTTP(S),
file://또는 로컬 경로일 수 있습니다.
미디어 크기 제한 및 대체 동작
미디어 크기 제한 및 대체 동작
- 인바운드 미디어 저장 한도:
channels.whatsapp.mediaMaxMb(기본값50MB) - 자동 응답 아웃바운드 미디어 한도:
agents.defaults.mediaMaxMb(기본값5MB) - 이미지의 경우 제한을 맞추기 위해 자동으로 최적화됩니다 (크기 조정/품질 조정).
- 미디어 전송 실패 시, 첫 번째 항목 대체 전송은 경고 텍스트를 보냅니다 (응답을 조용히 드롭하지 않습니다).
확인 리액션
WhatsApp은 수신 시channels.whatsapp.ackReaction을 통해 즉각적인 확인 리액션을 지원합니다.
- 수신이 수락된 후 즉시 전송됩니다 (응답 전).
- 실패는 로그되지만 정상적인 응답 제공을 차단하지 않습니다.
- 그룹 모드
mentions는 멘션 트리거 차례에 반응합니다. 그룹 활성화always는 이 검사를 우회합니다. - WhatsApp은
channels.whatsapp.ackReaction을 사용합니다 (레거시messages.ackReaction은 여기서 사용되지 않습니다).
다중 계정 및 인증
계정 선택 및 기본값
계정 선택 및 기본값
- 계정 ID는
channels.whatsapp.accounts에서 옵니다. - 기본 계정 선택:
default가 있는 경우, 없으면 첫 번째로 구성된 계정 ID (정렬된)입니다. - 계정 ID는 내부적으로 조회를 위해 정규화됩니다.
인증 경로 및 레거시 호환성
인증 경로 및 레거시 호환성
- 현재 인증 경로:
~/.openclaw/credentials/whatsapp/<accountId>/creds.json - 백업 파일:
creds.json.bak - 레거시 기본 인증은 여전히 인식/마이그레이션됩니다 (기본 계정 흐름용).
로그아웃 동작
로그아웃 동작
openclaw channels logout --channel whatsapp [--account <id>]는 해당 계정의 WhatsApp 인증 상태를 제거합니다.레거시 인증 디렉토리에서는 oauth.json이 보존되고 Baileys 인증 파일이 제거됩니다.도구, 액션, 구성 쓰기
- 에이전트 도구 지원에는 WhatsApp 리액션 액션 (
react)이 포함됩니다. - 액션 게잇:
channels.whatsapp.actions.reactionschannels.whatsapp.actions.polls
- 채널 시작 구성 쓰기는 기본적으로 활성화되어 있습니다 (비활성화는
channels.whatsapp.configWrites=false를 통해 가능).
문제 해결
연결되지 않음 (QR 필요)
연결되지 않음 (QR 필요)
증상: 채널 상태에 연결되지 않았다고 보고됩니다.해결:
연결되었지만 연결 끊김/재연결 루프
연결되었지만 연결 끊김/재연결 루프
증상: 연결된 계정 상태에서 반복적인 연결 끊김 또는 재연결 시도.해결:필요시
channels login을 통해 재연결합니다.전송 시 활성 리스너 없음
전송 시 활성 리스너 없음
대상 계정에 대한 활성 게이트웨이 리스너가 없으면 아웃바운드 전송이 빠르게 실패합니다.게이트웨이가 실행 중이고 계정이 연결되어 있는지 확인하십시오.
그룹 메시지가 예기치 않게 무시됨
그룹 메시지가 예기치 않게 무시됨
이 순서대로 확인하십시오:
groupPolicygroupAllowFrom/allowFromgroups허용 목록 항목- 멘션 게이팅 (
requireMention+ 멘션 패턴) openclaw.json의 중복 키 (JSON5): 나중 항목이 이전 항목을 덮어쓰므로, 스코프당 하나의groupPolicy만 유지하세요
Bun 런타임 경고
Bun 런타임 경고
WhatsApp 게이트웨이 런타임은 Node를 사용해야 합니다. Bun은 안정적인 WhatsApp/Telegram 게이트웨이 운영에 비호환으로 플래그 지정됩니다.
구성 참조 포인터
주요 참조: 높은 신호의 WhatsApp 필드:- 접근:
dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups - 전달:
textChunkLimit,chunkMode,mediaMaxMb,sendReadReceipts,ackReaction - 다중 계정:
accounts.<id>.enabled,accounts.<id>.authDir, 계정 수준 재정의 - 작업:
configWrites,debounceMs,web.enabled,web.heartbeatSeconds,web.reconnect.* - 세션 동작:
session.dmScope,historyLimit,dmHistoryLimit,dms.<id>.historyLimit