LoginSignup
2
1

More than 5 years have passed since last update.

coincheckのPrivate APIをHaskellから叩いてみる

Last updated at Posted at 2017-06-21

coincheck の Private API を叩くには Header に認証情報を入れる必要があります。 Haskellで利用する際の例がなかったのでドキュメントを頼りに実装しました。

認証に関する仕様はこちら。Headerに含めるべき情報はACCESS-KEYACCESS-NONCEACCESS-SIGNATUREで前二つは発行されたものをそのまま使うものと自前で勝手に用意するもので楽に実装できます。手間なのはACCESS-SIGNATUREで仕様では

ACCESS-NONCE, リクエスト先URL, リクエストのボディ を全て文字列にし連結したものを、HMAC-SHA256 hash形式でシークレットキーを使って署名した結果

とあります。要はHMAC-SHA256でハッシュ化できればいいのでcryptohash-sha256を使えば良さそうでしょう。あとExampleを見ているとhexでエンコードする必要がありそうなのでbase16-bytestringを使ってエンコードします。

出来上がったコードはこちら

{-# LANGUAGE OverloadedStrings #-}

module Main where

import Control.Lens ((&), (.~), (^.))
import Crypto.Hash.SHA256 (hmac)
import Data.ByteString (ByteString)
import qualified Data.ByteString.Base16 as Base16
import qualified Data.ByteString.Char8 as BS
import Data.Monoid ((<>))
import Data.Time.Clock.POSIX (getPOSIXTime)
import qualified Network.Wreq as Wreq

accessKey :: ByteString
accessKey = ...

secretAccessKey :: ByteString
secretAccessKey = ...

createAccessSignature :: ByteString       -- ACCESS-NONCE
                      -> ByteString       -- リクエスト先URL
                      -> Maybe ByteString -- リクエストのボディ
                      -> ByteString       -- ACCESS-SIGNATURE
createAccessSignature accessNonce url body =
  Base16.encode $ hmac secretAccessKey (accessNonce <> url <> maybe "" id body)

main :: IO ()
main = do
  unixtime <- getPOSIXTime
  let accessNonce = BS.pack . show . round $ unixtime  -- Nonceとしてエポック秒を利用
      url = "https://coincheck.com/api/accounts/balance"
      opts = Wreq.defaults &
        Wreq.headers .~ [ ("ACCESS-KEY", accessKey)
                        , ("ACCESS-NONCE", accessNonce)
                        , ("ACCESS-SIGNATURE", createAccessSignature accessNonce (BS.pack url) Nothing)
                        ]

  r <- Wreq.getWith opts url
  print (r ^. Wreq.responseBody)

HTTPクライアントにはwreqを使用しています。実際に動かしてみましょう

$ stack build && stack exec app
"{\"success\":true,\"jpy\":\"0\",\"btc\":\"0\",\"usd\":\"0\",\"cny\":...

うまく動いているようですね!

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1