채팅 이벤트
채팅 이벤트를 구독하면 채널에서 발생하는 채팅 메시지를 실시간으로 수신합니다.
구독 엔드포인트: POST /api/openapi/open/v1/sessions/events/subscribe/chat
필요 Scope: READ:LIVE_CHAT
이 구독으로는
CHAT외에DROPS·GOODS_PURCHASE이벤트도 함께 전달됩니다.event필드로 분기하고, 모르는 값은 무시하도록 구현하세요.
이벤트 데이터
{
"event": "CHAT",
"data": {
"channelId": "12345",
"senderChannelId": "67890",
"profile": {
"nickname": "닉네임",
"badges": [
{ "id": "subscribe_tier1", "name": "티어1 구독자", "imageUrl": "https://..." }
]
},
"content": "안녕하세요 :AaBbCc-heart:",
"messageTime": "2024-01-15T10:30:00.000Z",
"emojis": {
":AaBbCc-heart:": "https://example.com/emojis/heart.webp"
}
}
}
| 필드 | 타입 | 설명 |
|---|---|---|
channelId |
string | 채팅이 발생한 채널의 ID |
senderChannelId |
string | 메시지 작성자의 채널 ID |
profile.nickname |
string | 작성자 닉네임 |
profile.badges |
array | 작성자의 뱃지 목록 (없으면 빈 배열). 각 항목은 id, name, imageUrl 포함 |
content |
string | 채팅 메시지. 이모티콘 토큰이 포함될 수 있음 |
messageTime |
string | 메시지 전송 시간 (ISO 8601) |
emojis |
object | 이모티콘 토큰과 이미지 URL 매핑 |
드롭스 추첨 완료 (DROPS)
랜덤 쿠폰 보상의 추첨이 끝나면 해당 캠페인이 연결된 방송으로 DROPS 이벤트가 전달됩니다.
별도 구독이 필요 없으며, 채팅 이벤트 구독으로 함께 수신합니다.
수신 조건은 두 가지입니다.
- 캠페인이 연결된 방송이 송출 중일 것 (방송이 꺼져 있으면 전달되지 않습니다)
- 해당 회차에 실제로 당첨자가 나왔을 것
{
"event": "DROPS",
"data": {
"channelId": "12345",
"campaignId": "778",
"rewardId": "1024",
"rewardTitle": "게임 아이템 쿠폰",
"rewardDescription": "인게임에서 사용 가능한 아이템 쿠폰입니다.",
"rewardImageUrl": "https://example.com/rewards/item-coupon.png",
"count": 30,
"drawnAt": "2024-01-15T10:30:00.000Z"
}
}
| 필드 | 타입 | 설명 |
|---|---|---|
channelId |
string | 추첨 결과가 전달된 채널의 ID |
campaignId |
string | 드롭스 캠페인 ID |
rewardId |
string | 드롭스 보상 ID |
rewardTitle |
string | 보상명 |
rewardDescription |
string | 보상 설명 |
rewardImageUrl |
string | 보상 이미지 URL |
count |
number | 이번 회차 당첨자 수 |
drawnAt |
string | 추첨 시각 (ISO 8601) |
추첨은 한 캠페인에서 여러 번 일어날 수 있습니다. 운영자가 쿠폰을 나눠 배분하거나, 캠페인 종료 후 쿠폰을 추가 등록해 잔여 대상자에게 재추첨하는 경우입니다.
그때마다 이벤트가 발생하며 count는 그 회차의 당첨자 수입니다. 누적값이 아니므로 총 당첨자를 알아야 하면 직접 합산하세요.
굿즈 구매 인증 메시지 (GOODS_PURCHASE)
시청자가 마플샵에서 산 굿즈를 방송 중에 인증하면 전달됩니다. 채팅창에 카드 형태로 노출되는 메시지이며, 별도 구독 없이 채팅 이벤트 구독으로 함께 수신합니다.
일반 채팅과 달리 구매 정보(상점·상품·금액) 가 함께 옵니다.
{
"event": "GOODS_PURCHASE",
"data": {
"channelId": "12345",
"senderChannelId": "67890",
"profile": {
"nickname": "닉네임",
"badges": [
{ "id": "subscribe_tier1", "name": "티어1 구독자", "imageUrl": "https://..." }
]
},
"content": "굿즈 잘 받았어요!",
"messageTime": "2024-01-15T10:30:00.000Z",
"emojis": {},
"shopName": "테스트샵",
"representativeItemName": "교복 리본 아크릴",
"itemCount": 2,
"totalAmount": 150000,
"currency": "KRW"
}
}
| 필드 | 타입 | 설명 |
|---|---|---|
channelId |
string | 인증 메시지가 전달된 채널의 ID |
senderChannelId |
string | null | 구매자의 채널 ID. 익명 전송 시 null |
profile |
object | null | 구매자 프로필(nickname, badges). 익명 전송 시 null |
content |
string | 인증 메시지. 이모티콘 토큰이 포함될 수 있음 |
messageTime |
string | 메시지 전송 시간 (ISO 8601) |
emojis |
object | 이모티콘 토큰과 이미지 URL 매핑 |
shopName |
string | 굿즈를 구매한 마플샵 상점명 |
representativeItemName |
string | 대표 상품명. 결제액이 가장 큰 품목 |
itemCount |
number | 상품 종류 수. itemCount - 1 이 "외 N건" |
totalAmount |
number | 해당 상점 결제 총액 |
currency |
string | 결제 통화. KRW / USD / JPY |
totalAmount는 후원의payAmount와 단위가 다릅니다. 후원은 빔이지만 여기는 실제 결제 금액이라currency를 함께 봐야 합니다. 후원 집계에 합산하지 마세요.- 인증은 결제 1건 × 상점 1곳당 한 번만 가능합니다. 같은 구매로 이벤트가 여러 번 오지 않습니다.
- 익명 전송이면
profile이 모두null입니다.
이모티콘 토큰
채팅 메시지에는 구독자 이모티콘이 토큰 형태로 포함될 수 있습니다.
토큰 형식: :{channelIdentifier}-{emojiName}:
{
"content": "안녕하세요 :AaBbCc-heart:",
"emojis": {
":AaBbCc-heart:": "https://example.com/emojis/heart.webp"
}
}
메시지 본문에서 토큰을 emojis 매핑의 이미지 URL로 치환하여 렌더링합니다.
"안녕하세요 :AaBbCc-heart: 반갑습니다"
→ "안녕하세요 <img src="...heart.webp"> 반갑습니다"