프로젝트/Riot LoL

RiotAPI를 사용해서 인게임 정보를 모아보자

SigmoidFunction 2021. 8. 18. 10:22
728x90

지난 포스팅에서 MatchId를 수집하였다. 

이런 식으로 굉장히 많은 게임정보를 불러와버렸다.

 

이 매치아이디를 통해서 인게임정보를 알 수 있다!

 

이렇게 받아온 매치아이디를 match-v5에 넣게되면 인게임 정보가 호출 된다.

 

이전에도 어떤 데이터를 사용할 지에 대해서 작성한 적이 있지만 정보를 호출하면 아래와 같이 길게 나온다.

 

 

해당 게임의 클라이언트 버전, 게임 맵, 10명의 챔피언과 룬,특성, 아이템 등등 정말 많은 데이터가 담겨져 있다.

 

여기서 필요한 것만 뽑아올 것이다.

 

 

'assists', 'championId', 'deaths', 'firstBloodAssist', 'firstBloodKill', 'firstTowerAssist',
'firstTowerKill', 'individualPosition', 'item0', 'item1', 'item2', 'item3', 'item4', 'item5', 'item6',
'kills', 'longestTimeSpentLiving', 'participantId', 'perks', 'summoner2Id', 'summonerName', 'teamId',
'totalDamageDealtToChampions', 'totalDamageTaken', 'totalHeal', 'totalMinionsKilled',
'totalTimeSpentDead', 'visionScore'

 

내가 생각했을 때 인게임에서 중요하다고 생각하는 정보들만 오아놨다. perks는 룬,특성이니 필수!

 

데이터가 정말 복잡한 딕셔너리형태로 구성되어있고 값을 불러오다가 속도제한이나 기타의 이유로 정상적인 호출이 불가하게 될 수도 있다.

 

예를 들면 정상호출이 200인데 403이 뜨는 경우는 에러값이 들어가면 낭패니까

 

200일때만 들어가게 만들어주고 다른 필요한 데이터들을 내가 쓰기 편하게 정돈해주는 작업을 진행하였다.

 

또한, queueID는 420만 들어가게 설정하여 랭크게임만 수집하였다.

 

import pandas as pd
import pprint
import requests
import time
import csv

pp = pprint.PrettyPrinter(indent=4)
api_key = 'API사용'
request_header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 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
}

detail_key = ['assists', 'championId', 'deaths', 'firstBloodAssist', 'firstBloodKill', 'firstTowerAssist',
              'firstTowerKill', 'individualPosition', 'item0', 'item1', 'item2', 'item3', 'item4', 'item5', 'item6',
              'kills', 'longestTimeSpentLiving', 'participantId', 'perks', 'summoner2Id', 'summonerName', 'teamId',
              'totalDamageDealtToChampions', 'totalDamageTaken', 'totalHeal', 'totalMinionsKilled',
              'totalTimeSpentDead', 'visionScore']


def get_data_from_dict(dict_key):


    rst = {}
    for value in dict_key:
        for key in detail_key:
            if value == key:
                if key == 'perks':
                    dict_key[key]['statPerks'] = [dict_key[key]['statPerks']['defense'],
                                                  dict_key[key]['statPerks']['flex'],
                                                  dict_key[key]['statPerks']['offense']]
                    primary = dict_key[key]['styles'][0]
                    sub = dict_key[key]['styles'][1]
                    dict_key[key]['styles_primary'] = [primary['selections'][0]['perk'],
                                                       primary['selections'][1]['perk'],
                                                       primary['selections'][2]['perk'],
                                                       primary['selections'][3]['perk']]
                    dict_key[key]['styles_sub'] = [sub['selections'][0]['perk'], sub['selections'][1]['perk']]
                    del dict_key['perks']['styles']
                rst[value] = dict_key[key]
    return rst


def get_objective_data(ob_data):
    result = {}
    for k in ob_data:
        if ob_data[k]['first'] == True:
            ob_data[k]['first'] = 1
        else:
            ob_data[k]['first'] = 0
        result[k] = [ob_data[k]['first'], ob_data[k]['kills']]
    return result


def main(match_id, header_option):
    url = f"https://asia.api.riotgames.com/lol/match/v5/matches/{match_id}"
    api_status = requests.get(url, headers=request_header).status_code
    if api_status == 200:
        meta_data = requests.get(url, headers=request_header).json()
        if meta_data['info']['queueId'] != 420:
            return False
        else:
            final_result = {}
            final_result['match_id'] = match_id
            final_result['Duration'] = meta_data['info']['gameDuration']
            final_result['Version'] = meta_data['info']['gameVersion']
            participants = meta_data['info']['participants']
            for player in range(len(participants)):
                player_data = get_data_from_dict(participants[player])
                final_result[f'player_{player}'] = player_data
            ban_list_blue_team, ban_list_red_team = [], []
            for blue in meta_data['info']['teams'][0]['bans']:
                ban_list_blue_team.append(blue['championId'])
            for red in meta_data['info']['teams'][1]['bans']:
                ban_list_red_team.append(red['championId'])
            final_result['blue_ban_list'] = ban_list_blue_team
            final_result['red_ban_list'] = ban_list_red_team
            final_result['blue_object_list'] = get_objective_data(meta_data['info']['teams'][0]['objectives'])
            final_result['red_object_list'] = get_objective_data(meta_data['info']['teams'][1]['objectives'])
            if meta_data['info']['teams'][0]['win'] == False:
                win_team = meta_data['info']['teams'][1]['teamId']
            else:
                win_team = meta_data['info']['teams'][0]['teamId']
            final_result['win_team'] = win_team
            df = pd.json_normalize(final_result)
            df.to_csv(f'MatchId_to_ingame.csv', mode='a', index=False, encoding='CP949', header=header_option)
            return final_result
    else:
        return api_status


def main_run(k):
    df = pd.read_csv('D:/MatchId_to_ingame.csv')
    read_data = df['MatchId']
    for i in range(k, len(read_data)):
        cell = i + 2
        try:
            if i == 0:
                header_option = True
            else:
                header_option = False
            rst = main(read_data[i], header_option)
            if rst == 403:
                print("키만료")
                break
            time.sleep(0.9)

        except:
            f = open('error_list.csv', 'a', newline='')
            time.sleep(0.9)
            wr = csv.writer(f)
            wr.writerow([read_data[i]])
            f.close()

        print(f"{cell}번셀 완료, ", f'k={i} 완료, ', read_data[i])
        i += 1
        cell += 1


main_run(0)

내가 돌린 매치아이디만 83만개정도 되니 api키가 만료되었을 경우를 생각해서 쉽게 key만 바꿀수 있도록 작업하였다!

 

 

일주일가량을 컴퓨터를 끄지않고 돌린 결과

 

이렇게 깔끔하게 데이터를 수집할 수 있었다.

 

 

728x90