coincheck の Private API を叩くには Header に認証情報を入れる必要があります。 Haskellで利用する際の例がなかったのでドキュメントを頼りに実装しました。
認証に関する仕様はこちら。Headerに含めるべき情報はACCESS-KEY
とACCESS-NONCE
とACCESS-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\":...
うまく動いているようですね!