본문 바로가기

Coding/Riot API를 사용하여 lolchess.gg 클론 코딩

라이엇 api를 사용하여 TFT(롤토체스) 데이터 수집

1.한국 챌린져 큐의 최근  게임 가져오기

1-1) 한국 TFT 챌린져 명단 가져오기

 

아래 글을 참조하였습니다.

비전공자로, 취미로 하는 코딩이라

부정확하거나 난잡할 수도 있습니다. 피드백은 언제든 환영합니다

 

라이엇 api를 활용한 리그오브레전드 데이터 수집

안녕하세요. 이번 포스팅은 평소에 즐겨하던 "리그오브레전드"의 게임 데이터를 이용하여 분석해보는 시간을 갖도록 하겠습니다. 그전에 리그오브레전드 데이터를 수집해야하는데요, 리그오브

shinminyong.tistory.com

 

-> API란 제가 이해하기론 서버와 소통하는 수단 이었습니다.

requests함수를 사용하여 서버 API에서 데이터를 요구하면 해당 데이터를 얻는다고 이해하였습니다.

 

riot api key를 발급받아 여러 연습을 해보시길 바랍니다.

사이트에서 정보를 얻어오는 순서, 그리고 사용 방법에 익숙해지면 좋습니다

(위에 분 글로 연습해 보시면 됩니다. 페이커 선수의 기록을 가져와 볼 수 있음)

 

 

Riot Developer Portal

About the Riot Games API With this site we hope to provide the League of Legends developer community with access to game data in a secure and reliable way. This is just part of our ongoing effort to respond to players' and developers' requests for data and

developer.riotgames.com

 

그럼 riot API를 사용해서 먼저 게임 데이터를 수집해 보도록 하겠습니다.

 

여기부터는 제 코드 입니다

 

먼저 해당 코드들은 Django 프로젝트 안에서 시행되고 있습니다.

나중에 Django를 사용해서  lolchess.gg를 클론코딩 할 것 입니다. 

 

 

작동은 jupyter notebook에서 확인했습니다 :)

 

일단 기본적으로 필요한 라이브러리와 시간 데이터입니다

import requests
import datetime as dt
import time
import os 
import pandas as pd

api_key = 받은 api key를 넣어주시면 됩니다

x = dt.datetime.now()
now_csv = x.strftime("%Y%m%d")
now = x.strftime("%Y/%m/%d %H:%M:%S")

리퀘스트 함수를 정의해 두었고,

여러 url 에서, 가져 올것이며, 에러가 나면  5초간 기다렸다가 다시 시도하는 함수입니다. 


request_header = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 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,
}

def get_r(url):
    while True:
            try:
                r = requests.get(url, headers=request_header, timeout=3)
                break
            except Exception as e:
                print(e, "5secends sleep")
                time.sleep(5)
                continue
    return r

 

 

다음은

챌린져들의 명단을 가져오는 함수 입니다.

 

챌린져 파일을 df 형태로 return 하는 함수이며,

그리고 csv 파일 형태로  그 날짜의 챌린져 데이터를 data/challenger 폴더에 저장하는 함수입니다.

(해당 폴더가 생성되어야 있어야 오류가 안납니다)

 

->해당 날짜의 challenger 파일이 이미 존재한다면, 불필요하게 request 하지 않고

저장되어 있는 csv를 사용하도록 작성되어있습니다.

 

-> 시즌 초반에는 챌린져가 존재 하지 않습니다.

이경우에는 data/challenger/test.csv 파일을 사용합니다.

test.csv는 전 시즌 챌린저 데이터를 test.csv로 이름을 바꿔 사용했었습니다.

 

403 error : riot API는 24시간 동안만 사용할 수 있어, 이 경우 key를 새로 발급 받으셔야 합니다.

또, riot api에 rate limit 이 있기 때문에 해당 에러 발생시에 기다렸다가 다시 시행되도록 함수가 정의되어 있습니다.

 

 

def league_v1_get_challenger():
    print("start - get challenger data")
    start = time.time()
    url = "https://kr.api.riotgames.com/tft/league/v1/challenger"
    if os.path.isfile(f"data/challenger/{now_csv}_challenger.csv") is False:
        r = get_r(url)
        print(f"status:{r.status_code}")
        if r.status_code == 403:
            print("you need api renewal !")
            exit()
        elif r.status_code == 429 or r.status_code == 502 or r.status_code == 503:
            if r.status_code == 429:
                print("api cost full : infinite loop start")
            elif r.status_code == 502:
                print(" 502 error : infinite loop start")
            elif r.status_code == 503:
                print(" 503 error : infinite loop start")
            start_time = time.time()
            while True:
                if r.status_code == 429 or r.status_code == 502 or r.status_code == 503:
                    print("try 10 seconds wait time")
                    print(r.status_code)
                    time.sleep(10)
                    r = get_r(url)
                elif r.status_code == 200:
                    print("total wait time :", time.time() - start_time)
                    break
        else:
            rjson = r.json()
            df = pd.DataFrame(rjson)
            if df.empty:
                print("No challenger yet")
                challenger_df = pd.read_csv("data/challenger/test.csv", index_col=0)
            else:
                challenger_df = pd.DataFrame(dict(df["entries"]))
                challenger_df = challenger_df.drop(
                    [
                        "wins",
                        "rank",
                        "losses",
                        "veteran",
                        "inactive",
                        "hotStreak",
                        "freshBlood",
                    ]
                ).T
                challenger_df = challenger_df.sort_values(
                    "leaguePoints", ascending=False
                )
                challenger_df = challenger_df.reset_index(drop=True)
                challenger_df.to_csv(f"data/challenger/{now_csv}_challenger.csv")
    else:
        challenger_df = pd.read_csv(
            f"data/challenger/{now_csv}_challenger.csv", index_col=0
        )
        end = time.time()
        print(f"success - c_df1: {end - start:.2f} sec")
    return challenger_df

 

민감한 정보는 아니지만 summoner ID는 지워두겠습니다. 02.06일에 작동 확인하였습니다 :)

 

다음과 같이 data가 보이면 성공입니다!