arrow-righthamburgerlogo-marksocial-facebooksocial-githubsocial-twitter
2016.09.07

Pokemon GOで近くにポケモンが出たらPepperが教えてくれる仕組みをNode.jsだけで作る

のびすけ

Node.js Magazine
   このエントリーをはてなブックマークに追加  

こんにちは、dotstduio代表ののびすけです。

みなさん、Pokemon GOやってますか? 僕はけっこう作業ゲーな気がしていて、最近飽き気味だったんですよね。現在だとLv.18で止まってしまっている中途半端組です。

そんな感じなので、僕は「ポケモンが出てきたら教えてくれる仕組み」があるといいなって思い、PepperとPokemon GOを繋げて 近くにポケモンが出現したら通知する 仕組みを作ってみました。

Slack通知とかはたまに記事で見かけたんですけど、たまたまPepperが部屋にいたので活用することにしました。なかなかPepperが手元にないかと思いますが、試せる人は試してみてください(笑)

全体像と開発手順

やったことは次の3つです。

このときはMac OS 10.11のNode.js6.3.1で試しました。ポイントは Choregraphe(Pepperのアプリ開発者向けアプリ)を使わずに Node.jsだけで完結する ところだと思います。単純に喋らせるだけならChoregraphe使わなくてもなんとかなりますね。

※きちんと開発をするならChoregrapheが必須です。

先日Amazonで開催したIoTの勉強会「IoTLT」で話した内容をまとめました。そのときのスライドも貼っておくので、参考までにご覧ください。完全にLT駆動開発です(笑)

作り方

1. Pokemon G0のAPIをNode.jsで使う

npmでPokemon G0を調べるとちょくちょくモジュールが見つかります。中でもメンテナンスされていそうなnode-pokemon-go-apiを使いました。

まずはポケモンが出たら〇〇するトリガーを作ります。以下のコマンドでインストールしましょう。

npm install pokemon-go-node-api --save

実際に使う部分は、以下の僕のQiitaの記事を参考に進めてください。

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

index.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);

    });
});

これを実行してみると、

一番下に There is a Pinsir near. と表示されているのがわかると思います。 どうやらPinsirが近くにいるようです。

2. (気になる人は)ポケモン名を日本語化する

ここで「Pinsirってなんだ」という話になるんですけど、ググったらカイロスの英語名らしいですね。

GitHubGistのPonDad氏が、ポケモンの英語名と日本語名を変換するデータをJSONとして公開していたので、ありがたく使いましょう。index.jsのここで使ってます。

3. NightmareでPepperを喋らせる

Nightmareはブラウザの自動テストをおこなうツールです。ログイン処理や、ボタンを押した際の挙動などを自動テストする際に使います。PhantomJSが有名ですが、そのラッパーライブラリでかなり使いやすいです。

サンプルなどを見ると、Nightmareを使うときはvoというモジュールを使ってGeneratorで書くのが主流っぽいです。以下のコマンドでインストールしてください。Nightmareはv2からElectronベースになったということもあり、インストールには結構時間がかかります。

npm i nightmare vo --save

以下のQiitaの記事も参考にしてみてください。

Nightmareがv2(Electronベース)になり、使いやすく感動したのでLIGブログのPV/UUデータ取得を自動化してみた。

接続先はkuetsuharaさんペッパーコントローラーブラウザアプリです。このブラウザアプリは同じIP内にあるPCからなら、ブラウザだけでPepperをある程度操作できるかなり便利なものです。

pepper_connect.js

'use strict'

const Nightmare = require('nightmare');
const vo = require('vo');
const IP = '192.168.179.29';

function pepper(text) {
    vo(function* () {
    const nightmare = Nightmare({ show: true });
    const link = yield nightmare
        .goto('http://kuetsuhara.github.io/pepperConnect.html')
        .insert('input#pepperIP','')
        .type('input#pepperIP', ip)
        .click('button[onclick="connect()"]')
        .wait(4000)
        .type('input#sayText', text)
        .click('button[onclick="say()"]')
        .evaluate(() => {
            return document.getElementsByClassName('ac-21th')[0].href;
        });
    yield nightmare.end();
        return link;
    })((err, result) => {
        if (err) return console.log(err);
        console.log(result);
    });   
}

pepper("こんばんわ");

//モジュール化する場合
//module.exports = pepper;

こんな感じで記述しました。192.168.179.29がPepperのIPになります。

ちなみにPepperのIPアドレスは、タブレットの裏側の胸にあるボタンを押すとPepperが喋って教えてくれます。

実行して試してみる

ちなみに、このときはMac OS 10.11上のNode.js6.3系で試しました。

node pepper_connect.js

この時点で実行すると、Nightmare経由でPepperに自動接続して、「こんばんわ」と喋ってくれると思います。

こちらで実際に動いている動画を見られます。

コードのまとめとデモ

こちらに今回使ったコードをまとめておきました。

git clone [email protected]:n0bisuke/pepper_pokemon_go.git
cd pepper_pokemon_go
npm i

のあと、index.jsのユーザー名とパスワードを入力したのち

node index.js

で動作すると思います。動かない場合は@n0bisukeまで!

まとめ

Nightmareを使えば、Node.jsだけでも、ブラウザコントロールが可能なロボットやハードウェアの簡単な接続はできそうだなと感じました。

実際のところ、Pepperと同じネットワークにNode.js(とNightmare)が動く環境が必要なので、運用などは難しそうです。しかし、喋ってくれること自体は通知として気づきやすいので、かなりアリだと思っています。

試せる方はぜひ試してみてください! それでは。

   このエントリーをはてなブックマークに追加