Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
59
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

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

昨日の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を公開している人がいたのでありがたく使わせてもらいます。

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

補足

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

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

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

まとめ

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
59
Help us understand the problem. What are the problem?