PokemonGoで近くにポケモンが出たら〇〇するトリガーをNode.jsで作る


[昨日のIoTLT](http://iotlt.connpass.com/event/35436/)で話をしたネタの中に出てきたAPIを使うときに使ったコード紹介です。

![](https://i.gyazo.com/77bda0816edbc2a01485cb2968245465.png)

[スライドはこちらです](https://speakerdeck.com/n0bisuke/node-dot-jsde-pokemon-go-ohuisuhatuku-number-iotlt)

ちなみにNode.jsのバージョンは6.3.1です。

## pokemon-go-node-api

調べたら色々とあったのでどれを使うかはお任せなのですが、僕が使ったライブラリは`近くでポケモンが出たら何かする`みたいなことがやりやすかったので紹介します。

[pokemon-go-node-api](https://www.npmjs.com/package/pokemon-go-node-api)

### 使ってみる

インストール

```
npm install pokemon-go-node-api
```

ほぼサンプルコードですが以下で動きます。

GoogleアカウントでPokemon Goを始めた場合は`username`と`password`にそれぞれGoogleアカウントのメアドとパスをいれます。

ありがちなのが(というか僕がそうでした)、そもそもPokemon GoのアカウントをGoogleアカウントで使ったのかどうか忘れてることですね苦笑 がんばって思い出してください笑

```app.js
'use strict';

const PokemonGO = require('pokemon-go-node-api');

// using var so you can login with multiple users
let a = new PokemonGO.Pokeio();

//Set environment variables or replace placeholder text
let location = {
    type: 'name',
    name: 'Tokyo/Taito-ku' //東京都台東区
};

let username = '登録したGoogleアカウントのメールアドレス';
let password = '登録したGoogleアカウントのパスワード';
let provider = 'google';

a.init(username, password, location, provider, (err) => {
    if (err) throw err;

    console.log('1[i] Current location: ' + a.playerInfo.locationName);
    console.log('1[i] lat/long/alt: : ' + a.playerInfo.latitude + ' ' + a.playerInfo.longitude + ' ' + a.playerInfo.altitude);

    a.GetProfile((err, profile) => {
        if (err) throw err;

        console.log('1[i] Username: ' + profile.username);
        console.log('1[i] Poke Storage: ' + profile.poke_storage);
        console.log('1[i] Item Storage: ' + profile.item_storage);

        let poke = 0;
        if (profile.currency[0].amount) {
            poke = profile.currency[0].amount;
        }

        console.log('1[i] Pokecoin: ' + poke);
        console.log('1[i] Stardust: ' + profile.currency[1].amount);

        setInterval(() => {
            a.Heartbeat((err,hb)=>{
                if(err) {
                    console.log(err);
                }

                let texts = '';
                for (var i = hb.cells.length - 1; i >= 0; i--) {
                    if(hb.cells[i].NearbyPokemon[0]) {
                        //console.log(a.pokemonlist[0])
                        let pokemon = a.pokemonlist[parseInt(hb.cells[i].NearbyPokemon[0].PokedexNumber)-1];
                        console.log('1[+] There is a ' + pokemon.name + ' near.');
                        //この辺にWebhookとか噛ませればSlack通知とかも余裕ですね。
                    }
                }
            });
        }, 5000);

    });
});

```

実行するとこんな感じ

![](https://i.gyazo.com/725efe504b23120665cbeca87a59b3db.png)

`Pinsir`というのはカイロスのことなんですけど、カイロスが近くに出たことがわかります。

簡単ですね！

### 日本語っぽく

日本語でやりたいですよね。

* 位置情報の指定

```
let location = {
    type: 'name',
    name: 'Tokyo/Taito-ku' //東京都台東区
};
```

の箇所でやってます。`Tokyo/Taito-ku`と書いている部分はGoogleMapのAPIに投げているみたいなのでそれっぽい書き方をすればだいたいうまくいきます。

```
1[i] Current location: 東京都台東区東上野2-17-8 共同ビル3F //dotstudio住所
1[i] lat/long/alt: : 35.70951 139.7767348 0
```

* ポケモンの名前

ポケモンの名前が英語だとよくわからんので日本語化しようとしたら案の定日本語化jsonを公開している人がいたのでありがたく使わせてもらいます。

https://gist.github.com/PonDad/93922f63c3143489e30c3716d3d176d2



こんな感じで結構実用的(?)になりました

![](https://i.gyazo.com/219a9cea735b014fe1b4c60b22cdcb91.gif)


### 補足

まだWIP状態だから[サンプルをチェック](https://github.com/Armax/Pokemon-GO-node-api/blob/master/example.js)しろって書いてるけど、サンプルだと`poke.io.js`を読み込んでますね

```
var PokemonGO = require('./poke.io.js');
```

なので現時点では[poke.io.js](https://github.com/Armax/Pokemon-GO-node-api/blob/master/poke.io.js)の中から挙動を確認すると良さそうです。

##まとめ

このプログラムを拡張していけばSlack通知だったりアプリ通知だったり色々と拡張できますね。
トリガーを作れてあとはアイディア次第なので色々とつなげてみたいと思います。