【FileMaker】Pokemonの統計情報をゲットだぜ

なんてことはない、[curl](https://curl.se/)でPokemonゲット、という話です。

# なんでFileMakerでPokemonゲットしたくなったか
[Rakuten Rapid API](https://api.rakuten.net)をさまよってたら、偶然[Pokemon GoのAPI](https://api.rakuten.net/Chewett/api/pokemon-go1)にたどり着き、コードスニペットとかみたら単純だし、やってみようかな、と思った次第です。

したら、簡単すぎておったまげ。
（「おったまげ」って、商標登録されてましたっけ？してたら修正しないと）

あと、ポケモン好きな息子に褒めてもらえるかな、と思ったりして。

# FileMakerバージョン
今回は、curlとJSONを使っていますので、FileMaker 16以上で実装できます。

# Rakuten Rapid APIの準備
まずは、アカウントを作ってログインしておけば、大抵のことはできます。
無料・有料にかかわらず、便利なAPIが山のように埋まっているので、溺れないように注意です。
あとは、"pokemon"と検索窓で検索すれば、Pokemon Go APIページに辿り着けます。
というか、この記事を書いている現在、１個しかヒットしません。
貴重です。

しかも、無料です。
ステキです。

## アカウントを取得する
Rakuten Rapid APIにアカウントを作ると、自分のAPIキーが割り振られます。

どこぞのAPIのように、「APIキーなくしたらあかんから、どっかにメモっといて」というのもありません。
自分の使いたいAPIのページに行くと、すでに自分のAPIキーが表示され、テスト実行がすぐにできます。
その他、開発者ボードページで、アカウント情報の確認やAPIキーの管理ができます。

「なくしたらあかんから、、、」は不要と言いながら、スクリプトから実行するときはAPIキーは必要なので、複数のAPIを使用する場合は、グローバールフィールドなどに保存しておいた方が使い勝手がいいです。

## どのPokemon情報を取得するか
今回は、Pokemon Stats（統計情報）を取得します。
単に、エンドポイントページの最初にあったから、、、

残念ながらPokemonの画像はゲットできませんので、どこかしらAPIを提供しているところがあると嬉しいです。

# FileMakerの実装
## テーブル設計
まずは、Pokemon Go APIに接続してゲットした際のフィールドを持っておきます。
フィールドにせず、変数でも問題ないので、変数で事足りる場合は、フィールドを作らなくても問題ないです。
あとは、ポケモンの統計情報を保存するテーブルを作ります。
一つのポケモンに対して、formがいくつかあるので、formに関しては子テーブルとして設計します。
![スクリーンショット 2020-12-02 18.25.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/89203f81-daa9-f334-8e5b-8738f305667a.png)
それぞれのフィールド設計は、以下のような感じです。

### テーブル：PokemonJson
（なくてもいい）
![スクリーンショット 2020-12-02 18.25.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/1c69172f-8970-9b96-d84c-dd1340963c82.png)

### テーブル：Pokemon
![スクリーンショット 2020-12-02 18.25.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/6933c5cf-b963-1309-5c99-0b368ba2b1e1.png)

### テーブル：Pokemons
![スクリーンショット 2020-12-02 18.25.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/b68ea326-1e7a-bcbf-7d27-5e97cc6c2e59.png)

## レイアウト設計
Pokemon Go APIを実行するレイアウト：PokemonJSON
ゲットしたPokemonを表示するレイアウト：Pokemon
wk〜となっているレイアウトは、スクリプトの中からゲットしたPokemonを登録する作業用レイアウトで、フィールドを一切配置していません。
件数が多いので、レイアウトにフィールドなどがあった場合、表示処理時間がめっちゃかかってしまうための対策です。
![スクリーンショット 2020-12-02 18.26.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/e06146d0-1e5f-6a4b-2f41-0dd1f0600db7.png)

### レイアウト：PokemonJSON
スクリプトを実行するボタンを配置しています。
単にテストをするだけなら、このレイアウトも要りません。
![スクリーンショット 2020-12-02 18.26.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/5994c3b5-66b9-3058-075c-83ca8365b338.png)

### テーブル：Pokemon
ゲットしたPokemonを表示します。
今回は１画面で複数のformも表示できるようにしています。
![スクリーンショット 2020-12-02 18.26.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/0955bb62-8e8e-cbfa-f693-b5a8fe1004be.png)

## スクリプト
一つのスクリプトにまとめてもいいのですが、別の使い回しとかあるかな、と思って以下のように分けています。
ボタン貼り付け用：mainPokemon
Pokemon統計情報ゲット：getPokemonStats
ゲットした情報を保存：setPokemon

### スクリプト：mainPokemon
処理の最後に、作業用レイアウトからPokemonレイアウトに移動しておきます。
![スクリーンショット 2020-12-02 18.27.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/8c566510-1c44-34fb-d891-15d15f91baba.png)

### スクリプト：getPokemonStats
APIのエンドポイントに接続します。
エンドポイント：https://pokemon-go1.p.rapidapi.com/pokemon_stats.json
![スクリーンショット 2020-12-02 18.27.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/2c0a3c34-02ce-18c2-f579-517e7bb38ea4.png)

curlオプションのヘッダーは、スニペットにあるものをcurl用に編集して使います。
```" -H \"x-rapidapi-host : pokemon-go1.p.rapidapi.com\"" & 
" -H \"x-rapidapi-key : <APIキー>\""
```

![スクリーンショット 2020-12-02 18.51.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/b5d4f894-61b2-ead6-55f5-f298f17672e5.png)

### スクリプト：setPokemon
お決まりのように、取得したJSONをグルグルLOOPで回してセットします。
配列構造もネストが無く単純なので、とても扱いやすいです。
ただ、件数はJSONで返されないので、ListKeyで判断します。
![スクリーンショット 2020-12-02 19.00.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/32d3a550-185c-14db-df8f-a9fe15e4ac0d.png)

# シンプル。。。
Simple is best.を地で行くようなAPIで、なんていい子なんでしょう。
ただ、全て英語で返されるので、ポケモン名はどこかで日本語を提供しているところにAPIで繋がれれば日本人としてはベストですかね。
英語でも問題ないけど。

Pokemon Go APIには、統計情報の他にも様々なPokemon Go情報を辞書的に取得できるので、自分専用のPokemon Go辞典を作成するのもいいかと思います。