v1에서 v2로 마이그레이션하기

chzzkpy v2 부터는 치지직 개발자 센터 에서 제공하는 공식 API를 지원하기 시작합니다.비공식 API를 더 이상 이용하지 못하는 것은 아닙니다.아직 공식 API 중에는 미션 후원 등의 수신 받을 수 없는 등의 부족한 부분이 상당히 많습니다.네이버는 비공식 API의 사용을 공식적으로 허용한 적 없으나, 서비스에 해를 가하지 않는 범위에서 비공식 API를 사용하는 것을 제지하지 않겠다고 입장을 밝힌 상태입니다. 따라서 비공식 API 이용 과정에서 비정상적인 요청이 과도하게 발생할 경우 네이버 계정 보호 조치가 이루어질 수 있습니다.

chzzkpy 개발진은 비공식 API를 사용하여 발생하는 어떠한 법적 책임을 져드릴 수 없습니다.따라서 개인용 채팅 봇이 아닌 이상 공식 API의 사용을 권장드리고 싶습니다.

공식 API와 비공식 API는 엄연히 다른 SDK 패키지이지만, 최대한 비슷하게 사용할 수 있도록 개발하였습니다.

이 문서는 비공식 API(v1.x.x)에서 공식 API(v2.x.x)로 마이그레이션을 진행하는 방법을 설명합니다.

패키지 이름 수정하기

공식 API를 제공하는 패키지와 비공식 API를 제공하는 패키지는 서로 분리되어 있습니다.따라서 아래의 코드 블록과 같이 소스코드를 수정할 필요가 있습니다.

# Before
from chzzkpy.chat import ChatClient

# After
from chzzkpy.unofficial.chat import ChatClient  # Unofficial API
from chzzkpy import Client  # Official API

이전에 공지한 것과 같이 8월 1일부터 공식 API를 제공하는 패키지가 기본 패키지로 대체되었습니다.비공식 API를 제공하는 SDK 패키지를 이용하려면 chzzkpy.unofficial 패키지를 호출하셔야 합니다.

클라이언트 인증

chzzkpy v1에서 제공되는 클라이언트는 통신 간 주고받는 ‘NID_AUT’와 ‘NID_SES’의 쿠키 값으로 인증을 진행하였습니다. 반면의 chzzkpy v2에서 제공하는 클라이언트는 CHZZK Developer Center 에서 발급받는 ‘Client ID’ 그리고 ‘Client Secret’를이용합니다.

# Before
client = ChatClient()
client.login("NID_AUT", "NID_SES")

# After
client = Client("client_id", "client_secret")

방송 과정에서 주고 받는 메시지를 수신하기 위해서는 별도의 사용자 인증 절차가 필요합니다.아래의 두 가지 방법을 통해 사용자 인증을 진행할 수 있습니다.

첫 번째 방법은 generate_authorization_token_url 함수와 generate_user_client 함수를 이용하는 방법입니다.

async def authentic_user():
    authorization_url = client.generate_authorization_token_url(redirect_url="https://localhost", state="abcd12345")
    print(f"Please login with this url: {authorization_url}")
    code = input("Please input response code: ")

    user_client = await client.generate_user_client(code, "abcd12345")

    # await user_client.fetch_self()
    print(user_client.channel_id)

generate_authorization_token_url 함수를 이용하여 OAuth2를 진행할 URL을 받습니다. 서드파티 인증을 성공하게 되면, 리다이렉션 URL로 이동하게 됩니다. 리다이렉션 URL에는 인증에 사용되는 code`를 포함하고 있습니다.:class:`generate_user_client <chzzkpy.client.Client.generate_user_client> 함수의매개변수에 리다이렉션 URL에 포함되어 있던 code 매개변수를 입력해주세요.

(추천 / v2.1~) 두 번째 방법은 Client.login 함수를 이용하는 방법입니다.

client = Client(client_id, client_secret)
await client.login()

만약 client.login 호출하게 되면인증을 위한 임시 웹 서버가 가동되게 되며, 서드파티 인증을 위한 웹브라우저가 열리게 됩니다.

인증에 성공하게 되면 인증된 정보를 담고 있는 UserClient 객체를 반환받게 됩니다.

이벤트 수신

공식 API에서 메시지, 후원 정보 등의 이벤트를 수신하기 위해서는 이벤트 구독을 해야 합니다. UserPermission 그리고 Client.connect 함수의 매개변수를 통해이벤트 구독을 진행할 수 있습니다.

permission_type1 = UserPermission.all()  # Receive all events.
permission_type2 = UserPermission(chat=True)  # Receive chat event.
permission_type3 = UserPermission(donation=True)  # Receive donation event.

await client.connect(permission=permission_type1)
# await UserClient.subscription(permission=permission_type1, ...)

또한, 세션에 연결한 이후로 구독이 필요한 경우, UserClient.subscription 함수를 이용하여 이벤트 구독을 할 수 있습니다.

다중 채널 연결 지원

chzzkpy v2부터 다중 채널 연결을 지원합니다. 하나의 클라이언트로 여러 방송인의 채널에서 주고 받는 메시지를 수신 받을 수 있습니다.

connect 함수의 addition_connect 매개변수를 이용하여 다중 채널 연결을 이용할 수 있습니다.

@client.event
async def on_chat(message):
    await message.send("응답")

async def main():
    authorization_url = client.generate_authorization_token_url(redirect_url="https://localhost", state="abcd12345")
    print(f"Please login with this url: {authorization_url}")
    code1 = input("Please input response code1: ")
    code2 = input("Please input response code2: ")

    user_client1 = await client.generate_user_client(code1, "abcd12345")
    user_client2 = await client.generate_user_client(code2, "abcd12345")

    await user_client1.connect(UserPermission.all(), addition_connect=True)
    await user_client2.connect(UserPermission.all())

on_chat 이벤트 함수에는 user_client1, user_client2에서 수신되는 모든 이벤트를 불러올 수 있습니다.만약 메시지 회신을 위한 send 메소드를 이용하게 된다면 메시지를 수신받은 채널을 기준으로 응답 메시지를 회신합니다.

addition_connect 매개변수 값이 True라면, 이벤트 수신하는 과정은 백그라운드에서 진행하게 됩니다. `user_client1`의 이벤트는 백그라운드에서 수신받고 있으며, `user_client2`의 이벤트는 메인 스레드에서 수신받고 있습니다.

메인 스레드에서 작업이 필요하다면, addition_connect 매개변수를 이용하여 이벤트 수신을 모두 백그라운드에서 진행할 수 있습니다. 하지만 메인 스레드가 종료된다면 백그라운드도 모두 종료되어 더 이상 이벤트를 수신받을 수 없는 상태가 됩니다. 따라서 메인 스레드가 종료되는 일은 최대한 없도록 만들어야 합니다.