close

最近有一個很火紅的手遊,就是 Pokémon Go,他其實就是仿照 Pokémon 的動畫自做而成的一個手遊。想知道如何做一個查詢隱藏能力的 APP 嗎?請繼續看下去。

大部分遊戲不外乎就是要登入後繼才可以玩,而 Pokemon Go 也不例外,首先就要知道了解登入方式,而 Pokémon Go 只有兩種登入方式。

  1. Google 帳號
  2. PTC 帳號

為何會只採用這兩種帳號,而不採用其他帳號?其實跟公司的股東和創辦人有很大的關係,這層關係,就請大家去 Google 一下,就不再這裡討論了。

要使用 Google 帳號,首先必須先拿到通行碼,之後才去跟 Pokemon Server 換到 token,但是通行碼要怎麼拿?這問題其實很簡單,就是去跟 Google 要啊,不然誰有?那該如何要?只有一種方式可以拿到,就是用網頁去拿。也許大家會說是不是會有其他種方式去取得?其實是有的,但是你可能要拿大筆金錢去要求 Niantic 公司幫幫忙了,要求他們給你一個 key 好讓你去取得權限,不過我相信,你一定沒有這筆費用。

置於要到哪一個網址去拿,在 Google 的設計下,要怎麼取知道是哪一個 APP 要求權限?於是設計了一個公開的 API Key 給客戶使用,Google 只會任這個 API Key,就可以知道是哪一個 APP 在要求權限,當使用者同意給了權限後,就會回應一個認證碼,只要 Server 拿到這個認證碼去跟 Google Server 要資料時,Google Server 就會同意給資料。我們就是利用這種方式,拿到認證碼,之後用這個認證碼給 Pokémon Server 來當做登入資訊,這樣 Pokémon Server 就可已知道是誰上線了。

置於 PTC 帳號呢?這個 PTC 就是 Pokémon Trainer Club 的縮寫,也就是需要去 Pokémon 網站上面註冊的帳號,因此這是屬於 Niantic 公司專屬的帳號,也就不需要第三方認證,因此這部份只需要帳號及密碼就好,不需要到別的網頁去做認證。

Pokémon API 是那麼複雜的 API,我們要如何去了解呢?其實不用啦,很多人都寫好套件了,我們不用去一個個了解,網路上面還有人幫忙整理出一些資料,放在 https://github.com/tobiasbueschel/awesome-pokemon ,在這個網站中,其中有一個第三方 API ,是用 JAVA 寫的,叫做 Pokemon GO JAVA API,看到 JAVA 大家就會很興奮,因為這正好是 Android 可以用的啊,這樣大家就不必辛辛苦苦的去翻譯其他種語言寫的 API 。

分析一下 Pokemon GO JAVA API ,不難發現這套是用 Rx Java 寫的 APP,在仔細分析一下,終於發現 Pokémon GO 是利用了 Protocol buffer 的技術來傳輸 API 資訊,但是這對於我們使用這套 API 都不是很大的影響,因為作者都幫你給編譯好了,我們只負責使用就可以,但是如果你有需要,你也可以自己去做編譯的動作。

以上說了那麼多,都是一些概念的問題,下面就要開始進入本篇的重點。

Android 權限

權限需要哪幾個,其實要看你的需求,不過有一個必須要有,那就是 Internet 權限。(廢話,不然怎麼拿資料?)但是如果之後要去做抓寶的動作,那就必須要輸入 GPS 座標了,但是座標也可以假造,因此要不要使用 GPS 權限,也就是要看 APP 的需求了。

除了以上兩種,其他的權限就和 Pokemon GO API 無關。

 

Gradle dependencies

目前 Pokemon GO API 的版本號碼是 0.4.1 我們只需要在dependencies 加上

compile 'com.pokegoapi:PokeGOAPI-library:0.4.1'

就好,這樣就可以使用 Pokemon GO API 了。

 

Google 登入

Google 登入網址可以由 

GoogleUserCredentialProvider.LOGIN_URL

這裡取得,因此我們必須寫一個 webview 來拿到通行碼:

webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(GoogleUserCredentialProvider.LOGIN_URL);

記得,要把 JavaScipt 的功能給打開,不然會出錯喔,拿到認證碼後,就是進行真正的 Login 動作了 。Pokemon GO API 作者有提到,在做 Login 時不能在 main thread 裡面去做,不然會出錯,因此我們必須要做在其他的 thread 裡面,如果要用 AsyncTask ,也是不錯的方式之一,不過這次我只想用 Thread 來做。

new Thread(
    new Runnable() {
        @Override
        public void run() {
            OkHttpClient http = new OkHttpClient();
​​​​​​            provider = new GoogleUserCredentialProvider(http);
            provider.login(code);
            go = new PokemonGo(http);
            go.setDeviceInfo(deviceInfo);
            go.login(provider);
       }
    }
).start();

注意到了嗎?裡面有一行 go.setDeviceInfo ,注意這一定要要設定,因為 Pokémon API Server 會去檢查用哪支手機去連線的,因此我們必須要做設定,而 deviceInfo 就要寫成

deviceInfo = new DeviceInfo();
deviceInfo.setAndroidBoardName(Build.BOARD);
deviceInfo.setAndroidBootloader(Build.BOOTLOADER);
deviceInfo.setDeviceBrand(Build.BRAND);
deviceInfo.setDeviceId(Build.SERIAL);
deviceInfo.setDeviceModel(Build.ID);
deviceInfo.setDeviceModelBoot(Build.HARDWARE);
deviceInfo.setDeviceModelIdentifier(Build.HOST);
deviceInfo.setFirmwareBrand(Build.HOST);
deviceInfo.setFirmwareFingerprint(Build.FINGERPRINT);
deviceInfo.setFirmwareTags(Build.TAGS);
deviceInfo.setFirmwareType(Build.TYPE);
deviceInfo.setHardwareManufacturer(Build.MANUFACTURER);
deviceInfo.setHardwareModel(Build.DEVICE);

 

PTC 帳號登入

PTC 帳號就真的比較簡單,不需要第三方認證,因此只要做 Login 就好。

new Thread(
    new Runnable() {
        @Override
        public void run() {
            OkHttpClient http = new OkHttpClient();
​​​​​​            provider = new PtcCredentialProvider(http, username, password);
            provider.login(code);
            go = new PokemonGo(http);
            go.setDeviceInfo(deviceInfo);
            go.login(provider);
       }
    }
).start();

 

取得 Pokemon

所有抓到的 Pokémon 都會放在 Pokemon Bank 裡面,要取得 Pokebank,在 Login 完畢後,可使用

go.getInventories().getPokebank()

要拿到所有的 Pokemon 資料,就必須在 Pokebank 裡面拿,因此把上面改寫成

pokemons = go.getInventories().getPokebank().getPokemons();

 

取得隱藏值

Pokemon 的隱藏值如下

IV = pokemon.getIvRatio()
最大 CP = pokemon.getMaxCp()
LEVEL = pokemon.getLevel()
個人體力 = pokemon.getIndividualStamina()
攻擊能力 = pokemon.getIndividualAttack()
防禦能力 = pokemon.getIndividualDefense()

最後大家應該會注意到 IV = (個人體力 + 攻擊能力 + 防禦能力) / 45

 

arrow
arrow
    文章標籤
    Pokemon IV APP
    全站熱搜
    創作者介紹
    創作者 CuteBaby 的頭像
    CuteBaby

    EasyPlayApp 的部落格

    CuteBaby 發表在 痞客邦 留言(0) 人氣()