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

  • 53
    いいね
  • 0
    コメント

昨日のIoTLTで話をしたネタの中に出てきたAPIを使うときに使ったコード紹介です。

スライドはこちらです

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

pokemon-go-node-api

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

pokemon-go-node-api

使ってみる

インストール

npm install pokemon-go-node-api

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

GoogleアカウントでPokemon Goを始めた場合はusernamepasswordにそれぞれ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);

    });
});

実行するとこんな感じ

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

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

補足

まだWIP状態だからサンプルをチェックしろって書いてるけど、サンプルだとpoke.io.jsを読み込んでますね

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

なので現時点ではpoke.io.jsの中から挙動を確認すると良さそうです。

まとめ

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