Skip to content

Instantly share code, notes, and snippets.

@fi-xz
Last active April 27, 2025 08:41
Show Gist options
  • Save fi-xz/69ce1f35ca1b2318a2b410c0d5757e0f to your computer and use it in GitHub Desktop.
Save fi-xz/69ce1f35ca1b2318a2b410c0d5757e0f to your computer and use it in GitHub Desktop.
CHZZK Official API - Session Test Results
import io from "socket.io-client";
const socketURL =
"https://ssio07.nchat.naver.com:443?auth=<AUTH_TOKEN>";
const socketOptions = {
reconnection: true,
forceNew: true,
timeout: 3000,
transports: ["websocket"],
} as SocketIOClient.ConnectOpts;
const socket = io.connect(socketURL, socketOptions);
socket.on("connect", () => {
console.log("connected");
});
socket.on("disconnect", () => {
console.log("disconnected");
});
socket.on("SYSTEM", function (data) {
console.log("SYSTEM: ", data);
});
socket.on("CHAT", function (data) {
console.log("CHAT: ", data);
});
socket.on("DONATION", function (data) {
console.log("DONATION: ", data);
});
socket.connect();
package foo.bar.myapp
import io.socket.client.IO
import kotlinx.coroutines.*
private const val SESSIONURL =
"https://ssio10.nchat.naver.com:443?auth=<AUTH_TOKEN>"
val socketOptions: IO.Options = IO.Options().apply {
reconnection = false
forceNew = true
timeout = 3000L
transports = arrayOf("websocket")
}
fun main() {
val scope = CoroutineScope(Dispatchers.IO)
scope.launch {
connect()
}
runBlocking { delay(Long.MAX_VALUE) }
}
fun connect() {
val socket = IO.socket(SESSIONURL, socketOptions)
socket.on("connect") {
println("connected")
}
socket.on("disconnect") {
println("disconnected")
}
socket.on("SYSTEM") {
println(it[0])
}
socket.on("CHAT") {
println(it[0])
}
socket.on("DONATION") {
println(it[0])
}
socket.connect()
}

μ‹œμž‘ν•˜κΈ° 전에

  • Ref - Session | CHZZK
  • μ±„νŒ… λ©”μ‹œμ§€ μ‘°νšŒμ™€ (후원 ꡬ독이 ν•„μš”ν•  μ‹œ) 후원 쑰회 Scope에 λŒ€ν•œ κΆŒν•œ 심사가 λͺ¨λ‘ λ§ˆμ³€μŒμ„ κ°€μ •ν•©λ‹ˆλ‹€. κ·Έλ ‡μ§€ μ•Šμ„ 경우 500 Internal Server Error와 ν•¨κ»˜ μ„Έμ…˜ μ—°κ²° URLλΆ€ν„° λ°œκΈ‰μ΄ λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

μ„Έμ…˜ μ—°κ²° μž‘μ—…

  • λ§Žμ€ μΈμ›μ˜ Eventλ₯Ό κ΅¬λ…ν•΄μ•Όν•˜λŠ” 경우(예: λ§ˆμΈν¬λž˜ν”„νŠΈ 슀트리머 후원을 1천λͺ… μ—°λ™ν•˜λŠ” 경우 λ“±), 각 μŠ€νŠΈλ¦¬λ¨Έκ°€ 개발자의 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— OAuth λ‘œκ·ΈμΈμ„ ν•˜κ²Œλ” ν•˜μ—¬ Access Token을 λ°œκΈ‰ λ°›μ•„ μ„Έμ…˜μ„ μƒμ„±ν•˜λŠ” 방식을 μΆ”μ²œλ“œλ¦½λ‹ˆλ‹€. μ΄λŠ” Client 인증으둜 μ„Έμ…˜μ„ λ°œκΈ‰ λ°›μ•„ 15개의 μ±„λ„μ˜ μ±„νŒ…, 후원 이벀트λ₯Ό λͺ¨λ‘ κ΅¬λ…ν•˜λŠ” 경우 30개 μ œν•œμ— λ„λ‹¬ν•˜λ©°, Access Token 방식은 ν•œ μ„Έμ…˜λ‹Ή μ΅œλŒ€ 30개의 이벀트λ₯Ό ꡬ독할 수 μžˆλŠ” μ œν•œμ„ λ²—μ–΄λ‚˜κΈ° μœ„ν•œ 방법이기 λ•Œλ¬Έμž…λ‹ˆλ‹€.
  • API둜 λ°œκΈ‰λœ Session Socket URL은 μœ νš¨ν•œ μ‹œκ°„μ΄ μ–Όλ§ˆλ‚˜ λ˜λŠ”μ§€λŠ” μ •ν™•ν•˜κ²Œ μ•Œ 순 μ—†μœΌλ‚˜(μ˜ˆμƒμœΌλ‘œλŠ” μ•½ 30초 ~ 1λΆ„?), λ§Œμ•½ 연결을 μ‹œλ„ν–ˆμ„ λ•Œ URL이 μ˜¬λ°”λ¦„μ—λ„ 뢈ꡬ μ—°κ²° μ‹œλ„μ‹œ 연결이 λ°”λ‘œ λŠκΈ°λŠ” 경우, ν•΄λ‹Ή URL이 λ§Œλ£Œλœκ²ƒμž…λ‹ˆλ‹€. μƒˆλ‘œ λ°œκΈ‰ λ°›μœΌμ…”μ•Όν•©λ‹ˆλ‹€.
  • ν˜„μž¬ Client μΈμ¦λ§Œμ„ μ΄μš©ν•΄μ„œ 개발자의 채널 이외 타 슀트리머의 μ±„νŒ…μ΄λ‚˜ 후원을 κ΅¬λ…ν•˜κ³  싢은 경우, REST API둜 ꡬ독 μš”μ²­μ„ 전솑 ν•  λ•Œ Authorization ν—€λ”μ˜ Bearer 토큰 값을 μŠ€νŠΈλ¦¬λ¨Έκ°€ 사전에 인증 Scheme을 μ™„λ£Œν•˜μ—¬ λ°œκΈ‰ν•œ Access Token κ°’μœΌλ‘œ μ§€μ •ν•˜λ©΄ κ°€λŠ₯ν•©λ‹ˆλ‹€. λ‹€λ§Œ, ν•œ μ„Έμ…˜λ‹Ή μ΅œλŒ€λ‘œ ꡬ독할 수 μžˆλŠ” 이벀트 개수λ₯Ό κ³ λ €ν•˜μ—¬, 개인적으둜 μ„Έμ…˜ 자체λ₯Ό Access Token λ°©μ‹μœΌλ‘œ μƒμ„±ν•˜λŠ” 것을 μΆ”μ²œλ“œλ¦½λ‹ˆλ‹€.
    • λ‚΄μš©μ„ λŒ€μΆ© μ½μœΌμ…¨λ‹€λ©΄ μ•Œκ² μ§€λ§Œ, λ„€. 슀트리머의 λ‘œκ·ΈμΈμ„ ν¬ν•¨ν•˜μ§€ μ•Šκ³  ν•΄λ‹Ή 슀트리머 μ±„λ„μ˜ μ±„νŒ…μ΄λ‚˜ 후원 이벀트λ₯Ό ꡬ독할 수 μžˆλŠ” 방법은 μ•„μ˜ˆ μ—†μŠ΅λ‹ˆλ‹€. λ‚΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ Client 정보 λ‹¨μΌλ‘œ λ‚΄ 채널 ν˜Ήμ€ 채널 ꡬ독은 μ•„μ˜ˆ λΆˆκ°€λŠ₯ν•˜λ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€. λ‚΄ 채널을 ꡬ독할 λ•Œμ—λ„ REST API에 인증 토큰을 λ„£μ–΄μ•Όν•˜λ‹ˆκΉŒμš”.
  • ν˜„μž¬ Client 인증을 톡해 μƒμ„±λœ Session(및 Session Key)에 λŒ€ν•΄ λ‹€μŒ λ‚΄μš©μ€ 확인이 μ–΄λ ΅κ±°λ‚˜ λΆˆκ°€λŠ₯ν•œκ²ƒμœΌλ‘œ νŒŒμ•…λ©λ‹ˆλ‹€:
    • μ„Έμ…˜ URL을 λ°œκΈ‰ ν•œ λ’€ 연결을 μ§„ν–‰ ν–ˆμœΌλ‚˜ 연결이 끊긴 κ²½μš°λ‚˜ 졜초 μ—°κ²° μ œν•œ μ‹œκ°„μ΄ μ§€λ‚œ 이후, μ„Έμ…˜ λͺ©λ‘μ„ μ‘°νšŒν–ˆμ„λ•Œ 연결이 λŠκ²Όκ±°λ‚˜ μ—°κ²° μ‹œκ°„μ΄ μ§€λ‚˜λ²„λ¦° μ„Έμ…˜ 정보가 μ„Έμ…˜ λͺ©λ‘μ—μ„œ μ‚¬λΌμ§€λŠ” μ‹œκ°„ (ν˜„μž¬ μ΅œλŒ€ 39개의 μ„Έμ…˜ 생성 이후 μΆ”κ°€ μ„Έμ…˜μ„ μƒμ„±ν•˜λ €κ³  ν•  λ•Œ μ‚¬λΌμ§€λŠ” 쑰건으둜 좔츑됨)
    • κ°•μ œλ‘œ μ„Έμ…˜μ„ μ„Έμ…˜ λͺ©λ‘μ—μ„œ μ œκ±°ν•  수 μžˆλŠ” 방법 (μ•„λ§ˆ κ·Έλƒ₯ λ―Έμ œκ³΅ν•˜λŠ”κ²ƒμœΌλ‘œ μΆ”μΈ‘ν•©λ‹ˆλ‹€.)

많이 ν•˜λŠ” μ‹€μˆ˜

  • κ°€μž₯ 큰 μ°©μ˜€κ°€ λ°œμƒ ν•  수 μžˆλŠ” λΆ€λΆ„μœΌλ‘œ, 곡식 λ¬Έμ„œμ—μ„œ "μ΅œλŒ€ n개의 API 연결을 μœ μ§€ ν•  수 있음" λ‚΄μš©μ€ λ™μ‹œμ— 연결을 μœ μ§€μ‹œν‚¬ 수 μžˆλŠ” 개수λ₯Ό λœ»ν•˜λ©° κ°œλ°œμžκ°€ μ΅œλŒ€λ‘œ 생성 ν•  수 μžˆλŠ” μ„Έμ…˜μ˜ κ°œμˆ˜κ°€ μ•„λ‹™λ‹ˆλ‹€. μ„Έμ…˜μ€ μ–Έμ œλ“ μ§€ μ—¬λŸ¬κ°œ 생성할 수 μžˆλŠ”κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€. λ‹€λ§Œ μ΅œλŒ€ μ„Έμ…˜ 쑰회 κ°€λŠ₯ 개수인 39개 이상을 μƒμ„±ν•˜λ©΄ μ–΄λ–»κ²Œ λ˜λŠ”μ§€μ— λŒ€ν•΄μ„œλŠ” ν™•μΈν•΄λ³΄μ§ˆ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.
  • λ‘λ²ˆμ§Έλ‘œ κ°€μž₯ λ§Žμ€ 착였둜, 이벀트λ₯Ό ꡬ독/ꡬ독 μ·¨μ†Œ ν•  λ•Œ μ‚¬μš©ν•˜λŠ” sessionKey값은 POST μš”μ²­μ΄μ–΄λ„ Query Parameter(?sessionKey=XXXXXX)둜 μ„€μ •ν•΄μ•Όν•˜λ©° μš”μ²­ Body에 JSON ν˜•νƒœλ‘œ μž‘μ„±ν•˜λŠ” 방식은 μ§€μ›λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. (μ—¬λ‹΄..)
  • WebSocket 연결이 λ˜μ–΄ μžˆμ§€ μ•ŠλŠ” μƒνƒœμ—μ„œ REST APIλ₯Ό 톡해 Session Key μ •λ³΄λ§Œμ„ μ΄μš©ν•˜μ—¬ Eventλ₯Ό ꡬ독할 μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€. 400 Bad Request와 μ—°κ²° 확인 였λ₯˜ λ©”μ‹œμ§€λ₯Ό μ•ˆλ‚΄ν•©λ‹ˆλ‹€.

Client 라이브러리 정보

  • TypeScript κΈ°μ€€ socket.io-client 버전 2.0.3, @types/socket.io-client 버전 1.4.36이 κ°€λŠ₯ν•œ μ΅œλŒ€ λ²„μ „μœΌλ‘œ λ³΄μž…λ‹ˆλ‹€. μ΄μ™Έμ˜ 버전을 μ‚¬μš©ν•˜λ©΄ μ„œλ²„λ‹¨μ—μ„œ κ°•μ œλ‘œ μ—°κ²°ν•΄μ£Όμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • Java/Kotlin κΈ°μ€€ socket.io-client-java 버전 1.0.2κ°€ κ°€λŠ₯ν•œ μ΅œλŒ€ λ²„μ „μœΌλ‘œ λ³΄μž…λ‹ˆλ‹€. μ΄μ™Έμ˜ 버전을 μ‚¬μš©ν•˜λ©΄ μ„œλ²„λ‹¨μ—μ„œ κ°•μ œλ‘œ μ—°κ²°ν•΄μ£Όμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

기타 정보

  • Session Socket URL(λ°œκΈ‰ 받은 μ„Έμ…˜ μ—°κ²° URL을 의미)은 https://ssio<번호>.nchat.naver.com:443?auth=<AUTH_TOKEN>둜 λ°˜ν™˜λ˜λ©° 주둜 ν™•μΈλœ λ²ˆν˜Έλ“€λ‘œ 07, 09, 27이 μ‘΄μž¬ν•©λ‹ˆλ‹€. λ°œκΈ‰λœ URL λ‚΄μ˜ 숫자 이외 λ‹€λ₯Έ 숫자둜 연결이 μ •μƒμ μœΌλ‘œ μ§„ν–‰λ˜λŠ”μ§€λŠ” μ‹œλ„ν•΄λ³΄μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

  • ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œ μ½”λ“œ μ—­μ‹œ 이 Gist에 μ²¨λΆ€ν•©λ‹ˆλ‹€.

SYSTEM

μ•„λž˜μ˜ λ‚΄μš©μ€ μ„Έμ…˜ μ—°κ²° 이후 SYSTEM 이벀트λ₯Ό κ΅¬λ…ν•˜μ˜€μ„ λ•Œ μˆ˜μ‹ λ°›μ„ 수 μžˆλŠ” λ©”μ‹œμ§€ μ’…λ₯˜μž…λ‹ˆλ‹€.

λͺ¨λ“  λ©”μ‹œμ§€λŠ” JSON λ©”μ‹œμ§€λ‘œ μ΄λ£¨μ–΄μ ΈμžˆμœΌλ©°, 가독성을 μœ„ν•΄ Indentλ₯Ό μ£Όμ—ˆμŠ΅λ‹ˆλ‹€. μ‹€μ œλ‘œλŠ” ν•œ μ€„λ‘œ ν‘œμ‹œλ©λ‹ˆλ‹€.

뢀가적인 μ„€λͺ…을 μœ„ν•˜μ—¬ λ¬Έμ„œμ˜ JSON은 λͺ¨λ‘ JSONC둜 μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€! μ‹€μ œ JSONμ—μ„œλŠ” 주석이 λΆˆκ°€λŠ₯ν•œ 점 μœ μ˜ν•˜μ‹œκΈΈ λ°”λžλ‹ˆλ‹€.

  • μ±„νŒ… μ—°κ²° μ§„ν–‰ μ‹œ
{
    "type": "connected",
    "data": {
        "sessionKey": "<SOCKET_SESSION_KEY>"
        // ν˜„μž¬ μ—°κ²°λœ μ„Έμ…˜μ˜ Session Key 값을 νšλ“ν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.
        // μœ„ 정보λ₯Ό μ΄μš©ν•˜μ—¬ Eventλ₯Ό κ΅¬λ…ν•˜κ±°λ‚˜ μ„Έμ…˜μ„ κ΅¬λΆ„ν•˜λŠ” μš©λ„λ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    }
}
{
    "type": "subscribed",
    "data": {
        "eventType": "CHAT", // ꡬ독 Event νƒ€μž…, μˆ˜μ‹  κ°€λŠ₯ν•œ 값은 CHAT, DONATIONμž…λ‹ˆλ‹€.
        "channelId": "<SUBSCRIBED_CHANNEL_ID>" // κ΅¬λ…ν•œ 채널 ID
    }
}
{
    "type": "subscribed",
    "data": {
        "eventType": "DONATION", // ꡬ독 Event νƒ€μž…, μˆ˜μ‹  κ°€λŠ₯ν•œ 값은 CHAT, DONATIONμž…λ‹ˆλ‹€.
        "channelId": "<SUBSCRIBED_CHANNEL_ID>" // κ΅¬λ…ν•œ 채널 ID
    }
}
{
    "type": "unsubscribed",
    "data": {
        "eventType": "CHAT", // ꡬ독 ν•΄μ§€ Event νƒ€μž…, μˆ˜μ‹  κ°€λŠ₯ν•œ 값은 CHAT, DONATIONμž…λ‹ˆλ‹€.
        "channelId": "<UNSUBSCRIBED_CHANNEL_ID>" // ꡬ독 ν•΄μ§€ν•œ 채널 ID
    }
}
{
    "type": "unsubscribed",
    "data": {
        "eventType": "DONATION", // ꡬ독 ν•΄μ§€ Event νƒ€μž…, μˆ˜μ‹  κ°€λŠ₯ν•œ 값은 CHAT, DONATIONμž…λ‹ˆλ‹€.
        "channelId": "<UNSUBSCRIBED_CHANNEL_ID>" // ꡬ독 ν•΄μ§€ν•œ 채널 ID
    }
}

CHAT

μ•„λž˜μ˜ λ‚΄μš©μ€ μ„Έμ…˜ μ—°κ²° 이후 CHAT 이벀트λ₯Ό κ΅¬λ…ν•˜μ˜€μ„ λ•Œ μˆ˜μ‹ λ°›μ„ 수 μžˆλŠ” λ©”μ‹œμ§€ μ’…λ₯˜μž…λ‹ˆλ‹€.

λͺ¨λ“  λ©”μ‹œμ§€λŠ” JSON λ©”μ‹œμ§€λ‘œ μ΄λ£¨μ–΄μ ΈμžˆμœΌλ©°, 가독성을 μœ„ν•΄ Indentλ₯Ό μ£Όμ—ˆμŠ΅λ‹ˆλ‹€. μ‹€μ œλ‘œλŠ” ν•œ μ€„λ‘œ ν‘œμ‹œλ©λ‹ˆλ‹€.

뢀가적인 μ„€λͺ…을 μœ„ν•˜μ—¬ λ¬Έμ„œμ˜ JSON은 λͺ¨λ‘ JSONC둜 μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€! μ‹€μ œ JSONμ—μ„œλŠ” 주석이 λΆˆκ°€λŠ₯ν•œ 점 μœ μ˜ν•˜μ‹œκΈΈ λ°”λžλ‹ˆλ‹€.

  • 일반 μ±„νŒ…
{
    "channelId": "<STREAMING_CHANNEL_ID>", // λ°©μ†‘μΈμ˜ 채널 ID
    "senderChannelId": "<CHAT_SENDER_CHANNEL_ID>", // λ©”μ‹œμ§€λ₯Ό μ „μ†‘ν•œ μ‚¬λžŒμ˜ 채널 ID
    "profile": { // μΉ˜μ§€μ§ ν”„λ‘œν•„ 정보
        "nickname": "<CHAT_SENDER_NICKNAME>", // λ©”μ‹œμ§€λ₯Ό μ „μ†‘ν•œ μ‚¬λžŒμ˜ λ‹‰λ„€μž„
        "verifiedMark": false, // μΉ˜μ§€μ§ 인증 마크 (νŒŒνŠΈλ„ˆ 슀트리머 인증 마크둜 μΆ”μ •)
        "badges": [ // 뱃지 이미지 URL λͺ©λ‘
            {
                "imageUrl": "https://ssl.pstatic.net/static/nng/glive/icon/streamer.png" // 슀트리머 본인의 뱃지 이미지
            }
            // 뱃지 μ’…λ₯˜λŠ” λ‹€μ–‘ν•œ 만큼, λͺ¨λ“  λ±ƒμ§€μ˜ URL을 κΈ°μž…ν•˜κΈ°λŠ” μ–΄λ €μš΄ 점 μ–‘ν•΄ λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.
        ]
    },
    "content": "do test {:d_47:}", // μ±„νŒ… λ‚΄μš©, μΉ˜μ§€μ§ μ±„νŒ… 이λͺ¨μ§€λŠ” μ€‘κ΄„ν˜Έ λ‚΄μ˜ 콜둠 ν‘œμ‹œμ™€ κ·Έ μ•ˆμ— 이λͺ¨μ§€ 이름을 λ‹΄λŠ” ν˜•νƒœλ‘œ κ΅¬μ„±λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€.
    "emojis": { // 이λͺ¨μ§€ 이름 및 URL
        "d_47": "https://ssl.pstatic.net/static/nng/glive/icon/b_07.gif?type=f60_60"
    },
    "messageTime": 1739110481425 // λ©”μ‹œμ§€ 전솑 μ‹œκ°
}

DONATION

μ•„λž˜μ˜ λ‚΄μš©μ€ μ„Έμ…˜ μ—°κ²° 이후 DONATION 이벀트λ₯Ό κ΅¬λ…ν•˜μ˜€μ„ λ•Œ μˆ˜μ‹ λ°›μ„ 수 μžˆλŠ” λ©”μ‹œμ§€ μ’…λ₯˜μž…λ‹ˆλ‹€.

λͺ¨λ“  λ©”μ‹œμ§€λŠ” JSON λ©”μ‹œμ§€λ‘œ μ΄λ£¨μ–΄μ ΈμžˆμœΌλ©°, 가독성을 μœ„ν•΄ Indentλ₯Ό μ£Όμ—ˆμŠ΅λ‹ˆλ‹€. μ‹€μ œλ‘œλŠ” ν•œ μ€„λ‘œ ν‘œμ‹œλ©λ‹ˆλ‹€.

뢀가적인 μ„€λͺ…을 μœ„ν•˜μ—¬ λ¬Έμ„œμ˜ JSON은 λͺ¨λ‘ JSONC둜 μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€! μ‹€μ œ JSONμ—μ„œλŠ” 주석이 λΆˆκ°€λŠ₯ν•œ 점 μœ μ˜ν•˜μ‹œκΈΈ λ°”λžλ‹ˆλ‹€.

  • 일반 후원
{
    "donationType": "CHAT", // 후원 νƒ€μž…, κ°€λŠ₯ν•œ νƒ€μž…μ€ ν˜„μž¬ CHAT, VIDEO 두 μ’…λ₯˜ μž…λ‹ˆλ‹€.
    "channelId": "<DONATION_RECEIVED_CHANNEL_ID>", // 후원을 μˆ˜μ‹ ν•œ 채널 ID (슀트리머)
    "donatorChannelId": "<DONATOR_CHANNEL_ID>", // 후원을 보낸 채널 ID (μ‹œμ²­μž)
    "donatorNickname": "<DONATOR_NICKNAME>", // 후원을 보낸 μ±„λ„μ˜ λ‹‰λ„€μž„ (μ‹œμ²­μž λ‹‰λ„€μž„)
    "payAmount": 1000, // 후원 κΈˆμ•‘
    "donationText": "TEST" // 후원 λ‚΄μš©
}
  • μ˜μƒ 후원
    • μ˜μƒ URL에 λŒ€ν•œ 별도 μ •λ³΄λŠ” μ „λ‹¬λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
{
    "donationType": "VIDEO", // 후원 νƒ€μž…, κ°€λŠ₯ν•œ νƒ€μž…μ€ ν˜„μž¬ CHAT, VIDEO 두 μ’…λ₯˜ μž…λ‹ˆλ‹€.
    "channelId": "<DONATION_RECEIVED_CHANNEL_ID>", // 후원을 μˆ˜μ‹ ν•œ 채널 ID (슀트리머)
    "donatorChannelId": "<DONATOR_CHANNEL_ID>", // 후원을 보낸 채널 ID (μ‹œμ²­μž)
    "donatorNickname": "<DONATOR_NICKNAME>", // 후원을 보낸 μ±„λ„μ˜ λ‹‰λ„€μž„ (μ‹œμ²­μž λ‹‰λ„€μž„)
    "payAmount": 1000, // 후원 κΈˆμ•‘
    "donationText": "μΉ˜μ§€μ§, 슀트리밍이 μ‹œμž‘λ©λ‹ˆλ‹€." // 후원 λ‚΄μš©, μ˜μƒ ν›„μ›μ˜ 경우 후원 λ‚΄μš©μ΄ μ˜μƒμ˜ 제λͺ©μž…λ‹ˆλ‹€.
}

  • 후원 μ΄λ²€νŠΈλŠ” λŒ€λΆ€λΆ„ μ‹€μ œ 후원 μ΄λ²€νŠΈμ— λŒ€ν•΄μ„œλ§Œ λ™μž‘ν•©λ‹ˆλ‹€. 후원을 ν…ŒμŠ€νŠΈ ν•˜κ³  μ‹Άλ‹€λ©΄ 수읡 창좜이 ν™œμ„±ν™” 된 채널 κΈ°μ€€μœΌλ‘œ μΉ˜μ§€μ§ μŠ€νŠœλ””μ˜€ β†’ 방솑 관리 β†’ μ•Œλ¦Ό β†’ 후원 μ•Œλ¦ΌμœΌλ‘œ μ΄λ™ν•˜μ—¬ 후원 μ•Œλ¦Ό ꡬ역 μ΅œν•˜λ‹¨μ˜ "ν…ŒμŠ€νŠΈ μ•Œλ¦Ό 보내기" κΈ°λŠ₯을 μ΄μš©ν•΄μ£Όμ‹œκΈΈ λ°”λžλ‹ˆλ‹€. (https://studio.chzzk.naver.com/채널 ID/notification)

  • 읡λͺ… 후원을 μ§„ν–‰ν•  μ‹œ donatorChannelIdλŠ” "anonymous", donatorNickname은 ""μž…λ‹ˆλ‹€.

  • 슀트리머의 후원 κΈˆμ•‘ ν‘œμ‹œ 여뢀와 관계 없이 곡식 APIλ₯Ό ν†΅ν•˜μ—¬ 받은 Eventμ—μ„œλŠ” payAmountκ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

FAQ

Q. 이거 곡유 해도 λ˜λ‚˜μš”?

A. λ„€ λ©λ‹ˆλ‹€.

@HyunWinter
Copy link

@fi-xz μ•„ν•˜ λΉ λ₯΄κ³  μžμ„Έν•œ λ‹΅λ³€ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. 정말 도움이 많이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€!

@fi-xz
Copy link
Author

fi-xz commented Apr 27, 2025

@HyunWinter
λ©”μ‹œμ§€ μˆ˜μ • 확인이 늦게 λ˜μ–΄ μ²¨μ–Έν•©λ‹ˆλ‹€.

Q. λ§Œμ•½ μ–΄λ–€ 였λ₯˜λ‘œ 인해 Access Token λ°œκΈ‰μ— λ¬Έμ œκ°€ 생겨 μŠ€νŠΈλ¦¬λ¨Έκ°€ λ‹€μ‹œ 개발자 앱에 λ‘œκ·ΈμΈν•΄μ•Ό ν•˜λŠ” 상황이 생기면 μŠ€νŠΈλ¦¬λ¨Έμ—κ²Œ μ•Œλ¦΄ 방법이 μ œν•œλ˜μ§€ μ•Šμ€κ°€?

A. μ•„μ‰½κ²Œλ„ ν˜„μž¬λ‘œμ¨λŠ” 방법이 없을 것 κ°™μŠ΅λ‹ˆλ‹€... 😭

제 지인이 ν”„λ‘œλ•μ…˜μ— 곡식 APIλ₯Ό μ‚¬μš©ν•˜λ©΄μ„œ μ‹€μ œλ‘œ Access Token 관리 μ½”λ“œμ—μ„œ Refresh λ‘œμ§μ„ 빠뜨렀 Token이 만료된 상황이 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. κΈ΄κΈ‰ν•˜κ²Œ 재둜그인이 ν•„μš”ν•œ μƒν™©μ—μ„œ 였λ₯˜ 원인 검증 및 μŠ€νŠΈλ¦¬λ¨Έμ—κ²Œ 재둜그인 μš”μ²­μ„ μ§„ν–‰ν•˜λŠ”λ°μ— κ½€λ‚˜ νž˜μ„ 썼닀고 ν•©λ‹ˆλ‹€..

λ‹€ν–‰νžˆ κ·Έ μƒν™©μ—μ„œλŠ” μŠ€νŠΈλ¦¬λ¨ΈλΆ„μ΄ λΉ λ₯΄κ²Œ λ‘œκ·ΈμΈν•΄μ£Όμ…”μ„œ λ¬Έμ œκ°€ ν•΄μ†Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€λ§Œ, μ‹€μ‹œκ°„ 상황이 μ€‘μš”ν•œ ν˜Ήμ€ λŒ€ν˜• μ„œλΉ„μŠ€ ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œλŠ” 골머리 썩을 문제둜 λ³΄μž…λ‹ˆλ‹€.

넀이버가 이 뢀뢄을 쑰금 더 κ°œμ„ ν•΄μ£Όμ—ˆμœΌλ©΄ ν•˜λŠ”λ°(Response Codeλ‚˜ μƒμ„Έν•œ 였λ₯˜ λ©”μ‹œμ§€ λ“±), 뭐 μ–΄μ©Œκ² μŠ΅λ‹ˆκΉŒ. 일단 곡식 API라도 쀀거에 κ°μ‚¬ν•˜κ²Œ μƒκ°ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€ πŸ˜…

@fi-xz
Copy link
Author

fi-xz commented Apr 27, 2025

Gistμ—μ„œλŠ” Issue/PRκ³ΌλŠ” λ‹€λ₯΄κ²Œ μ‹€μ‹œκ°„μœΌλ‘œ λŒ“κΈ€ μΆ”κ°€/μˆ˜μ •μ— λŒ€ν•΄μ„œ 반영이 λ˜μ§€ μ•Šκ±°λ‚˜ 느린 λͺ¨μ–‘μž…λ‹ˆλ‹€. λΉ λœ¨λ¦¬λŠ” 뢀뢄이 μ‘΄μž¬ν•΄λ„ μ–‘ν•΄ λΆ€νƒλ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€ πŸ™

@HyunWinter
Copy link

@fi-xz μΉœμ ˆν•˜κ²Œ μ•Œλ €μ£Όμ…”μ„œ λ‹€μ‹œ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. 일단 λƒ…λ‹€ λ§Œλ“€κ³  ν…ŒμŠ€νŠΈν•˜λ©΄μ„œ λ°”κΏ”μ•Ό ν•˜λ‚˜ μ‹Άμ—ˆλŠ”λ°, 덕뢄에 μžμ„Έν•œ λ°©ν–₯성이 μž‘ν˜”μ–΄μš”. 쒋은 ν•˜λ£¨λ˜μ„Έμš”! (_ _

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment