ietty TECH blog

ポケモンGOで会社の近くに出現したポケモンをSlack通知させた話

f:id:mikeda3:20160730152015j:plain ietty社内でも人気のポケモンGOですが、会社の近くにレアポケモンが出現していないかポケビジョンばかり見て仕事にならなくなってしまったので、レアポケモンが出現した時にSlackにメンション付きで通知するようにしました。

とりあえず準備

Slack BOTはHubotで開発し、サーバには無料で使えるHerokuを使います。

HubotはNode.jsで開発ができるので、ポケモンGOのAPI取得部分はjavascriptでポケモンGOのAPIを扱えるPokemon-GO-node-apiを使います。 github.com ※npmに公開されているのでnpm install pokemon-go-node-apiで簡単にインストールできます。

ソースコード

module.exports = (robot) ->
  PokemonGO = require('pokemon-go-node-api')

  # JSON(pokemon-go-node-apiの中にあるpokemon.jsonを日本語化したもの
  pokemonJson = require('./pokemon.json')

  # 通知先チャンネル
  @pokemonUser = room: '#hogehoge'

  # ポケモン捜索先の位置情報
  location = {
    type: 'coords',
    coords: {
      latitude: 35.64780246266644,
      longitude: 139.7102701663971,
      altitude: 10
    }
  }

  # 認証用情報(登録時のgmailのアカウントを入れてください)
  username = 'hogehoge@gmail.com'
  password = '12345678'
  provider = 'google'

  # レアポケモンが出た時に飛ばすメンション
  @pokemonMention = '@hogehoge'

  # 重複して出さないように配列でチェック
  duplicateChackArray = [];

  # APIにリコネクトがないので接続切れを起こさないように10秒に1回ログインして情報を収集する
  setInterval(() =>
    io = new PokemonGO.Pokeio()
    io.init(username, password, location, provider, (err) =>
      if err
        console.log(err)
      console.log('1[i] Current location: ' + io.playerInfo.locationName)
      console.log('1[i] lat/long/alt: : ' + io.playerInfo.latitude + ' ' + io.playerInfo.longitude + ' ' + io.playerInfo.altitude)

      io.GetProfile((err, profile) =>
        if err
          console.log(err)
        console.log('1[i] Username: ' + profile.username)
        io.Heartbeat((err, hb) =>
          if (err)
            console.log(err)
          for val in hb.cells
            if val.NearbyPokemon
              for item in val.NearbyPokemon
                pokemon = pokemonJson.pokemon[parseInt(item.PokedexNumber)-1]
                if duplicateChackArray.indexOf(item.EncounterId.toString()) == -1
                  duplicateChackArray.push(item.EncounterId.toString())
                  # ポケモンのレアリティによってメンションを飛ばすか判定
                  if pokemon.egg == '10 km' || pokemon.egg == 'Not in Eggs'
                    mention = @pokemonMention
                  else
                    mention = ''

                  robot.send @pokemonUser,
                    mention + '\n' + pokemon.name + '(' + pokemon.egg + ') を ' + item.DistanceMeters.toString() + ' メートル圏内に発見!\n' + pokemon.img
        )
      )
    )
  , 10000)

できたもの

f:id:tioken12:20160729201423p:plain

ポケモンの名前の横に出ている◯kmはどの卵から出るポケモンかを表示しています。 その数値からレアリティを判定して、10kmの卵のポケモンと卵から出ないポケモンだけ自分にメンションを飛ばすようにしました。

メンションが飛んできたらポケビジョンで位置を確認してダッシュで捕まえに行きましょう!