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\":...

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

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.