Code States

Product Management Research #10 (서비스 확장 / API)

Narks 2023. 5. 22. 17:06

이전 글에서 Naver Webtoon의

데이터를 직접 긁어와 보았다.

단순히 자료를 모으는 것뿐만 아니라

이런 데이터를 분석하여 앱푸시 서비스에

어떤 장르를 넣을 건지 결정할 수 있다고 했다.

 

여러 가지 테스트들을 통해

제품이 성공적으로 시장에 안착했다면

서비스의 확장을 시도할 시기가 다가올 것이다.

 

본격적인 서비스 확장을 얘기하기 전에

잠깐 카카오의 행보를 살펴보자

카카오톡으로 시작한 카카오는

단순한 톡 메신저로만 살아남은 게 아니다.

 

카카오 - 카카오톡

 

2010년 카카오톡 출시 이후 2011년까지

210억 원의 누적적자를 보고 있었는데,

2012년 7월 '카카오 게임하기'라는

소셜네트워킹과 게임의 결합 서비스로

애니팡 등 몇몇 업체와 계약하여

90억의 영업이익을 달성하게 된다.

 

이후 텐센트, 위메이드 등의

투자를 받으며 기사회생하였고,

선물하기, 이모티콘, 프렌즈, 페이지 등

여러 서비스에 브랜드 이미지를 사용하여

빠르게 성장하여 2022년 기준

재계서열 15위에 랭크되었다.

 

톡서비스를 기반으로 여러 가지

서비스/제품으로 확장 후 살아남은

대표적인 케이스라고 할 수 있겠다.

 

그렇다면 웹툰은 어떻게 확장되고 있을까?

단순히 웹툰 App을 Web으로 만들어서

어쩌고 저쩌고 하는 그런 걸 논하지 말자.

카카오톡이 PC용으로 나와서 살아남았는가?

 

기업은 이미 웹툰에서 사용되는 IP를

영화, 드라마, 파생상품 등으로 확장하고 있다.

네이버 웹툰의 PPS라는 것을 살펴보도록 하자.

 

Naver - PPS

 

PPS는 Page Profit Share의 약자이며,

2013년 출시된 창작자 수익 다각화 시스템이다.

웹툰의 IP를 통해 광고, 미리 보기, IP 비즈니스 등

수익을 창출하는 서비스 확장 시스템인데,

2023년 pps의 규모는 2조 255억이다.

 

PPS를 통해 1년간 가장 돈을 많이 번 작가의 수익은

무려 124억 원.

전체 작가 평균 수익은 2억 8천만 원이다.

 

PPS의 성과

 

단순히 앱을 웹으로 만드는 것이 기획이 아니다.

하나의 IP로 파생상품 등을 만들 수도 있으며

무엇을 팔 것인가, 어떻게 팔 것인가를

매 번 고민하고 검증하고 시도하는 것이 필요하다.

 

다시 카카오로 돌아가보자.

카카오톡 서비스는 어떻게 확장이 가능했을까?

IT기업의 특성은 프로그래밍이 원자재라는 것이다.

Lean 하게 일하는 것을 적용하기 쉬운 이유도

원자재의 가공을 코드 몇 줄 바꿔서 가능하기 때문이고,

이 프로그래밍 자체가 다른 기업의

원료가 되는 신기한 일이 발생한다.

 

이것은 바로 API라는 녀석이 있기에 가능하다.

API는 Application Programming Interface의 약자인데

간단하게 설명하자면,

관공서에 서류를 제출하려면 양식을 맞춰야 하듯

뭔가를 받으려면 제출하는 양식이라고 보면 된다.

(모르겠다고? 그냥 그러려니 해도 된다)

 

geeksforgeeks.com - api

 

 

'카카오로 게임하기'는

카카오톡 서비스 내의 사용자들이

자신이 등록한 계정을 이용해

타 게임에 접속할 수 있게 하였고

게임의 결과를 메시지로 공유할 수 있도록 했다.

 

중간과정에서 api로 카카오의 계정을 주고받고

게임 결과를 주고받은 것이다!

 

이런 사례를 통해 api를 사용하면

계정 정보를 공유하는 것만으로도

어떤 프로모션보다 높은 홍보 효과를

가져올 수 있다는 점을 기억해야 한다.

 

api라는 게 그런 거구나~ 하고 넘어가면

알게 된 내용은 쓸모가 없어진다.

이번에는 라이엇 게임즈에서 제공하는

계정 정보를 직접 받아와볼까 한다.

 

계정 정보를 받아와서 

계정 아이디, 아이콘, 레벨 등의 간단한 요소를

html로 표현해 주면 더욱 좋을 것 같다.

 

그러면 일단 Riotgames developer에서

api부터 확인해 보자.

 

Riotgames - Dashboard

 

대시보드에서 api key를 먼저 발급받아야 한다.

기업에서도 아무에게나 정보를 주면

당연히 트래픽에 문제가 생길 것이기에,

검증된 자만 자료를 받아갈 수 있다는 얘기다.

 

이제 계정 정보를 받기 위해

APIS > SUMMONER-V4로 이동하고

계정 검색을 위한 by-name를 클릭한다.

 

Riot api - SUMMONER

 

하단에 있는 VALUE 창에 검색할 이름을 넣고 

EXECUTE REQUEST를 누르면

아래와 같이 정보가 나올 것이다.

 

api by-name

 

api를 통해 요청을 보낼 때 필요한 게

REQUEST HEADERS에 포함되어있다.

내용을 싹 복사한 뒤 파이썬으로 이동하자.

그리고 발급받은 api키도 같이 넣어줄 것이다.

 

Javascript는 따로 다루지 않았으므로

파이썬을 통해 api 요청을 보내 보기로 하고

크롤링할 때 소개했던 requests 라이브러리와

한글을 아스키코드로 변환하기 위해 urllib 라이브러리,

json 파일을 처리하기 위해 json 모듈을 불러와준다.

 

import requests
from urllib import parse
import json

basic_url = 'https://kr.api.riotgames.com/lol/summoner/v4/summoners/'
api_key = '실제 발급받은 키'
request_headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36",
    "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
    "Accept-Charset": "application/x-www-form-urlencoded; charset=UTF-8",
    "Origin": "https://developer.riotgames.com",
    "X-Riot-Token": api_key

 

api 요청을 보낼 준비는 끝났다.

이제 실제 요청을 보내고 필요한 자료를 찾아보자

 

실제 api 요청 주소는 라이엇에서 보여주듯 아래와 같다.

https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/hide%20on%20bush

 

그렇다면 by-name/'원하는 이름'을 붙이면

원하는 아이디를 검색을 할 수 있을 것이다.

def summoner_v4_summoners_name(x):
    encoding_name = parse.quote(x)
    summoner_name_url = basic_url+f"by-name/{encoding_name}"

그리고 요청을 날려서 받은 데이터를

json 파일로 바꿔보자.

def summoner_v4_summoners_name(x):
    encoding_name = parse.quote(x)
    summoner_name_url = basic_url+f"by-name/{encoding_name}"

    #requests.get(summoner_name_url, headers=request_headers).json() 로 쓸수도 있음
    response = requests.get(summoner_name_url, headers=request_headers)
    if response.status_code == 200:
        #print(response.text)
        data = json.loads(response.text)
        #print(data)
        return data
    else :
        print(response.status_code)

 

성공이다!

json은 파이썬의 딕셔너리와 유사하게

key : value의 값을 가지므로

파이썬에서 딕셔너리를 활용하면

값을 어렵지 않게 바꿀 수 있다.

 

이제 우리에게 필요한 내용은 

아이디를 입력하고,

입력한 아이디로 api 요청을 보내서,

아이디의 name과 아이콘

그리고 레벨정보를 가져오면 된다.

 

딕셔너리의 key : value를 활용해서

'name', 'profileiconId', 'SummonerLevel'을

찾아주면 바로 값을 확인할 수 있다.

find_faker = summoner_v4_summoners_name('hide on bush')
summoner_name = find_faker['name']
summoner_level = find_faker['summonerLevel']
icon_number = find_faker['profileIconId']

그리고 html 내에 작성될 아이콘 그림은

라이엇에서 제공하는 이미지 url을 활용할 것이다.

라이엇 개발자 문서에 들어가 보면

DATA DRAGON이라는 라이엇에서 관리하는

이미지 등의 링크를 긁어올 수 있다.

 

DEVELOPER DOCS - DATA DRAGON

 

url  마지막의 소환사 아이콘 숫자만 찾아서 바꿔주자.

summoner_icon = f'http://ddragon.leagueoflegends.com/cdn/13.10.1/img/profileicon/{icon_number}.png'

그리고 html을 text로 작성해 주고

url 링크와 이름, 레벨을 입력해 주면 끝이다.

html_text = f"""
    <!DOCTYPE html>
    <html lang="ko">
        <head>
            <meta charset="utf-8">
            <title>Find Summoner</title>
        </head>
        <body>
            <h1>Find Summoner</h1>
                <img class="icon" src={summoner_icon} style="height:100px;width:100px">
                    <p class="summoners_name">{summoner_name}</p>
                    <p class="summoners_level">Level : {summoner_level}</p>
        </body>
    </html>
"""

fname_2 = "riot_api.html"
with open (fname_2, 'w') as fh_2:
    fh_2.write(html_text)

HTML 완성

 

복잡한 과정을 거치는 것처럼 보이지만

실상은 api 요청을 보내고 데이터를 받아서

필요한 부분만 뽑아다 쓰는 내용일 뿐이다.

 

서비스 확장의 한 방법으로 api를 쓴다는 게 핵심이 되겠다.