前言
最近在逛统计之都时看到一个很有意思的帖子,https://cosx.org/2017/05/rdota2-seattle-prediction/, 作者用了一个叫做RDota2 的 R package来抓取Dota2的比赛数据。我想既然Dota2有相关api,英雄联盟肯定也有吧,不然网上那么多查询召唤师信息的网站是用哪得数据,于是就搜索了一番。
https://developer.riotgames.com/ 这个网站有关于LOL API的全部信息。在读过它的documentation和在R里尝试抓一些数据后,两个想法出现在脑海里。第一个是想分析自己的排位赛数据,包括胜率,最常使用英雄,平均击杀数等。第二是想写一个LOL API client 的package。不确定是否都能完成,尤其是第二项。
这篇文章主要目的是想熟悉LOL API的使用,以及了解它具体能返回什么哪些数据,算是为后面的分析以及写package做准备。
注: League of Legends(下面简称为LOL), 中文翻译英雄联盟。LOL是美国Riot Games开发的一款MOBA游戏,上线以来十分受欢迎,2016年9月Riot估计全世界每个月有超过1亿名活跃玩家(维基百科)
注册API
要使用API必须先注册个英雄联盟账号,还是可以在这个链接https://developer.riotgames.com/ 注册。
注册了之后在Getting Started里我们可以看到这么一行代码,
curl --request GET 'https://na1.api.riotgames.com/lol/summoner/v3/summoners/by-name/RiotSchmick?api_key=' --include
<key>就是我们登录后自动生成的那串英文字母,每个key可以使用24小时。我们看看它会返回什么结果。
下面这串数据是上图的最后一行,也是真正有用的信息。
{"id":585897,
"accountId":31649572,
"name":"RiotSchmick",
"profileIconId":746,
"revisionDate":1529046826000,
"summonerLevel":91}
它的解释可以在https://developer.riotgames.com/api-methods/#summoner-v3/GET_getBySummonerName 找到,如下图。
我们很容易能看出来这都是关于召唤师账户信息的数据。
LOL的API还提供了许多其它数据可以让我们抓取
我们来看几个。
1. CHAMPION-MASTERY-V3
1.1 Get all champion mastery entries sorted by number of champion points descending
/lol/champion-mastery/v3/champion-masteries/by-summoner/{summonerId}
Input: summonerId
就是上边的id,
返回的是你所有的英雄的熟练度,英雄等级等信息。
以下为我输入我的id之后返回的结果的一部分。这是我最熟练的一个英雄,英雄id是126,它并不是通过开箱子得到,英雄熟练度是187494分,还有一些其它信息。
"championLevel": 7,
"chestGranted": false,
"championPoints": 187494,
"championPointsSinceLastLevel": 165894,
"playerId": 39938327,
"championPointsUntilNextLevel": 0,
"tokensEarned": 0,
"championId": 126,
"lastPlayTime": 1515867985000
1.2 Get a champion mastery by player ID and champion ID
/lol/champion-mastery/v3/champion-masteries/by-summoner/{summonerId}/by-champion/{championId}
Input: summonerId
, championId
上边是返回你所有的英雄的熟练度信息,这个是返回某个特定英雄。
1.3 Get a player’s total champion mastery score, which is the sum of individual champion mastery levels.
/lol/champion-mastery/v3/scores/by-summoner/{summonerId}
这个请求返回的是你所有英雄熟练等级之和,如果你有120个英雄,每个英雄熟练度都是7级,那么返回的就是840。
2.CHAMPION-V3
2.1 Retrieve all champions
/lol/platform/v3/champions
这request不需要输入任何东西
rankedPlayEnabled: 该英雄是否已在排位模式上线
botEnabled: 该英雄是否在自定义模式作为AI上线
botMmEnabled: 该英雄是否在人机模式作为AI上线
active: 该英雄是否已被激活
freeToPlay: 是否为该周周免英雄
"rankedPlayEnabled": true,
"botEnabled": false,
"botMmEnabled": false,
"active": true,
"freeToPlay": false,
"id": 266
2.2 Retrieve champion by ID
返回特定英雄
/lol/platform/v3/champions/{id}
3. LEAGUE-V3
3.1 Get the challenger league for given queue
返回最强王者段位所有召唤师信息
Input: RANKED_SOLO_5x5/RANKED_FLEX_SR/RANKED_FLEX_TT
野龟哥的信息
"tier": "CHALLENGER",
"queue": "RANKED_SOLO_5x5",
"leagueId": "930faadc-f191-3fc0-b715-79804ef73cfc",
"name": "Taric's Shadehunters",
"entries": [
{
"hotStreak": true,
"wins": 172,
"veteran": false,
"losses": 129,
"rank": "I",
"playerOrTeamName": "sks Tmfprl",
"inactive": false,
"playerOrTeamId": "83339118",
"freshBlood": false,
"leaguePoints": 568
},
3.2 Get league with given ID, including inactive entries
每个英雄联盟玩家都会被分到一个分区里,每个分区都会有个独特的id,比如上面的930faadc-f191-3fc0-b715-79804ef73cfc>
, 通过这个id可以找到每个分区里所有的玩家信息。这个id需要通过特殊方法来找到,并没有可以直接返回的request命令。
3.3 Get the master league for given queue
返回超凡大师段位所有玩家信息
/lol/league/v3/masterleagues/by-queue/{queue}
3.4 Get league positions in all queues for a given summoner ID
寻找某个特定玩家的信息, 我是青铜王者3 0点。
Input: summonerId
[
{
"queueType": "RANKED_SOLO_5x5",
"hotStreak": false,
"wins": 12,
"veteran": false,
"losses": 19,
"playerOrTeamId": "39938327",
"leagueName": "Kennen's Outriders",
"playerOrTeamName": "spsufawi",
"inactive": false,
"rank": "III",
"freshBlood": false,
"leagueId": "dd4d6980-fc0a-11e7-b72a-c81f66dbb56c",
"tier": "BRONZE",
"leaguePoints": 0
}
]
4. LOL-STATIC-DATA-V3
这一项返回的是游戏里的各种数据,比如符文,天赋,物品,英雄,具体的可以在
https://developer.riotgames.com/api-methods/#lol-static-data-v3 查询,在这里我列出前几项
4.1 Retrieves champion list
返回所有英雄信息,包括英雄名字,后边我们肯定会需要用id来找英雄名字。
62号是猴子。
"MonkeyKing": {
"title": "the Monkey King",
"id": 62,
"key": "MonkeyKing",
"name": "Wukong"
},
4.2 Retrieves champion by ID
/lol/static-data/v3/champions/{id}
返回特定英雄信息
4.3 Retrieves item list
/lol/static-data/v3/items
返回所有物品信息
"1001": {
"plaintext": "Slightly increases Movement Speed",
"description": "<groupLimit>Limited to 1 pair of boots.</groupLimit><br><br><unique>UNIQUE Passive - Enhanced Movement:</unique> +25 Movement Speed",
"id": 1001,
"name": "Boots of Speed"
},
5. LOL-STATUS-V3
5.1 Get League of Legends status for the given shard.
查询各个服务器的状态
/lol/status/v3/shard-data
这里我们需要修改的是前面的地址,如果想查询俄罗斯服务器,那么就把NA1换成ru.
6. MATCH-V3
这是最重要的一部分,比赛信息
6.1 Get match by match ID
/lol/match/v3/matches/{matchId}
每一场游戏都有一个独特的比赛id,通过这个id可以查询那场比赛的信息
5.2 Get matchlist for games played on given account ID and platform ID
/lol/match/v3/matchlists/by-account/{accountId}
我们通过上边的命令来获得所有的比赛id
每次最多可以返回100场比赛的id, 这是其中一场排位赛
{
"lane": "MID",
"gameId": 2689018141,
"champion": 4,
"platformId": "NA1",
"timestamp": 1515364930588,
"queue": 420,
"role": "SOLO",
"season": 10
},
6.3 Get match timeline by match ID
返回比赛信息
/lol/match/v3/timelines/by-match/{matchId}
我用R抓取了其中一部分如下所示, 具体参见https://developer.riotgames.com/api-methods/#match-v3/GET_getMatchTimeline
> games$participants
participantId teamId championId spell1Id spell2Id
1 1 100 245 4 12
2 2 100 32 11 4
3 3 100 126 4 14
4 4 100 117 14 3
5 5 100 21 7 4
6 6 200 12 4 3
7 7 200 86 4 14
8 8 200 77 11 4
highestAchievedSeasonTier stats.participantId
1 BRONZE 1
2 SILVER 2
3 SILVER 3
4 BRONZE 4
5 UNRANKED 5
6 SILVER 6
7 BRONZE 7
8 SILVER 8
stats.win stats.item0 stats.item1 stats.item2
1 TRUE 3152 1056 3020
2 TRUE 1401 2031 3047
3 TRUE 3142 3077 3147
4 TRUE 3117 3504 3069
5 TRUE 1055 3142 2003
6 FALSE 3401 2049 3009
7 FALSE 1054 2031 3142
8 FALSE 1416 2031 3057
7.SUMMONER-V3
如例子所示,返回账号信息,这个应该放在最前边。可以分别通过召唤师名字,accountId和summonerId查询
7.1 Get a summoner by summoner name
{
"profileIconId": 603,
"name": "spsufawi",
"summonerLevel": 63,
"accountId": 203047173,
"id": 39938327,
"revisionDate": 1527548543000
}