League Of LegendsのAPIをJAVAで叩いてみた話

せっかく勉強したので残しておきます。
勉強したてなので間違えや変なところがあったら指摘をお願いします。(特に厳密には違うよってところ)

## 今回覚えたこと

- lolからAPIを読み込む
- JAVAでAPIを読み込む
- JSONデータをJAVAで使う

## 環境

- Eclipse Neon
- Java8 
- lolのapiのバージョン v3
- lolの本体のパッチ 8.6
- JSON In Java 20180130 (借りたライブラリ)

## lolからAPIを読み込む

riot gamesが公開しているデベロッパー向けサイトがあります。一応lolのアカウント(日本版でも可)が必要なので、持っていない場合は取得します。
https://developer.riotgames.com/ (英語サイト)
ここでDEVELOPMENT API KEYを受け取ります。24時間限定で使用できるようです。

OP.GGのようなサービス(http://jp.op.gg/ )で使用したい場合はこのAPI KEYは使えないと思うので多分右上の赤いボタン「Register Project」を押すとなんやかんやでできるようですが、今回は限定のものを使用しました。

API KEYを無事取得したら(コピーしたら)上のタブから「API DOCUMENTATION」の中にある「GETTING STARTED」をクリックするとチュートリアルらしきものが表示されます。今回はこの中のREGISTERING FOR THE RIOT GAMES APIを試しました。
説明によると下のURLの末尾に先ほど取得したAPI KEYを付け加えてブラウザでアクセスするとAPIを受け取れるようです。

https://na1.api.riotgames.com/lol/summoner/v3/summoners/by-name/RiotSchmick?api_key=

RiotSchmickさんのデータが表示されれば成功です。今回はRiotSchmickさんのプレイヤー情報を取得しました。
自分の情報を取得したい場合はurlの「RiotSchmick」の部分を自分のサモナーネームに、サーバーがNA出ない場合は「na1」の部分を自分のサーバーの地域(日本は「jp1」)に変更します。

他のAPIを読み込みたい場合は、デベロッパー向けサイトの「API DCUMENTATION」をクリックして取得したいデータを選びます。

例えばチャンピオンのデータを読み込みたければ、左のタブから「CHAMPION-V3」を選択し、「/lol/platform/v3/champions」をクリック、オプションを選択(任意)して「EXECUTE REQUEST」をクリックするとURLと取得結果が出ます。自分で確認したい場合は、URLをコピーしてブラウザから開けます。このとき普通に開くと認証エラーで拒否されるので最後に「&api_key=<取得したAPI KEY>」を付け足してください。

## JAVAでAPIを読み込む

問題なければJAVAで読み込みます。が、私がJAVAの文字列の扱いがわかっていないので、コードだけ貼っておきます。

``` java:LolApiTest.java
import java.io.*;
import java.net.URL;

public class LolApiTest {
	public static void main(String[] args){
		String region = "na1";
		String apiKey = //ここに取得したAPI KEYを入れておく
		String apiUrl = "https://"+region+".api.riotgames.com/lol/summoner/v3/summoners/by-name/RiotSchmick?api_key="+apiKey;

		try {

			//ここが分かってない
			URL url = new URL(apiUrl);

			String newLine = "";		//新しい行をここに取得しておく
			String currentText = "";	//取得した行を全部ここに付け足していく

			//この2つも分かってない
			InputStreamReader isReader = new InputStreamReader(url.openStream());
			BufferedReader bReader = new BufferedReader(isReader);

			//取得した行がnullになるまで付け足していく
			while((newLine = bReader.readLine()) != null){
				currentText = currentText + newLine;
			}

			//最後に出力する
			System.out.println(currentText);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
```
これでブラウザで読み込んだ時と同じものが出力されれば成功です。

## JSONデータをJAVAで使う

出力された{}や:がたくさんある形式をJSONデータと呼ぶそうです。(詳しい方教えてください)
これを自力で読み込んリストや配列に落とし込むのは骨が折れるので、ライブラリの力を借ります。
今回は下のURLからJSON in Javaを借りました。バージョンは一番新しいのでいいと思います。

https://mvnrepository.com/artifact/org.json/json

ダウンロードしたライブラリを追加する場合は、Eclipseの場合プロジェクトを右クリックして「ビルド・パス」の「外部アーカイブ」の追加を選択し、ダウンロードしたライブラリを選べばできました。
具体的には下のように追記して使用しました。

``` java:LolApiTest.java
			/* 最初省略 */
			import org.json.JSONObject;

			/* 中略 */

			//JSONオブジェクトを作成する。
			JSONObject summonerObject = new JSONObject(currentText);

			//すべて出力する
			for(String key: summonerObject.keySet()){
				System.out.println(key+": "+summonerObject.get(key));
			}

			/* 後ろも省略 */
```

読み込んだJSONデータのうち「accountId」や「profileIconId」など:の左側にあるものをKeyと呼んでいるようです。作成したオブジェクトのKeyはkeySetメソッドで取得できます。Stringの配列が返ってきます。
読み込んだJSONデータのうち、:の右側にあるものはgetメソッドで取得できます。返ってくる型はよくわかっていないですが、指定したい場合はgetStringなどが使えるようです。引数はKeyを入れます。
リストの要素にリストが入っているような入れ子の場合はobject.get(key1).get(key2)……のようにすると取得できるようです。

## 終わりに

「これをやろう！」って思ったときに、ピンポイントでその内容をやっている記事が無く(どれもかすってるくらい)結構苦労したのでまとめました。(流行りのまとめ記事？)
後続の人がめっちゃすごいツールやWebアプリ(語彙力)を作るのに役に立つといいなくらいのアレです。

私はまだ趣味の域を超えない実力しかない(多分？)ので文が読みづらく、内容ももしかしたら厳密ではないです。冒頭にも書いた通りおかしいところがあったら指摘をお願いします。(本当に)

元々プログラミングの課題をtwitterでゆる募してたら、サークルの後輩から「lolのアイテムのコスパ表をAPIを読み込んでくれ」って言われて始めたやつです。一応完成しているので気が向いたらコードを公開するかもしれないです。(特にlolのパッチが更新されても問題なく動くかどうかが問題なので)

最後まで読んでいただきありがとうございました。

### 参考文献

一部情報が古いので注意してください。

- いまさら聞けない！APIとは何か？〜基礎の基礎を学ぼう〜 (https://www.sejuku.net/blog/7087)
- 【Java】JSONデータを標準API、Jackson、JSON in Javaで扱う方法 (https://www.sejuku.net/blog/39599)
- Android JSON パース 入れ子にハマる (http://weblog.4141.biz/?p=406)
- JavaでAPIが叩きたい(http://bigbuddha.hatenablog.jp/entry/JAVA_GET_API)
- Riot Games APIについてちらほら - hogepiyo (http://reginn666.hatenablog.com/entry/2014/05/16/162400)

いずれもアクセス日は2018年3月27日