techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

CoinCheck APIをJava+OKHttp3の組み合わせで呼び出してみる

仮想通貨はBitcoinなどの取引所はいくつかありますがcoincheckは多くの仮想通貨を取り扱っているのが特徴です。 そして公開されているAPIがあり、注文やレートなどの取得などを取得やコントロールすることができます。

そこで今回はcoincheckをGAEで利用するために導入にJavaのサンプルコードを分解し一番簡単な内容に抽出し説明します。

まずはこちら(api_settings)からcoincheckのアクセスキーとシークレットアクセスキーを作成します。 api_settingsを開くと「新たにAPIキーを追加する」を選択すると下記のようなウィンドウが表示されます。

上記のウィンドウから作成するアクセスキーを利用した場合にコントロールできるAPIを選択します。 IPを指定することでコントロールすることができるIPを絞ることができるので他人にコントロールされる心配がなくなるのでできるだけかけたほうが良いと思われます。 これでAPIキーを作成すると下図のようになります。

ここで表示されるアクセスキーとシークレットアクセスキーは控えておいてください。

それではJavaでcoincheck APIのティッカー(各種最新情報を簡易に取得)を呼び出してみましょう。 コードは下記のようになります。

    private String request(){
        String url = "https://coincheck.com/api/ticker";
        String nonce = String.valueOf(System.currentTimeMillis());
        Request request = new Request
                .Builder()
                .url(url)
                .addHeader("Content-Type", "application/json")
                .addHeader("ACCESS-KEY", API_KEY)
                .addHeader("ACCESS-NONCE", nonce)
                .addHeader("ACCESS-SIGNATURE", encodeHmacSHA256(API_SECRET_KEY, url, nonce))
                .get()
                .build();

        OkHttpClient client = new OkHttpClient
                .Builder()
                .connectTimeout(0, TimeUnit.SECONDS)
                .readTimeout(0, TimeUnit.SECONDS)
                .build();

        Response response = null;
        try {
            response = client.newCall(request).execute();
            return response.body().string();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    private String encodeHmacSHA256(String secretKey, String url, String nonce) {
        String message = nonce + url;

        SecretKeySpec keySpec = new SecretKeySpec(
                secretKey.getBytes(),
                "hmacSHA256");

        Mac mac = null;
        try {
            mac = Mac.getInstance("hmacSHA256");
            mac.init(keySpec);
        } catch (NoSuchAlgorithmException | InvalidKeyException e) {
            // can't recover
            throw new RuntimeException(e);
        }
        byte[] rawHmac = mac.doFinal(message.getBytes());
        return DatatypeConverter.printHexBinary(rawHmac);
    }

4行目〜12行目までの箇所でHTTPのGETリクエストを作成し、そのヘッダにACCESS-KEY(APIキー登録時に生成されたアクセスキー)、ACCESS-NONC(現在時刻[ms])、ACCESS-SIGNATURE(現在時刻とURLとパラメータを合成した文字列をシークレットアクセスキーでhmacSHA256で暗号化した文字列)を追加します。 そして22行目でHTTPのGETをOkHttp3でコールしています。

上記のrequestを呼び出すと下記のような結果が得られます。

{"last":XXXXXX.0,"bid":XXXXXX.0,"ask":XXXXXX.0,"high":XXXXXXX.0,"low":XXXXXX.0,"volume":XXXXX.XXXXXXXX,"timestamp":XXXXXXXXXX}

他のAPIも同じ流れで実行すると実現できます。 パラメータありだとencodeHmacSHA256で生成する文字列が多少変化しますので注意してください。