OP.GG 클론하기 - 롤 전적 검색 사이트 만들기 4

2020. 9. 15. 23:44클론을 해보자

저번글까지 구현 한 기능은 다음과 같습니다.

 

  • 소환사의 현재 티어를 보여 줌
  • 소환사의 최근 10게임 승률을 보여 줌.
  • 소환사가 현재 게임을 진행 중인지 알려 줌.

이번 글에서는 아래 두가지인 최근 10게임 승률을 계산하는 코드와 현재 게임을 진행 중인지 확인하는 코드를 만들어보도록 하겠습니다. 

최근 10게임 승률을 보여주는 코드를 먼저 만들어보도록 하겠습니다.

 

사용할 api는 Match 부분의 /lol/match/v4/matchlists/by-account/{encryptedAccountId} 입니다. 현재 티어를 보여주는 api의 경우 encryptedId였는데 이 친구는 encryptedAccountId를 사용합니다. 왜 다르게 만들어 놨는지는 알 수 없으나 우리는 api가 시키는대로 해야합니다. encryptid 부분 아래를 다음과 같이 수정합니다.

return data["id"] #수정 전
return data["id"], data["accountId"] #수정 후

이제 encryptedAccountId를 이용하여 api를 돌려보겠습니다.

{
    "matches": [
        {
            "platformId": "KR",
            "gameId": 4633399616,
            "champion": 84,
            "queue": 420,
            "season": 13,
            "timestamp": 1599587842857,
            "role": "SOLO",
            "lane": "MID"
        },
        {
            "platformId": "KR",
            "gameId": 4631234474,
            "champion": 39,
            "queue": 420,
            "season": 13,
            "timestamp": 1599498795621,
            "role": "DUO",
            "lane": "TOP"
        },
        ...
        ]
 }

다음과 같이 최근 게임의 gameId와 role(솔로로 랭크돌렸는지, 듀오로 돌렸는지), lane(어디 라인에 섰는지) 등등이 나오는데, 우리가 필요한 승 패가 아쉽게도 나오지 않습니다. 승패를 확인하기 위해서는 matchId를 이용하는 api인 /lol/match/v4/matches/{matchId}를 이용하여야 합니다. 테스트를 위해 상위에 있는 gameId(matchId) 4633399616을 넣어보도록 하겠습니다.

{
    "gameId": 4633399616,
    "platformId": "KR",
    "gameCreation": 1599587842857,
    "gameDuration": 1803,
    "queueId": 420,
    "mapId": 11,
    "seasonId": 13,
    "gameVersion": "10.18.333.8889",
    "gameMode": "CLASSIC",
    "gameType": "MATCHED_GAME",
    "teams": [
        {
            "teamId": 100,
            "win": "Fail",
            "firstBlood": true,
            "firstTower": true,
            "firstInhibitor": false,
            "firstBaron": false,
            "firstDragon": false,
            "firstRiftHerald": true,
            "towerKills": 4,
            "inhibitorKills": 0,
            "baronKills": 0,
            "dragonKills": 0,
            "vilemawKills": 0,
            "riftHeraldKills": 2,
            "dominionVictoryScore": 0,
            "bans": [
                {
                    "championId": 80,
                    "pickTurn": 1
                },
                {
                    "championId": -1,
                    "pickTurn": 2
                },
                {
                    "championId": 142,
                    "pickTurn": 3
                },
                {
                    "championId": 61,
                    "pickTurn": 4
                },
                {
                    "championId": 38,
                    "pickTurn": 5
                }
            ]
        },
        ...

teamId가 100인 경우 블루팀, teamId가 200인 경우 레드팀입니다. 굉장히 많은 정보를 알려줍니다.

시간별 cs 시간별 골드 획득량 firstblood firsttower 등등 이용해볼 정보가 굉장히 많습니다. 하지만 이번 프로젝트에서 사용할 기능에는 포함되어있지 않기 때문에 우리는 게임을 이겼는지 졌는지 파악해야 합니다.

teamId가 100인 팀이 win이 Fail이기 때문에 졌다는 것을 알 수 있습니다.

teamId 100 의 참가자는 1, 2, 3, 4, 5이고 teamId 200의 참가자는 6, 7, 8, 9, 10입니다.

"participantIdentities": [
        {
            "participantId": 1,
            "player": {
                "platformId": "KR",
                "accountId": "RzezyUWoBpAkRF6wDOqf0XFR0RDLzb5-AT-i6AB6ycgUabE",
                "summonerName": "꼬요한게임",
                "summonerId": "OwsfVJLjswv9iWtrbe5YSS3Hypimye8QB2GdvN0d8uiDfBw",
                "currentPlatformId": "KR",
                "currentAccountId": "RzezyUWoBpAkRF6wDOqf0XFR0RDLzb5-AT-i6AB6ycgUabE",
                "matchHistoryUri": "/v1/stats/player_history/KR/201507337",
                "profileIcon": 1439
            }
        },
        {
            "participantId": 2,
            "player": {
                "platformId": "KR",
                "accountId": "XeawBp0lWr13BLCl1yxeTtmlQ3DoQGloAvz9dulnNAhgGu9Dh6Pd7wfL",
                "summonerName": "iwtcp",
                "summonerId": "8AsKKFWuwTmQ_aRkSdbwpvG8CaLAAKCsAwk-TccXE0emnVc",
                "currentPlatformId": "KR",
                "currentAccountId": "XeawBp0lWr13BLCl1yxeTtmlQ3DoQGloAvz9dulnNAhgGu9Dh6Pd7wfL",
                "matchHistoryUri": "/v1/stats/player_history/KR/2252393818639904",
                "profileIcon": 4498
            }
        },
       	]

 또한 다음과같이 participantId가 i인 소환사의 이름을 알 수 있습니다. 우리는 accountId를 이용하기 때문에 accountId로 비교해서 우리가 검색한 소환사가 team100인지 200인지 파악하면 될 것 같습니다.

1. team100이 이겼는지 200이 이겼는지 체크

2. 우리가 검색한 소환사의 아이디를 체크

3. 이 아이디가 team100에 있는지 200에 있는지 체크

4. 이 아이디가 졌는지 이겼는지 체크

이런 식으로 조건문을 이용해서 코드를 작성하면 될 것 같습니다. 바로 파이썬 코드로 작성해보겠습니다.

 

다음은 가장 최근에 했던 게임의 matchId를 가져오는 코드입니다.

import encryptId
import requests

def getMatchId(DEVELOPMENTAPIKEY,summonerName):
    encryptedId, encryptedAccountId = encryptId.encrypt(DEVELOPMENTAPIKEY,summonerName)
    headers = {
        "Origin": "https://developer.riotgames.com",
        "Accept-Charset": "application/x-www-form-urlencoded; charset=UTF-8",
        "X-Riot-Token": DEVELOPMENTAPIKEY,
        "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36"
        }
    APIURL = "https://kr.api.riotgames.com/lol/match/v4/matchlists/by-account/" + encryptedAccountId
    res = requests.get(APIURL, headers=headers)
    data = res.json()
    return data["matches"][0]["gameId"]

DEVELOPMENTAPIKEY = "RGAPI-eab999c7-926a-45fa-8db3-8716db1c09d2"
summonerName = "HIDE ON BUSH"
print(getMatchId(DEVELOPMENTAPIKEY,summonerName))

 

다음은 matchId를 이용하여 승패를 알려주는 코드입니다. 승인 경우 1 패인 경우 0으로 출력하도록 했습니다.

import matchId
import encryptId
import requests

def WinorLose(DEVELOPMENTAPIKEY,summonerName):
    encryptedId, accountId = encryptId.encrypt(DEVELOPMENTAPIKEY,summonerName)
    gameId = matchId.getMatchId(DEVELOPMENTAPIKEY,summonerName)
    headers = {
        "Origin": "https://developer.riotgames.com",
        "Accept-Charset": "application/x-www-form-urlencoded; charset=UTF-8",
        "X-Riot-Token": DEVELOPMENTAPIKEY,
        "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36"
        }
    APIURL = "https://kr.api.riotgames.com/lol/match/v4/matches/" + str(gameId)
    res = requests.get(APIURL, headers=headers)
    data = res.json()
    participantId = 0
    for i in range(0,10):
        if accountId == data["participantIdentities"][i]["player"]["accountId"]:
            participantId = i
    if(data["teams"][0]["win"]=="Win"):
        if(participantId > 5):
            return 0
        else:
            return 1
    else:
        if(participantId > 5):
            return 1
        else:
            return 0

DEVELOPMENTAPIKEY = "RGAPI-eab999c7-926a-45fa-8db3-8716db1c09d2"
summonerName = "HIDE ON BUSH"
print(WinorLose(DEVELOPMENTAPIKEY,summonerName))

이 코드들을 수정해서 최근 10게임 승률을 알려주는 코드로 바꿔보도록 하겠습니다.

import encryptId
import requests
import winorlose

def getMatchId(DEVELOPMENTAPIKEY,summonerName):
    encryptedId, encryptedAccountId = encryptId.encrypt(DEVELOPMENTAPIKEY,summonerName)
    headers = {
        "Origin": "https://developer.riotgames.com",
        "Accept-Charset": "application/x-www-form-urlencoded; charset=UTF-8",
        "X-Riot-Token": DEVELOPMENTAPIKEY,
        "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36"
        }
    APIURL = "https://kr.api.riotgames.com/lol/match/v4/matchlists/by-account/" + encryptedAccountId
    res = requests.get(APIURL, headers=headers)
    data = res.json()
    hap = 0
    for i in range(0,10):
        hap = hap + 10 * winorlose.WinorLose(DEVELOPMENTAPIKEY,summonerName,data["matches"][i]["gameId"])
    return str(hap) + "%"

DEVELOPMENTAPIKEY = "RGAPI-eab999c7-926a-45fa-8db3-8716db1c09d2"
summonerName = "HIDE ON BUSH"
print(getMatchId(DEVELOPMENTAPIKEY,summonerName))

다음은 승률을 알려주는 코드입니다. winorLose코드에서 gameId를 matchid.py에서 가져오는 것이 아닌 이 코드에서 매개변수로 보내주는 방식으로 변경했습니다.

 

이렇게 두번째 기능인 소환사의 최근 10게임 승률을 보여주는 코드까지 완성했습니다.

 

  • 소환사의 현재 티어를 보여 줌
  • 소환사의 최근 10게임 승률을 보여 줌.
  • 소환사가 현재 게임을 진행 중인지 알려 줌.

 

이번글 목표는 세 개다 완성하는 것이었는데 마지막 부분은 다음글에서 계속해서 진행하도록 하겠습니다.

python 코드는 다음 글에서 한번에 올려드리겠습니다.