Riot API키 발급받기
https://developer.riotgames.com/
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키를 발급 받기 위해 라이엇 개발자 홈페이지에서 API 발급
- 라이엇 계정으로 로그인 후 API key 발급 => 메모장에 복사하여 axios 요청시 활용
- 라이엇 API key는 만료시간이 하루로 매우 짧은편, 실제 서비스에서 라이엇 API를 사용하려면 서비스 중인 도메인을 제출하고 API key를 발급 받으면 영구적(?)으로 API key를 사용할 수 있음
소환사 정보 검색
- APIS탭으로 이동
- 소환사의 정보를 검색하려면 SUMMONER-V4 카테고리에서 검색 할 수 있음
- 소환사 정보외에 전적이나 현재 진행중인 게임정보는 SUMMONER-V4 API를 조회 한 후 응답 값으로 반환되는 소환사의 id 값을 활용하여 조회 가능.
- /lol/summoner/v4/summoners/by-name/{summonerName} 탭으로 이동
- PATH PARAMETERS에 VALUE 값으로 검색하려고 하는 소환사 명을 입력
- SELECT APP TO EXECUTE AGAINST에서 처음에 발급 받은 API KEY를 입력
- INCLUDE API KEY에서 Query Param 옵션은 쿼리에 API key를 직접 담아 보내는 옵션으로, 요청 url에 본인이 발급받은 API key가 노출되어 요청됨 => 간단한 요청시에는 괜찮으나 API key가 노출될 위험이 있음
- Header Param 옵션은 쿼리가 아닌 요청 헤더에 API key를 담아 전달하는 방식으로 API key가 노출될 가능성이 적음=> 서비스 계층에서 네트워크 요청시 요청 헤더에 API key를 담아 요청 전송.
- hide on bush를 검색
- REQUEST URL : 요청이 전달된 URL 경로, hide on bush를 검색
- REQUEST HEADERS : 요청시 전달된 헤더의 정보, 요청한 클라이언트의 정보가 담겨 있음
- RESPONSE CODE : 요청 결과의 상태코드를 나타냄 상태코드 200은 요청이 정상적으로 반환됐음을 나타내는 상태코드
- RESPONSE BODY : 실제 반환된 소환사의 정보
- id: 소환사마다 가진 고유한 id
- accountId: 암호화된 계정이 가진 고유한 id
- puuid: 암호화된 puuid
- name : 소환사 이름
- profileIconId: 소환사 아이콘의 고유한 번호
- summonerLever : 소환사의 레벨
- 소환사 계정 정보외에 다른 정보를 확인하려면 puuid를 활용하여 다른 정보들을 조회 할 수 있음
소환사 현재 게임 정보 조회
- 소환사 이름을 조회하여 얻은 "id"의 값으로 현재 게임중인 소환사 조회 가능
- SPECTATROT-V4 탭으로 이동
- 아래 입력창에 소환사의 "id" 값을 입력하고 요청 전송.
응답 정보
- gameId : 현재 진행중인 게임의 고유 id
- mapId : 현재 플레이 하고 있는 map의 고유 id
- gameMode: 현재 진행중인 게임의 모드 종류 EX) CLASSIC : 소환사 협곡 , ARAM : 칼바람 나락
- participants : 현재 게임에 참가중인 소환사들의 정보 모음
- 추가적인 정보 : https://developer.riotgames.com/apis#spectator-v4/GET_getFeaturedGames
- op.gg에 검색해보면 현재 같은 정보를 받아오고 있는것을 알 수 있음
{
"gameId": 6662901881,
"mapId": 11,
"gameMode": "CLASSIC",
"gameType": "MATCHED_GAME",
"gameQueueConfigId": 420,
"participants": [
{
"teamId": 100,
"spell1Id": 4,
"spell2Id": 12,
"championId": 150,
"profileIconId": 3791,
"summonerName": "Akaps",
"bot": false,
"summonerId": "gczUi-Es_oXs567zi4ycOMgvMG5mbHik-GyUod2wQ7BRRw",
"gameCustomizationObjects": [],
"perks": {
"perkIds": [
8021,
9111,
9104,
8014,
8473,
8451,
5005,
5008,
5002
],
"perkStyle": 8000,
"perkSubStyle": 8400
}
},
{
"teamId": 100,
"spell1Id": 7,
"spell2Id": 4,
"championId": 81,
"profileIconId": 3544,
"summonerName": "못생긴년이담배",
"bot": false,
"summonerId": "IGIVHJaSDHdu7dNgHppdw7cDrHg86qgO9lbVBfflXu7M214",
"gameCustomizationObjects": [],
"perks": {
"perkIds": [
8005,
8009,
9103,
8014,
8304,
8345,
5005,
5008,
5002
],
"perkStyle": 8000,
"perkSubStyle": 8300
}
},
{
"teamId": 100,
"spell1Id": 14,
"spell2Id": 4,
"championId": 11,
"profileIconId": 6,
"summonerName": "장워녀엉",
"bot": false,
"summonerId": "iIgOpC-KAFkfqbiAbtyUga579LyaZ3iOQngkGOkBCIou7Tk",
"gameCustomizationObjects": [],
"perks": {
"perkIds": [
8008,
9111,
9105,
8014,
8143,
8106,
5005,
5008,
5003
],
"perkStyle": 8000,
"perkSubStyle": 8100
}
},
{
"teamId": 100,
"spell1Id": 11,
"spell2Id": 4,
"championId": 9,
"profileIconId": 1114,
"summonerName": "휴리스틱정글",
"bot": false,
"summonerId": "NNnw2YAdjpdVQM8nMIOV9_yT_BCFESkogcz444T_gtXM34k",
"gameCustomizationObjects": [],
"perks": {
"perkIds": [
8369,
8306,
8321,
8347,
8143,
8106,
5008,
5008,
5002
],
"perkStyle": 8300,
"perkSubStyle": 8100
}
},
{
"teamId": 100,
"spell1Id": 14,
"spell2Id": 4,
"championId": 111,
"profileIconId": 4022,
"summonerName": "냥이호감도마스터",
"bot": false,
"summonerId": "yD2bXmIYmHPzeDcFoRhKBKIzStMwLpq3lCDQrgf4-1HTMvw",
"gameCustomizationObjects": [],
"perks": {
"perkIds": [
8351,
8306,
8316,
8347,
8275,
8232,
5005,
5002,
5003
],
"perkStyle": 8300,
"perkSubStyle": 8200
}
},
{
"teamId": 200,
"spell1Id": 11,
"spell2Id": 4,
"championId": 200,
"profileIconId": 4060,
"summonerName": "서리라",
"bot": false,
"summonerId": "sDqlVN8yXP6kZMCPmlv2YMc3jvXcNAb8Ig_6yuf7hYkCh9s",
"gameCustomizationObjects": [],
"perks": {
"perkIds": [
8010,
9111,
9105,
8299,
8304,
8347,
5008,
5008,
5002
],
"perkStyle": 8000,
"perkSubStyle": 8300
}
},
{
"teamId": 200,
"spell1Id": 14,
"spell2Id": 4,
"championId": 412,
"profileIconId": 5583,
"summonerName": "아니궁안찍었다고",
"bot": false,
"summonerId": "Sj9ccZtoL3rzNQvZoiWn7vXWwpEV5FQHU13jkOIDp1Rj7w",
"gameCustomizationObjects": [],
"perks": {
"perkIds": [
8439,
8463,
8473,
8242,
8345,
8313,
5008,
5008,
5002
],
"perkStyle": 8400,
"perkSubStyle": 8300
}
},
{
"teamId": 200,
"spell1Id": 1,
"spell2Id": 4,
"championId": 145,
"profileIconId": 907,
"summonerName": "Lilac9",
"bot": false,
"summonerId": "utp4H8elRYrCsszekr6L0NS5cRQ10R_RwfI9Eg2d0NEBZ_kYzdYk1yZnBw",
"gameCustomizationObjects": [],
"perks": {
"perkIds": [
9923,
8139,
8138,
8135,
8304,
8321,
5005,
5008,
5002
],
"perkStyle": 8100,
"perkSubStyle": 8300
}
},
{
"teamId": 200,
"spell1Id": 12,
"spell2Id": 4,
"championId": 777,
"profileIconId": 5917,
"summonerName": "EFRWQDEAAA",
"bot": false,
"summonerId": "JqzHI0a4qQ53EegrKKWcfLutbfdPW3-qXRHeJXMZo_tXvQ",
"gameCustomizationObjects": [],
"perks": {
"perkIds": [
8008,
9111,
9104,
8299,
8473,
8451,
5005,
5008,
5002
],
"perkStyle": 8000,
"perkSubStyle": 8400
}
},
{
"teamId": 200,
"spell1Id": 12,
"spell2Id": 4,
"championId": 101,
"profileIconId": 5921,
"summonerName": "튀 낌",
"bot": false,
"summonerId": "Vhi1JyJMgsb4EUecYLlajgwx_EvdmVLiSG20RQLU76MG27M",
"gameCustomizationObjects": [],
"perks": {
"perkIds": [
8369,
8304,
8345,
8347,
8237,
8226,
5008,
5008,
5003
],
"perkStyle": 8300,
"perkSubStyle": 8200
}
}
],
"observers": {
"encryptionKey": "b+E/juFDayhuqwdeHhnsGPB9c0EvrhT3"
},
"platformId": "KR",
"bannedChampions": [
{
"championId": 58,
"teamId": 100,
"pickTurn": 1
},
{
"championId": 518,
"teamId": 100,
"pickTurn": 2
},
{
"championId": 526,
"teamId": 100,
"pickTurn": 3
},
{
"championId": 268,
"teamId": 100,
"pickTurn": 4
},
{
"championId": 22,
"teamId": 100,
"pickTurn": 5
},
{
"championId": 35,
"teamId": 200,
"pickTurn": 6
},
{
"championId": 91,
"teamId": 200,
"pickTurn": 7
},
{
"championId": 60,
"teamId": 200,
"pickTurn": 8
},
{
"championId": 555,
"teamId": 200,
"pickTurn": 9
},
{
"championId": 126,
"teamId": 200,
"pickTurn": 10
}
],
"gameStartTime": 1692538972813,
"gameLength": -140
}
정적 파일 url
- 소환사 아이콘, 스펠, 챔피언 이미지 등 정적 파일 url은 아래 링크에서 확인 할 수 있음
- https://ddragon.leagueoflegends.com/cdn/10.6.1/img/champion/Shyvana.png
- https://ddragon.leagueoflegends.com/cdn/10.6.1/img/champion/twitch.png
- http://ddragon.leagueoflegends.com/cdn/img/champion/loading/Darius_5.jpg
- http://ddragon.leagueoflegends.com/cdn/img/champion/loading/Sona_1.jpg
공식 문서
https://developer.riotgames.com/docs/lol
Riot Developer Portal
League of Legends Developer API Policy Before you begin, read through the Terms of Use and Legal Notices. Developers must adhere to policy changes as they arise. When developing using the API, you must abide by the following: Products cannot violate any la
developer.riotgames.com
요청
- localhost3000/search?summonerName=소환사이름 경로로 요청 보내기
http://localhost:3000/search?summonerName=소환사이름
컨트롤러
- searchService를 멤버 변수로 선언
- 쿼리로 전달받은 소환사명을 searchService에서 비즈니스 로직을 처리 하기위해 인자로 전달
import { Controller, Get, Query } from '@nestjs/common';
import { SearchSummonerNameDto } from './dto/summoner-name.dto';
import { SearchService } from './search.service';
@Controller('main')
export class SearchController {
constructor(private searchService: SearchService) {}
@Get('search')
async searchSummonerName(@Query() searchSummonerNameDto: SearchSummonerNameDto): Promise<void> {
const summonerName = searchSummonerNameDto.summonerName;
return await this.searchService.searchSummonerName(summonerName);
}
서비스
- axios요청을 위해 HttpService를 멤버변수로 선언
- 전달받은 소환사 이름을 인자로 받아 Riot API에 요청하기 위해 HttpSerivce모듈로 axios 요청 전송
- 이때 헤더에 Riot API 공식 홈페이지에서 발급 받은 API토큰을 실어서 요청
- 반환된 결과를 result 변수에 할당
- 소환사 아이콘을 조회하기 위해 라이엇에서 제공하는 별도의 정적 Url조회
import { Injectable } from '@nestjs/common';
import { HttpService } from '@nestjs/axios';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
@Injectable()
export class SearchService {
constructor(private readonly httpService: HttpService) {}
async searchSummonerName(summonerName: string): Promise<any> {
try {
const response: Observable<any> = this.httpService.get(
`https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/${summonerName}`,
{
headers: {
'X-Riot-Token': '라이엇 API 키 입력',
},
},
);
const result = await response
.pipe(map((response) => response.data))
.toPromise();
// Fetch the profile icon using the profile icon ID from the result
const profileIconId = result.profileIconId;
const profileIconIdUrl = `https://ddragon.leagueoflegends.com/cdn/11.1.1/img/profileicon/${profileIconId}.png`;
result.profileIconIdUrl = profileIconIdUrl;
return result;
} catch (error) {
console.error(error);
throw error;
}
}
}
요청 결과
- 응답으로 반환된 내 계정의 현재 소환사 아이콘이 전달된 것을 확인