๋ฆฌ๊ทธ์ค๋ธ๋ ์ ๋๋ ๊ณ ๋ฑํ๊ต 3ํ๋ ๋ถํฐ ์ง๊ธ๊น์ง ์ฝ 10๋ ๊ฐ ์ ์ ํจ๊ปํ ๊ฒ์์ ๋๋ค. ๋ํ ์ถ๊ฐํฉ๊ฒฉ ์ ํ๋ ์ง์์ ๋กค์ ํ๋ ๋์ค์ ๋ฐ์๊ณ , ์ฒซ ์ง์ฅ ์ทจ์ ์์๋ ๋กค์ ํ๋ ๋์ค ์๊ฒ ๋์์ต๋๋ค. ์ฌ์ค ์ทจ๋ฏธ๋ผ๊ณ ๋ ๊ฒ์๋ฐ์ ์์๊ธฐ ๋๋ฌธ์ ์ข์ ์์๊ณผ ์ซ์ ์์๋ ๋ชจ๋ ๋กค๊ณผ ํจ๊ปํ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋งํผ ๋กค์ ์ ๊ฒ ์์ด ์ ์ฐฉ์ด ๊น์ ๊ฒ์์ ๋๋ค.
๋กค์ ํ๋ ์ฌ๋์ด๋ผ๋ฉด ๋ชจ๋ฅผ ์๊ฐ ์๋ ์ฃผ์๊ฐ ์์ต๋๋ค. ๋ฐ๋ก ์ ์ ๊ฒ์๊ณผ ๊ฒ์ ๊ด๋ จ ์ ๋ณด๋ฅผ ์ ๊ณตํด ์ฃผ๋ op.gg, lol.ps, fow.kr๊ณผ ๊ฐ์ ์น์ฌ์ดํธ์ ๋๋ค. ์ด๋ฌํ ์น์ฌ์ดํธ๋ค์ ๋กค์ ๊ฐ๋ฐ์ฌ์ธ ๋ผ์ด์๊ฒ์์ฆ์์ ์ ๊ณตํ๋ API๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ ์๋ํํฐ ์๋น์ค์ ๋๋ค. API์ ๊ด๋ จ๋ ํฌ์คํ ์ ์ต๊ทผ ๋ค์ด ๋ง์ด ํ๊ณ ์๋ ์์ค์ ๋ฌธ๋ ๋ผ์ด์๊ฒ์์ฆ๊ฐ ์ ๊ณตํ๋ API์ ๊ด์ฌ์ด ์๊ฒผ์ต๋๋ค. ์ด๋ฒ ํฌ์คํ ์์๋ ์ ๊ฐ ๊ฐ์ฅ ์ข์ํ๋ ๊ฒ์์ API๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ค๋ค๋ณด๊ธฐ๋ก ํ์ต๋๋ค.
๋กค API ๋ฐ๊ธ๋ฐฉ๋ฒ
API Key ๋ฐ๊ธ ๋ฐฉ๋ฒ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ๋ผ์ด์๊ฒ์์ฆ์ ๊ฐ๋ฐ์ ํ์ด์ง์ ๊ฐ์ ๋ก๊ทธ์ธ๋ง ํ๋ฉด ๋ฉ๋๋ค. (์ค๋ง ๋กค ๊ณ์ ์ด ์์ ์๋ ๋ถ์ ์๊ฒ ์ฃ ...?) ๋ก๊ทธ์ธ์ ํ๊ณ ๋๋ฉด ์๋์ ๊ฐ์ ํ๋ฉด์ ๋ณด์ค ์ ์์ต๋๋ค:
์๋ reCAPTCHA๋ฅผ ๋๋ฅด๊ณ API Key๋ฅผ ๋ฐ๊ธ๋ฐ์ผ์๋ฉด ๋ฉ๋๋ค. API Key์ ์ ํจ๊ธฐ๊ฐ์ ๋ฐ๊ธ ์์ ์ผ๋ก ๋ถํฐ ๋๋ต 24์๊ฐ์ผ๋ก ๋ณด์ ๋๋ค. ์ ํจ๊ธฐ๊ฐ์ด ์ซ์ผ์๋ค๋ฉด Personal API Key ํน์ Production API Key๋ฅผ ๋ฐ๊ธ๋ฐ์ผ์๋ฉด ๋ฉ๋๋ค. ํ์ง๋ง ์น์ธ ํ๋ก์ธ์ค๊ฐ ์๊ธฐ ๋๋ฌธ์ ํ ์คํธ์ฉ์ผ๋ก๋ ๊ทธ๋ฅ Development API Key๋ฅผ ์ฌ์ฉํ์ ๋ ๋ฌด๋ฐฉํฉ๋๋ค.
์ฑํผ์ธ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
์ฑํผ์ธ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋ณ๋์ API Key๊ฐ ํ์ํ ๊ฒ ๊ฐ์ง ์์ต๋๋ค. ๋กค์์๋ ์ฑํผ์ธ, ์์ดํ , ๋ฃฌ, ์ํ์ฌ ์ฃผ๋ฌธ ๋ฑ์ ์ ๋ณด๋ฅผ ๋คํ ๋ฐ์ดํฐ๋ก ์ ๊ณต์ ํ๋ฉฐ Data Dragon์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
์๋ฅผ ๋ค๋ฉด, ๋ณ๋์ API Key ์ ๋ ฅ ์์ด ์๋์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ์ฑํผ์ธ ์ ๋ณด ์ด๋์ด ๊ฐ๋ฅํฉ๋๋ค:
import pandas as pd
import requests
# ์ฑํผ์ธ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
champions = requests.get('http://ddragon.leagueoflegends.com/cdn/13.1.1/data/ko_KR/champion.json')
# ์ฑํผ์ธ ์ ๋ณด ํ
์ด๋ธ๋ก ๋ณด๊ธฐ
champ_df = pd.DataFrame(champions.json()['data']).T
champ_df.index = champ_df['name']
champ_df = champ_df.drop(columns=['name'])
๊ฒฐ๊ณผ๋ฅผ ์กฐํํ๋ฉด ์ฑํผ์ธ์ ์ด๋ฆ์ด index์ ๋ค์ด๊ฐ๊ณ ๊ณ ์ ๋ฒํธ, ํ์ดํ, ์คํ ๋ฆฌ, ์ญํ ๊ตฐ, ์คํฏ ๋ฑ์ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
์ฑํผ์ธ ๋กํ ์ด์ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
๋กค์ ๊ฒฝ์ฐ์๋ ์ ๊ท ๊ฐ์ ํ ์ ์ ๋ฐ ์ผ๋ฐ ๊ฒ์์ ํํด์ ๋ฌด๋ฃ๋ก ์ ๊ณตํ๋ ์ฑํผ์ธ ๋ฆฌ์คํธ๊ฐ ์์ต๋๋ค. ํด๋น ๋ฆฌ์คํธ๋ฅผ ์ฑํผ์ธ ๋กํ ์ด์ ์ด๋ผ๊ณ ํ๋ฉฐ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ฐ๋๋๋ค. API Key๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ฑํผ์ธ ๋กํ ์ด์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
import requests
API_KEY = '๋ฐ๊ธ๋ฐ์ API Key'
headers = {"Accept-Language": "ko,en-US;q=0.9,en;q=0.8,ko-KR;q=0.7,und;q=0.6,th;q=0.5",
"Accept-Charset": "application/x-www-form-urlencoded; charset=UTF-8",
"Origin": "https://developer.riotgames.com",
"X-Riot-Token": API_KEY
}
response = requests.get('https://kr.api.riotgames.com/lol/platform/v3/champion-rotations', headers=headers )
๋ฌด๋ฃ ๋กํ ์ด์ ์ฑํผ์ธ์ id์ ์ ๊ท ํ๋ ์ด์ด๋ฅผ ์ํ ์ฑํผ์ธ id ๊ทธ๋ฆฌ๊ณ ์ ๊ท ํ๋ ์ด์ด์ ์กฐ๊ฑด์ธ ์ต๋ ๋ ๋ฒจ๊น์ง ํ์ธํ ์ ์์ต๋๋ค. ์์์ ์ ๋ฆฌํ ์ฑํผ์ธ์ key ๊ฐ์ผ๋ก ๋กํ ์ด์ ์ฑํผ์ธ ๋ชฉ๋ก์ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
์๋ fow.kr์์ ์ ๊ณตํ๋ ๋ชฉ๋ก๊ณผ ์ผ์นํ๋ ๊ฒ์ ํ์ธํ์ค ์ ์์ต๋๋ค:
์ํ์ฌ ๊ฒ์ (feat. ํ์ด์ปค ์ ์์ ์ต๊ทผ๊ฒ์ KDA)
๋กค์ ๊ฒฝ์ฐ์๋ ํ๋ ์ด์ด๋ฅผ ์ํ์ฌ (Summoner)์ด๋ผ๊ณ ํฉ๋๋ค. ์ ์ ๋ค์ด ์ฑํผ์ธ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ํํ๋ค๋ผ๊ณ ํํ์ ํ๊ธฐ ๋๋ฌธ์ ์ ์ ์ด๋ฆ์ ์ํ์ฌ ์ด๋ฆ์ ๋๋ค. ์ ์ ๊ฒ์์ ํ ๋๋ ์ํ์ฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒ์์ ํฉ๋๋ค. API๋ฅผ ์ฌ์ฉํด์ ์ํ์ฌ๋ฅผ ๊ฒ์ํ๋ ๋ฐฉ๋ฒ์ ์ธ ๊ฐ์ง ๋จ๊ณ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค:
1. ์ํ์ฌ ์ด๋ฆ์ผ๋ก ์ํธํ๋ puid๋ฅผ ๊ฐ์ ธ์ค๊ธฐ
2. ํด๋น puid๋ก ๊ฐ ๊ฒ์ ํ์ id ๊ฐ์ ธ์ค๊ธฐ
3. ๊ฒ์ ํ์ id๋ก ์ ๋ณด ํ์ธ
๋จ๊ณ๋ณ๋ก ์งํํด ๋ณด๊ฒ ์ต๋๋ค.
import requests
API_KEY = '๋ฐ๊ธ๋ฐ์ API Key'
headers = {"Accept-Language": "ko,en-US;q=0.9,en;q=0.8,ko-KR;q=0.7,und;q=0.6,th;q=0.5",
"Accept-Charset": "application/x-www-form-urlencoded; charset=UTF-8",
"Origin": "https://developer.riotgames.com",
"X-Riot-Token": API_KEY
}
# ๊ฒ์๋์ ์ํ์ฌ ์ด๋ฆ
summoner = 'hide on bush' # SKT T1 ํ์ด์ปค ์ ์์ ์ํ์ฌ๋ช
# ์ํ์ฌ ์ด๋ฆ์ผ๋ก puuid ๊ฐ์ ธ์ค๊ธฐ
response = requests.get(f'https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/{summoner}', headers=headers)
puuid = response.json()['puuid']
# ํด๋น puuid๋ก ์ต๊ทผ 20๊ฒ์์ ๊ฒ์ ํid ๊ฐ์ ธ์ค๊ธฐ
match_ids = requests.get(f'https://asia.api.riotgames.com/lol/match/v5/matches/by-puuid/{puuid}/ids?start=0&count=20', headers=headers).json()
# ์งํํ ๊ฒ์ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
def get_match_data(match_id):
data = requests.get(f'https://asia.api.riotgames.com/lol/match/v5/matches/{match_id}', headers=headers).json()
return data
game_data = [get_match_data(x) for x in match_ids]
ํ์ด์ปค ์ ์์ ์ต๊ทผ ๊ฒ์ 20ํ ์ ์ ์ ๊ฐ์ ธ์์ต๋๋ค. ํด๋น ๋ฐ์ดํฐ๋ ๋ชจ๋ game_data๋ผ๋ ๋ณ์์ ์ ์ฅ๋์ด ์์ต๋๋ค.
๊ฐ ๊ฒ์์ json ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
์ฐพ๊ณ ์ ํ๋ KDA์ ์ ๋ณด๋ 'participants' ํญ๋ชฉ์ ์์์ต๋๋ค. ํ์ index ์์๋๋ก ์์ 5๋ช ์ด ํ ํ, ์๋ 5๋ช ์ด ํ ํ์ผ๋ก ๋์ด ์์ต๋๋ค. ์ญ์ ์ธ๊ณ ์ต๊ณ ์ ํ๋ ์ด์ด๋ ์ฃฝ์ ํ์๊ฐ ๋ค๋ฅธ ํ๋ ์ด์ด๋ค์ ๋นํด์ ํ์ ํ๊ฒ ์ ๋ค์ ใทใท
์์ ๊ฐ์ด ๊ฒ์์ข ๋ฃ ํ ๊ฒฐ๊ณผ ํ๋ฉด์ ์๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ game_data [0]['info']๊ฐ ํฌํจํ๊ณ ์๋ ๋ด์ฉ์ ๋๋ค.
๊ฐ์ KDA ์ ๋ณด์ธ๋ฐ ๋์์ธ์ ๋ฐ๋ผ ๋๋์ด ์์ฃผ ๋ค๋ฅธ ๊ฒ ๊ฐ์ต๋๋ค.
๋กค API๋ฅผ ๋ง์ง๋ค ๋ณด๋ ์ ์ ๋กค์ ํ๋ฌ ๊ฐ๊ณ ์ถ์ด ์ง๋ค์ ใ ใ ... ๋์ถฉ ์ฌ๊ธฐ์ ๋ง๋ฌด๋ฆฌ ์ง๋๋ก ํ๊ฒ ์ต๋๋ค.
๊ด์ฌ์ด ์์ผ์๋ฉด ์ฌ๊ธฐ์ Documentation์ ์ฐธ๊ณ ํด์ ํ์ํ ์ ๋ณด๋ฅผ ๋ ์ฐพ์๋ณด์๊ธธ ๋ฐ๋๋๋ค
๋ง๋ฌด๋ฆฌ
์ค๋์ ๋ฆฌ๊ทธ์ค๋ธ๋ ์ ๋ API๋ฅผ ์ฌ์ฉํด ๋ดค์ต๋๋ค. ๋งจ๋ ํ๋ ๊ฒ์์ ๋ฐ์ดํฐ์ json ๊ตฌ์กฐ๋ฅผ ํ์ธํด ๋ณด๋ ๋๋ฆ ํฅ๋ฏธ๋ก์ ์ต๋๋ค ใ ใ
API๋ฅผ ๋ง์ง๋ฉด์ ์ข ์ข ๋๋ ์๊ฐ์ด ์์ต๋๋ค. "์๋ฌด๋ฆฌ ์ข์ ๋ฐ์ดํฐ๋ผ๋ ํํ์ ์ํด์ผ ์ ๋ฌ๋ ์ ๋๋ค"๋ ๊ฒ์ ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ์ ๊ฐ๊ณตํ๋ ๊ฒ๋ ๋ฌผ๋ก ์ค์ํ์ง๋ง, UX/UI๋ฅผ ํ์ฉํ์ฌ ๊ฐ๋ ์ฑ ์๊ฒ ์ ๋ณด๋ฅผ ์ ๋ฆฌํด์ ์ฌ๋๋ค์๊ฒ ์ ๋ฌํ๋ ๊ฒ๋ ๋ชป์ง์๊ฒ ์ค์ํ ๊ฒ ๊ฐ์ต๋๋ค. UX/UI ํ ๋ฐ ํ๋ฐํธ์๋ ๋ถ๋ค์ ๋๋จํจ์ ์ฒด๊ฐํ๋ ์๊ฐ์ด๊ธฐ๋ ํ์ต๋๋ค.
'๐ป ITยท๊ธฐ์ ยทํต๊ณ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Snippet] ์์ฃผ ์ฌ์ฉํ๋ List, Dictionary ๊ธฐ๋ฅ (0) | 2023.02.09 |
---|---|
[API] ์ธ๊ณ ๊ฐ๊ตญ์ ๊ธฐ๋ณธ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ (restcountries) (2) | 2023.02.06 |
[API] OpenAI API ๊ฐ์ง๊ณ ๋๊ธฐ 2ํ: ๊ฐ์ฒด๋ช ์ธ์ (NER) (0) | 2023.02.04 |
[API] OpenAI API ๊ฐ์ง๊ณ ๋๊ธฐ 1ํ: TL;DR (๊ธด๊ธ ์์ฝ) (0) | 2023.02.03 |
Python์ผ๋ก ์ฃผ์ฌ์ ๊ฒ์ ๋ง๋ค๊ธฐ (0) | 2023.02.03 |
๋๊ธ