LoginSignup
41
47

More than 5 years have passed since last update.

PokemonGoのAPIとNode.jsで遊んでみた

Last updated at Posted at 2016-08-19
1 / 12

pokemon_go_logo.png


使用技術

Node.js v6.3.1
Node.jsなに?って人はこちらへ
Node.js を5分で大雑把に理解する
ECMAScript


やったこと

nvmでnode.js導入
以下参考
nvmでnode.jsの環境をつくる。

今回は最新版(v6.3.1)を入れました。
ECMAScriptはバージョンが4以上じゃないと使えないみたい。


PolemonGoAPI導入
インストールしてみる。
npm install pokemon-go-node-api

PokemonGo登録時のGoogleアカウントを設定する。


最初は以下のコードで動かしてみました。

pokemon.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/Minato-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.');

                    }
                }
            });
        }, 5000);

    });
});

何が出来るの?

上のサンプルコードだと以下が出来ます。
 - 公式PokemonGoにログイン
 - ポケモン所持上限値、アイテム所持上限値の表示
 - 現在のポケコイン数、ほしのすなの数の表示
 - 指定した地域(東京都港区)にポケモンがいたらお知らせ
 


ポケモン英語→日本語

ここまでちょっと面白いなと思いつつも、表示されるポケモンの名前が全部英語だから
何か全然わからん。てことで、日本語ないかなと探したらあった。
https://gist.github.com/PonDad/93922f63c3143489e30c3716d3d176d2

あざす。


もう少し遊んでみた。

他の地域でもやりたいなぁ〜
ポケモン捕まえられないかなぁ〜
出来たら出てくるポケモンのCP知りたい
とか思ってAPIの中身見てたらCatchPokemonてある。
以下を参考に早速ポケモン捕まえてみるコード書いてみた。
https://github.com/Armax/Pokemon-GO-node-api


pokemon.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: '東京都港区'
};

let username = 'myadress';
let password = 'password';
let provider = 'google';
let pokeball = {
    monsterball: 1,
    superball: 2,
    hyperball: 3
}

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

    let fs = require("fs");
    let json = JSON.parse(fs.readFileSync('./pokemon.json', 'utf8'));

    console.log('現在位置:' + a.playerInfo.locationName);

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

        console.log('ユーザー名:' + profile.username);
        console.log('ポケモン所持上限:' + profile.poke_storage);
        console.log('アイテム所持上限:' + profile.item_storage);

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

        console.log('ポケコイン:' + poke);
        console.log('ほしのすな:' + 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]) {
                        let pokemon = a.pokemonlist[parseInt(hb.cells[i].NearbyPokemon[0].PokedexNumber)-1];
                        for(var j = 0 ; j<json.length ; j++ ){
                          if(pokemon.name === json[j].en){
                            console.log("やせいの「" + json[j].ja + "」が近くにいる。");
                          }
                        }

                    }
                }

                for (i = hb.cells.length - 1; i >= 0; i--) {
                    for (var j = hb.cells[i].MapPokemon.length - 1; j >= 0; j--)
                    {
                      // use async lib with each or eachSeries should be better :)
                        let currentPokemon = hb.cells[i].MapPokemon[j];
                        (function(currentPokemon) {
                            let pokedexInfo = a.pokemonlist[parseInt(currentPokemon.PokedexTypeId)-1];
                            for(var k = 0 ; k<json.length ; k++) {
                              if(pokedexInfo.name === json[k].en) {
                                pokedexInfo.name = json[k].ja
                              }
                            }

                            a.EncounterPokemon(currentPokemon, function(suc, dat) {
                              console.log('やせいの「' + pokedexInfo.name + "」が飛び出してきた。");
                              if(dat){
                                console.log(dat.WildPokemon.pokemon);
                                a.CatchPokemon(currentPokemon, 1, 1.950, 1, pokeball.superball, function(xsuc, xdat) {
                                  // if(dat.WildPokemon.pokemon.cp < 100){
                                  //   console.log("cpが100未満のポケモンは無視する。");
                                  //   return
                                  // }
                                  console.log("cp:" + dat.WildPokemon.pokemon.cp + "" + pokedexInfo.name + "をつかまえよう!");
                                  console.log('xdat:' + xdat);
                                    let status = ['予期しないエラー', 'やった!つかまえた', 'エスケープ', '逃げられた。', '外した'];
                                    if(xdat) {
                                      console.log("ボールを投げた!");
                                      console.log('xdat.Status:' + status[xdat.Status]);
                                      if(xdat.Status == 1) {
                                        console.log(pokedexInfo.name + "をつかまえた!");
                                      }
                                    }
                                });
                              }
                            });
                        })(currentPokemon);

                    }
                }
            });
        }, 5000);

    });
});

かなり膨大になったけど、これで出てきた野生のポケモンの情報取れるし、色々やったからここでおしまい。

以下大いに参考した記事
http://qiita.com/n0bisuke/items/31daa590056d3d5d8336


遊んだ後

 5秒ごとにスクリプトが実行されていることを忘れてコード修正とかしてたらモンスターボールがめっちゃなくなってた。。。
 ポケモン捕まえようとしてるから経験値めっちゃたまってた。exp:3000→10000くらい。
 遊びで色んなところで遊んでるとBANされるみたいです。。。


追記

場所は日本語でも大丈夫みたいですね。あと海外でもいけちゃいました。
今日はアメリカ/ニューヨーク、オーストラリア/シドニーに行ってみました!
皆さんも色んな所にポケモンゲットしに行ってみてください。
これはけっこう楽しい!
GoogleMapのAPIも使っているので、緯度と経度も取れます!
以下のコードを追加すると緯度と経度と高度が取れるので、
ご自身で確認してみてください。

console.log('lat/long/alt: 緯度: ' + a.playerInfo.latitude + ' 経度:' + a.playerInfo.longitude + ' 高度:' + a.playerInfo.altitude);

アプリでポケモン起動したまま、こっちで同じ地域を指定して実行すると、
アプリ側で出ていた「近くにいるポケモン」がいなくなります。
(api側ではちゃんといます。)
アプリ側でポケモン捕まえる画面を表示させて、api実行すると
逃げられます。
なので、アプリと同じ地域でやると損するのでやめておきましょう〜
(そんな非効率なことやる人いないと思うけど)

41
47
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41
47