https://developers.chzzk.naver.com/
치지직 CHZZK
지금, 스트리밍이 시작됩니다. 치지직-
developers.chzzk.naver.com
네이버에서 운영하는 스트리밍 서비스 치지직에서 API를 공식으로 제공하고 있다.
사실, 치지직에서 공식 API 서비스를 제공하고 있지만 API에서 제공하는 기능들이 그렇게 많지는 않다. 서비스를 시작한지 1년이 조금 넘은 플랫폼이다 보니 아직 API도 가오픈 같은 느낌이 들 정도로 제공하는 기능들이 많지는 않은 것 같다.
그래도 응답 테스트 겸, 파이썬 코드로 치지직 API를 사용하여 간단하게 응답을 받는 방법에 대해 설명해보려 한다.
1. 애플리케이션 등록하기
https://developers.chzzk.naver.com/application
치지직 CHZZK
지금, 스트리밍이 시작됩니다. 치지직-
developers.chzzk.naver.com
먼저 위 사이트로 이동해서 네이버로 로그인 후 상단의 Application 버튼을 클릭한다.
이후 애플리케이션 목록 - 애플리케이션 등록 버튼을 클릭한다.
애플리케이션 ID, 애플리케이션 이름, 로그인 리디렉션 URL을 지정한다.
애플리케이션 ID와 이름의 경우 사용자 마음대로 지정해도 되고, 본인처럼 테스트를 위한 경우나 잘 모르겠다면
로그인 리디렉션 URL을 https://localhost:8080으로 지정한다.
개발하고 싶은 기능에 맞춰 API Scope를 지정한다.
해당 scope 지정의 경우 scope마다 필요로 하는 인증 방식이 다르고, 기능들을 사용하기 위해서는 치지직에서 권한에 대해 승인을 받아야 사용할 수 있다.
Scope 지정을 완료했다면 저장 후 등록 버튼을 클릭한다.
등록을 완료하고 애플리케이션에서 Client ID, Secret Key 값을 확인할 수 있고, 애플리케이션 이름, 리디렉션 URL, Scope 정보도 수정해 줄 수 있다.
Scope의 경우 기능 추가 및 변경 시, 해당 기능에 대해 치지직에 권한을 다시 승인받아야 한다.
2. Authorization(인증) 시작하기
https://chzzk.gitbook.io/chzzk/chzzk-api/authorization
Authorization | CHZZK
치지직 Open API 사용과 인증에 관련된 문서입니다. 가이드에 작성된 API 명세와 인증 플로우는 이후 개발 상황에 따라 변경 될 수 있습니다. 인증 코드 요청 및 발급 치지직 Access Token 발급을 위한
chzzk.gitbook.io
치지직 API의 경우 Access Token 인증 방식과 Client 인증 방식으로 크게 구분된다.
지정한 Scope에 따라 요청에 필요한 인증 방식이 다르므로, 치지직 API 개발 문서를 참고하여 호출해야 한다.
인증 코드를 요청 및 발급하는 방법에 대해 먼저 알아보고, Client 인증은 뒷부분에 간략하게 알아본다.
전체 코드의 경우 전체 코드 부분에 첨부할 예정이므로 필요한 경우 아래에서 복사해서 사용하면 된다.
2-1. 인증 코드 요청 및 발급
치지직 Access Token을 발급받기 위해 인증 코드(Authorization Code)를 요청해야 한다.
위에서 지정했던 로그인 redirectUri로 code와 state 값을 전달받아 사용해야 한다.
인증 코드를 요청하기 위한 URL과 Access Token을 발급받기 위해 사용하는 URL이 다르므로 유의해야 한다.
URL Path
GET https://chzzk.naver.com/account-interlock
해당 URL을 통해 값을 호출한다.
Requset Parameter로 clientId, redirectUri, state 값을 필수적으로 보내야 한다. 이후 code 및 state값을 받고 이를 통해 Access Token을 발급받을 준비를 한다.
import requests
import secrets
import webbrowser
from urllib.parse import quote
from chzzk_token import Token, client_id
class ChzzkAuth:
def __init__(self, client_id, client_secret):
self.client_id = client_id
self.client_secret = client_secret
self.naver_auth_url = "https://chzzk.naver.com/account-interlock"
self.naver_token_url = "https://openapi.chzzk.naver.com/auth/v1/token"
def get_auth_url(self, redirect_uri, state):
"""네이버 인증 코드를 받기 위한 URL을 생성합니다"""
encoded_redirect = quote(redirect_uri)
auth_url = (
f"{self.naver_auth_url}"
f"?response_type=code"
f"&clientId={self.client_id}"
f"&redirectUri={encoded_redirect}"
f"&state={state}"
)
return auth_url
2-2. Access Token 발급
권한을 필요로하는 요청을 호출하는 경우 유저 인증을 위해 발급받는다.
Access Token의 경우 만료 기간은 1일이고, Refresh Token의 경우 30일이다.
URL Path
POST https://openapi.chzzk.naver.com/auth/v1/token
Request Body
data = {
"grantType": "authorization_code",
"clientId": self.client_id,
"clientSecret": self.client_secret,
"code": code,
"state": state,
"redirectUri": redirect_uri
}
def get_access_token(self, code, state, redirect_uri):
"""네이버 인증 코드로 Access Token을 발급받습니다"""
headers = {
'User-Agent': 'Mozilla/5.0',
'Content-Type': 'application/json',
'Authorization': f'Bearer {self.client_secret}'
}
data = {
"grantType": "authorization_code",
"clientId": self.client_id,
"clientSecret": self.client_secret,
"code": code,
"state": state,
"redirectUri": redirect_uri
}
try:
response = requests.post(self.naver_token_url, headers=headers, json=data)
if response.status_code == 200:
return response.json()
else:
return f"Error: {response.status_code} - {response.text}"
except Exception as e:
return f"Error: {str(e)}"
토큰 타입의 경우 Bearer 고정.
2-3. Access Token 갱신
Access Token이 만료되는 경우 해당 토큰을 사용한 API 호출은 401(INVALID_TOKEN) 응답을 반환한다.
해당 경우에 Refresh Token을 통하여 Access Token을 재발급 받아 사용한다.
Refresh Token 또한 만료되는 경우, 위 Access Token 발급 과정을 통해 새로운 Access Token을 발급받아야 한다.
URL Path
POST https://openapi.chzzk.naver.com/auth/v1/token
Request Body
data = {
'grantType': 'refresh_token',
'clientId': client_id,
'clientSecret': Token,
'refreshToken': refresh_token
}
재발급 코드
import os
import requests
from chzzk_token import client_id, refresh_token, Token # 저장된 client_id, Secret, refresh_token
def refresh_access_token():
"""Refresh Token을 사용하여 새로운 Access Token을 발급받습니다"""
url = 'https://openapi.chzzk.naver.com/auth/v1/token'
headers = {
'User-Agent': 'Mozilla/5.0',
'Content-Type': 'application/json'
}
data = {
'grantType': 'refresh_token',
'clientId': client_id,
'clientSecret': Token,
'refreshToken': refresh_token
}
try:
response = requests.post(url, headers=headers, json=data)
if response.status_code == 200:
token_info = response.json()
print(f"""
Access Token 재발급:
Access Token: {token_info.get('content',{}).get('accessToken')}
Refresh Token: {token_info.get('content',{}).get('refreshToken')}
Access Token 만료시간: {token_info.get('content',{}).get('expiresIn')}초
Scope: {token_info.get('content').get('scope')}
""")
return token_info.get('content', {})
else:
print(f"Error: {response.status_code} - {response.text}")
return None
except Exception as e:
print(f"Error: {str(e)}")
return None
def save_tokens(token_info):
"""발급받은 토큰을 파일에 저장합니다"""
if token_info and token_info.get('accessToken') and token_info.get('refreshToken'):
try:
# 현재 스크립트의 디렉토리 경로 가져오기
current_dir = os.path.dirname(os.path.abspath(__file__))
token_file_path = os.path.join(current_dir, 'chzzk_token.py')
# 파일 내용 준비
file_content = f"""# 치지직 API 토큰 정보
client_id = '{client_id}'
Token = '{Token}'
access_token = '{token_info['accessToken']}'
refresh_token = '{token_info['refreshToken']}'
"""
# 파일 쓰기
with open(token_file_path, 'w', encoding='utf-8') as f:
f.write(file_content)
print(f"\n토큰이 다음 파일에 저장되었습니다: {token_file_path}")
print("\n저장된 토큰 정보:")
print(f"Access Token: {token_info['accessToken']}")
print(f"Refresh Token: {token_info['refreshToken']}")
except Exception as e:
print(f"\n토큰 저장 중 오류 발생: {str(e)}")
print(f"시도한 파일 경로: {token_file_path}")
else:
print("\n저장할 토큰 정보가 올바르지 않습니다.")
print(f"받은 토큰 정보: {token_info}")
if __name__ == "__main__":
# Access Token 재발급 및 저장
new_token_info = refresh_access_token()
if new_token_info:
save_tokens(new_token_info)
2-4 Access Token 삭제
해당 Access Token, Refresh Token의 revoke가 필요할 경우 호출한다.
요청한 Token과 동일한 인증 과정을 거친 모든 Token이 제거된다. (clientId와 user가 동일한 Token)
URL Path
POST /auth/v1/token/revoke
Request Body
data = {
'clientId': client_id,
'clientSecret': Token,
'token': access_token, # 'accessToken' 대신 'token' 사용
'tokenTypeHint': 'access_token' # 토큰 타입 명시. default 값은 access_token
}
삭제 코드
import requests
from chzzk_token import client_id, Token, access_token # 저장된 client_id, client_secret, access_token
def revoke_access_token():
"""Access Token을 삭제(revoke)합니다"""
url = 'https://openapi.chzzk.naver.com/auth/v1/token/revoke'
headers = {
'User-Agent': 'Mozilla/5.0',
'Content-Type': 'application/json'
}
data = {
'clientId': client_id,
'clientSecret': Token,
'token': access_token, # 'accessToken' 대신 'token' 사용
'tokenTypeHint': 'access_token' # 토큰 타입 명시. default 값은 access_token
}
try:
response = requests.post(url, headers=headers, json=data)
if response.status_code == 200:
result = response.json()
if result.get('code') == 200:
print("Access Token이 성공적으로 삭제되었습니다.")
return True
else:
print(f"삭제 실패: {result.get('message')}")
return False
else:
print(f"Error: {response.status_code} - {response.text}")
return False
except Exception as e:
print(f"Error: {str(e)}")
return False
if __name__ == "__main__":
# Access Token 삭제
revoke_access_token()
2-5 Client 인증
클라이언트 인증은 헤더 정보에 Client-Id, Client-Secret 값을 넣어주면 된다
# Client 인증 헤더 설정
headers = {
'User-Agent': 'Mozilla/5.0',
'Content-Type': 'application/json',
'Client-Id': client_id,
'Client-Secret': Token
}
3. 코드 실행하기
인증 코드 및 Access Token 발급받기
# Access Token을 발급받기 위한 코드
import requests
import secrets
import webbrowser
from urllib.parse import quote
from chzzk_token import Token, client_id, refresh_token
class ChzzkAuth:
def __init__(self, client_id, client_secret):
self.client_id = client_id
self.client_secret = client_secret
self.naver_auth_url = "https://chzzk.naver.com/account-interlock"
self.naver_token_url = "https://openapi.chzzk.naver.com/auth/v1/token"
def get_auth_url(self, redirect_uri, state):
"""네이버 인증 코드를 받기 위한 URL을 생성합니다"""
encoded_redirect = quote(redirect_uri)
auth_url = (
f"{self.naver_auth_url}"
f"?response_type=code"
f"&clientId={self.client_id}"
f"&redirectUri={encoded_redirect}"
f"&state={state}"
)
return auth_url
def get_access_token(self, code, state, redirect_uri):
"""네이버 인증 코드로 Access Token을 발급받습니다"""
headers = {
'User-Agent': 'Mozilla/5.0',
'Content-Type': 'application/json',
'Authorization': f'Bearer {self.client_secret}'
}
data = {
"grantType": "authorization_code",
"clientId": self.client_id,
"clientSecret": self.client_secret,
"code": code,
"state": state,
"redirectUri": redirect_uri
}
try:
response = requests.post(self.naver_token_url, headers=headers, json=data)
if response.status_code == 200:
return response.json()
else:
return f"Error: {response.status_code} - {response.text}"
except Exception as e:
return f"Error: {str(e)}"
# 사용 예시
if __name__ == "__main__":
# 클라이언트 정보 설정
CLIENT_ID = client_id # 치지직에서 발급받은 client id
CLIENT_SECRET = Token # 치지직에서 발급받은 client secret
REDIRECT_URI = "http://localhost:8080"
STATE = secrets.token_urlsafe(16) # 보안을 위한 랜덤 문자열 생성
# 인증 객체 생성
auth = ChzzkAuth(CLIENT_ID, CLIENT_SECRET)
# 1. 인증 URL 생성 및 브라우저로 열기
auth_url = auth.get_auth_url(REDIRECT_URI, STATE)
print("인증 URL:", auth_url)
print("\n브라우저에서 인증 페이지를 열고 로그인을 진행합니다.")
webbrowser.open(auth_url)
print("\n1. 네이버 로그인을 완료해주세요.")
print("2. 권한 승인 후 리디렉션된 URL에서 'code' 파라미터 값을 복사해주세요.")
print("3. 실제 받은 state 값이 다음과 일치하는지 확인해주세요:", STATE)
# 2. 인증 코드로 Access Token 발급
code = input("\n인증 코드를 입력해주세요: ")
token_info = auth.get_access_token(code, STATE, REDIRECT_URI)
print("\n토큰 정보:", token_info)
위 코드는 Access Token을 발급받기 위해 인증 코드를 요청하고, 해당 인증 코드를 통해 Access Token을 발급받는다
코드를 실행시켜보면 웹 브라우저가 열리면서 아래와 같은 이미지가 표시될 것이다.
해당 사항에 동의한다는 버튼을 누르게 되면 아래와 같이 주소창에 code 정보가 표시될 것이다.
이 코드를 콘솔 창에 붙여넣기 해준 다음 엔터키를 누르면 Access Token을 발급받을 수 있다.
이렇게 발급받은 Access Token 정보와 Refresh Token 정보를 잘 보관해둔다.
본인은 chzzk_token.py 라는 이름으로 파일을 만들어 해당 파일 안에 저장했다.
#chzzk_token.py
# 치지직 API 토큰 정보
client_id = 'your_client_id'
Token = 'your_client_secret'
access_token = 'your_access_token'
refresh_token = 'your_refresh_token'
Refresh Token을 사용해서 Access Token 재발급받기
Refresh Token으로 재발급하는 경우는 Access Token이 만료되었을때 사용하면 된다.
해당 코드의 경우 위에 작성해둔 재발급 부분의 코드를 확인해서 실행하면 된다.
코드를 실행하면 아래와 같이 표시되고, 기존 작성해두었던 토큰을 저장한 파일에 값이 자동으로 저장된다.
Revoke 코드를 실행하여 Access Token 삭제하기
해당 코드도 위에 작성해둔 삭제 부분의 코드를 확인해서 실행한다.
코드를 실행하면 아래와 같이 표시되고, 기존 발급받았던 토큰은 폐기 처리되어 사용할 수 없다.
revoke를 한번 더 실행하는 경우에도 기존 발급받았던 토큰이 삭제되었기 때문에 Access Token을 재발급 받아 사용해야 한다.
참조:
https://chzzk.notion.site/Chzzk-Devolopers-6044c5dff91049be9464879b27fda1e5