라이엇 API, 파싱해서 데이터베이스에 저장하기

자훈·2023년 9월 4일
1

개인프로젝트

목록 보기
1/10
post-thumbnail

📌API키

API키를 받는 방법은 간단합니다.
라이엇개발자사이트

개발자 사이트에 들어가서 personal로 받으면 조금이나마 사용할 수 있는 간단한 API를 제공해줍니다. 요청에 대한 데이터 처리는 PRODUCT버젼보다는 확실히 느리기 때문에, 개인적으로 사용하면서 여러가지 방법들을 실험해볼 수 있는 좋은 기회를 제공해준다고 생각하면 될 것 같습니다.

공용으로 사용하지 말라고 하니 주의하시고 사용하세요!!


API를 받았으면 이제 상단 맨 좌측에 있는 APIS에 들어갑니다.


소환사 명을 바탕으로 데이터에 접근하는 코드를 짤 것이기 때문에, 소환사 명(summonerName)으로 정보를 호출하는 페이지를 누르면, 위의 사진처럼 NAME으로 저장되는 데이터 값의 명을 알려줍니다. 딕셔너리 형태로 저장되기 때문에 NAME을 KEY값으로 호출할 수 있습니다.

여기서는 데이터를 입력받은 후, 데이터베이스 테이블에 저장하는 간단한 코드를 만들 것입니다.

📌API 데이터 주소 요청 URL


EXECUTE REQUEST를 눌러 해당 데이터에 접근하는 URL을 받아 소환사명 그리고 API와 결합시킬 것입니다.

📌사고과정

접근방법
:API(Application Programming Interface)를 통해 접근하는 방법은 API로 데이터를 요청하면 Json 형식으로 반환합니다. 반환된 Json데이터에서 파싱하여 필요한 정보를 추출하는 과정을 기본적으로 사용합니다.
requests 라이브러리를 통해 Json데이터에 접근할 것입니다.

원하는 코드의 동작과정
1. 사용자로부터 소환사명을 입력받습니다.
2. SQLite 데이터베이스에 연결하고, 테이블 'summoners'를 생성합니다. 이 테이블은 소환사의 정보와 랭크 정보를 저장합니다.
3. get_summoner_info 함수를 사용하여 라이엇 API를 호출하여 소환사 정보를 가져옵니다. 이 정보에는 소환사의 이름, 레벨, puuid(고유 식별자) 등이 포함됩니다.
4. 가져온 소환사 정보에서 소환사의 puuid를 추출합니다. 후에 고유 puuid를 이용하여 추가적인 static 데이터를 불러올 예정입니다.
5. get_summoner_rank 함수를 사용하여 라이엇 API를 통해 소환사의 랭크 정보를 가져옵니다. 이 정보에는 큐 종류, 티어, 랭크, 리그 포인트, 승리 횟수, 패배 횟수 등이 포함됩니다.
6. 데이터베이스에서 소환사 정보를 검색합니다. 소환사의 ID(puuid)를 기준으로 검색하여 이미 데이터베이스에 해당 소환사 정보가 있는지 확인합니다.
7. 소환사 정보가 데이터베이스에 이미 존재하면 해당 정보를 업데이트하고, 그렇지 않으면 데이터베이스에 새로운 레코드로 저장합니다.
8. 데이터베이스 변경 내용을 커밋하여 영구적으로 저장합니다.
9. 사용자에게 결과를 출력하고, 데이터베이스 연결을 닫습니다.

📌코드

import requests
import sqlite3

# 라이엇 API 키 설정 (개발자 포털에서 발급받은 키를 사용해야 합니다)
api_key = 'RGAPI-ab21e56e-dcc4-4f5a-bdbd-f03ad5ad5c80'

# 소환사명 입력 받기
summoner_name = input("전적을 검색할 소환사 이름을 입력하세요: ")

# SQLite 데이터베이스에 연결
conn = sqlite3.connect("lol.db")
cursor = conn.cursor() #커서 생성 

  • API는 개인이 가지고 있는 API를 적용시켜주면된다.
  • 사용자 입력을 바탕으로 데이터를 저장하고 업데이트 하는 방식으로 하기 위해 사용자 인풋을 가장 먼저 받고 데이터베이스 실행을 위한 커서를 만들어놓는다.
# 'summoners' 테이블 생성 (이미 존재한다면 생성하지 않습니다)
cursor.execute('''
    CREATE TABLE IF NOT EXISTS summoners (
        id TEXT PRIMARY KEY,
        puuid TEXT,
        name TEXT,
        profile_icon_id INTEGER,
        summoner_level INTEGER,
        queue_type TEXT,
        tier TEXT,
        rank TEXT,
        league_points INTEGER,
        wins INTEGER,
        losses INTEGER
    )
''')
  • 테이블이 없어서 생기는 에러를 방지하기 위해, IF문으로 쿼리문 작성
  • 변수의 경우 입력받는 데이터들에 대한 열을 모두 생성해두었다. 해당 데이터들을 저장한 후 나중에 분석하는 모듈을 따로 생성하여, 분석과 저장을 같이 진행할 수 있도록 만들 것이다.
# 라이엇 API를 통해 소환사 정보 가져오기
def get_summoner_info(summoner_name):
    base_url = 'https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/'
    url = f'{base_url}{summoner_name}?api_key={api_key}'
    
    response = requests.get(url)
    
    if response.status_code == 200:
        summoner_info = response.json()
        return summoner_info
    else:
        print('소환사 정보를 가져오는데 실패했습니다.')
        return None
  • 포맷팅을 활용하여 소환사명과 api_key를 기존에 사용하던 URL형식으로 만들어준다. 그리고 reponse를 사용합니다.

  • get 함수는 웹 서버로 HTTP GET 요청을 보내는 역할을 합니다. 이 함수를 사용하면 원격 웹 서버에서 데이터를 가져올 수 있습니다.

  • summonor_info = get함수를 통해 얻은 데이터를 json형식으로 저장해둔다.

# 라이엇 API를 통해 소환사 랭크 정보 가져오기
def get_summoner_rank(summoner_id):
    base_url = f'https://kr.api.riotgames.com/lol/league/v4/entries/by-summoner/{summoner_id}?api_key={api_key}'
    
    response = requests.get(base_url)
    
    if response.status_code == 200:
        summoner_rank = response.json()
        return summoner_rank
    else:
        print('소환사 랭크 정보를 가져오는데 실패했습니다.')
        return None

# 소환사 정보 및 랭크 정보 출력
summoner_info = get_summoner_info(summoner_name) #함수실행
  • 비슷한 원리로 소환사 랭크 정보를 가져오는 함수를 만든다.
if summoner_info:
    print(f'소환사 이름: {summoner_info["name"]}')
    print(f'소환사 레벨: {summoner_info["summonerLevel"]}')
    
    summoner_id = summoner_info['id']
    summoner_puuid = summoner_info['puuid']  # puuid 추출
    
    summoner_rank = get_summoner_rank(summoner_id)
    
    if summoner_rank:
        for entry in summoner_rank:
            queue_type = entry["queueType"]
            tier = entry["tier"]
            rank = entry["rank"]
            league_points = entry["leaguePoints"]
            wins = entry["wins"]
            losses = entry["losses"]
            
            # 데이터베이스에 소환사 정보가 이미 있는지 확인
            cursor.execute('SELECT * FROM summoners WHERE id=?', (summoner_id,))
            existing_data = cursor.fetchone()
            
            if existing_data:
                # 이미 존재하는 경우 정보 업데이트
                cursor.execute('''
                    UPDATE summoners
                    SET queue_type=?, tier=?, rank=?, league_points=?, wins=?, losses=?
                    WHERE id=?
                ''', (queue_type, tier, rank, league_points, wins, losses, summoner_id))
                print(f'{queue_type} 랭크 정보가 업데이트되었습니다.')
            else:
                # 존재하지 않는 경우 정보 저장
                cursor.execute('''
                    INSERT INTO summoners (
                        id, 
                        puuid, 
                        name, 
                        profile_icon_id, 
                        summoner_level,
                        queue_type, 
                        tier, 
                        rank, 
                        league_points, 
                        wins, 
                        losses
                    ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
                ''', (summoner_id, summoner_puuid, summoner_info["name"], summoner_info["profileIconId"], summoner_info["summonerLevel"], queue_type, tier, rank, league_points, wins, losses))
                print(f'{queue_type} 랭크 정보가 저장되었습니다.')
            
            # 데이터베이스 변경 사항을 저장
            conn.commit()
    else:
        print('랭크 정보가 없습니다.')
else:
    print('소환사 정보를 찾을 수 없습니다.')

# 데이터베이스 연결 종료
print("이용해주셔서 감사합니다.")

conn.close()
  • summoner_info를 통해 위의 함수에서 받은 기본적인 정보들을 출력과 동시에 저장한다. puuid는 이후에 쓰일 곳이 많기 때문에 추가적으로 저장해둔다.

  • get_summoner_rank 함수에 get_summoner_info함수를 통해 얻은 id를 입력하게 되면 API를 통해 소환사 랭크 정보를 불러올 수 있다. 그래서 불러온 데이터는 sommoner_rank에 저장한다.

  • 이 안에 저장되어있는 데이터 형식들은 딕셔너리 형식으로 저장되어있기 때문에 각 변수명에 맞는 키 값으로 호출하여 저장한다.

  • 이후 SELECT쿼리문을 통해 해당 ID가 이미 데이터 베이스에 존재한다면, UPDATE쿼리문으로 데이터를 갱신해준다. 존재하지 않는 경우에는 INSERT를 활용하여 저장한다. 이 때 항상 TABLE명을 작성해서 삽입해야 한다는 것을 명심하자.

  • 괄호의 끝 ')'과 '''의 처리를 해당 문의 시작과 끝으로 맞추어주지 않으면 파이썬 문법오류가 발생할 수 있으니 주의하자.

  • 이렇게 하면 API를 넣어 소환사명만 입력하여도 API를 통해 파싱하여 입력받게되는 데이터들은 모두 내가 만들어놓은 "lol.db"의 summoners에 저장되게 된다.

0개의 댓글