ボス級社内SEのお役立ち技術情報

社内SEのシステム開発について。メインプログラム言語C#

C#でGMOコインのAPIでデータを取得する

f:id:HLSE:20190414135344j:plain

 

※ 2019/9/15に投稿時の内容です。API仕様も現時点のものなので作成するときは最新のAPI仕様をご確認ください。記載内容を試すときは自己責任でお願い致します。

 

GMOコインのAPIは以下言語しかサンプルがありません。

  • Node.js
  • Python
  • Go
  • Ruby
  • PHP
  • Kotlin

APIをたたけばできるということなのでC#でもできると思い試してみました。

coin.z.com

 

 

他言語で作成されている方も以下の点で参考になるのではないでしょうか。

  • エラー内容の確認

 

開発環境

OS:Windows10 64bit Home
開発環境:VisualStudio2019
プログラム言語:C# (.Net)

 

GMOコイン API概要

なんというか説明が不十分です。

C#のコードがないのはいいとして、

エラーコードとそのエラー内容の受け取り方がのっていません。。。

あと対処方法も載せてほしいところです。

 

口座がなくとも、PUBLICキーを使用できるようです。

api.coin.z.com

 

前準備

①GMOコインにログインしてAPIのページに移動

APIキーを新規作成して以下を入手する

  • APIキー
  • APIシークレット

f:id:HLSE:20190915134253j:plain

②作成したAPIキーのIPアドレスを設定する

f:id:HLSE:20190915134258j:plain

 

【自身のグローバルIPアドレスの調べ方】

192.168.◯.◯はローカルIPアドレスなので注意が必要です。

www.cman.jp

③APIで取得したい情報にチェックを入れます。

f:id:HLSE:20190915134303j:plain

 

以上でとりあえずAPIキーの設定は完了です。

 

制限するIPアドレスは絶対に設定してください。

APIキーがもし外部にもれたとしてもここで制限が係るので安全です。

ちなみにAPIキーはPRIVATE APIのみ必要です。

 

ソースコード

■PUBLIC API

サンプルとして「最新のレート」を取得するAPIを実行してみます。

PUBLIC APIは認証がいらないAPIです。

対象レートは、「BTC_JPY」です。

【フォーム】

f:id:HLSE:20190915153213j:plain

【Form1.cs】

タイマーにて1秒ごとに取得しています

using System;
using System.Net;
using System.Runtime.Serialization.Json;
using System.Windows.Forms;
using VirtualMoneyTradeGMO.MODEL;
 
namespace VirtualMoneyTradeGMO
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object senderEventArgs e)
        {
            timer1.Enabled = true;
            timer1.Interval = 1000//1秒ごとに取得
        }
 
        /// <summary>
        /// タイマー
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Timer1_Tick(object senderEventArgs e)
        {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
 
            string url = "https://api.coin.z.com/public/v1/ticker?symbol=BTC_JPY";
            //string url = "https://api.coin.z.com/public/v1/status";
 
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
            req.Method = "GET";
            HttpWebResponse res = (HttpWebResponse)req.GetResponse();
 
            INFO info;
            using (res)
            {
                using (var resStream = res.GetResponseStream())
                {
                    var serializer = new DataContractJsonSerializer(typeof(INFO));
                    info = (INFO)serializer.ReadObject(resStream);
                }
            }
 
            tbBitAsk.Text = info.data[0].ask;
            tbBitBid.Text = info.data[0].bid;
            tbBitHigh.Text = info.data[0].high;
            tbBitLow.Text = info.data[0].low;
            tbBitLast.Text = info.data[0].last;
            tbBitVolume.Text = info.data[0].volume;
            tbBitTimestamp.Text = info.data[0].timestamp;
        }
    }
}

【モデル】

受信したデータを入れる箱です。

using System.Collections.Generic;
using System.Runtime.Serialization;
 
namespace VirtualMoneyTradeGMO.MODEL
{
    [DataContract]
    public class INFO
    {
        [DataMember]
        public string status { getset; }
        [DataMember]
        public List<secondData> data { getset; }
 
        [DataContract]
        public class secondData
        {
            [DataMember]
            public string ask { getset; }
            [DataMember]
            public string bid { getset; }
            [DataMember]
            public string high { getset; }
            [DataMember]
            public string last { getset; }
            [DataMember]
            public string low { getset; }
            [DataMember]
            public string symbol { getset; }
            [DataMember]
            public string timestamp { getset; }
            [DataMember]
            public string volume { getset; }
        }
        [DataMember]
        public string responsetime { getset; }
    }
}

 

以下のようにフォームにデータが入っていればOKです。

f:id:HLSE:20190915152958j:plain

■PRIVATE API

認証が必要でGMOコインのアカウントおよびAPIキー&APIシークレットキーが必要です。

 

【フォーム】

f:id:HLSE:20190915151056j:plain

【Form1.cs】

using System;
using System.Linq;
using System.Net;
using System.Runtime.Serialization.Json;
using System.Security.Cryptography;
using System.Text;
using System.Windows.Forms;
using VirtualMoneyTradeGMO.MODEL;
 
namespace VirtualMoneyTradeGMO
{
    public partial class Form1 : Form
    {
 
        const string apiKey = APIキー;
        const string secretKey = APIシークレットキー;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void BtnGetInfo_Click(object senderEventArgs e)
        {
            this.Enabled = false;
            //HTTPS通信には必要
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
            //エンドポイント
            string endPoint = "https://api.coin.z.com/private";
            string method = "GET";
            //UNIXタイムスタンプの取得
            var timestamp = ((int)((DateTime.UtcNow - new DateTime(197011)).TotalSeconds)).ToString() + "000";
            //エンドポイント以下のURL
            string path = "/v1/account/margin";
            //文字列をバイト型配列に変換する
            byte[] data = Encoding.ASCII.GetBytes(timestamp + method + path);
            //HMACSHA256オブジェクトの作成
            HMACSHA256 hmac = new HMACSHA256(Encoding.ASCII.GetBytes(secretKey));
            byte[] bs = hmac.ComputeHash(data);
            //ToLower型にしないとエラーではじかれる。Replaceも必要
            string hexHash = BitConverter.ToString(bs).Replace("-""").ToLower();
            hmac.Clear();
 
            var req = (HttpWebRequest)WebRequest.Create(endPoint + path);
            req.Method = method;
            req.Headers.Add("API-KEY", apiKey);
            req.Headers.Add("API-TIMESTAMP"timestamp);
            req.Headers.Add("API-SIGN"hexHash);
 
            ////////////////////////////////////////////////////////////////////////////////
            //レスポンスデータをJOSO型に変換する
            ////////////////////////////////////////////////////////////////////////////////
            MARGIN margin;
            using (var res = req.GetResponse())
            {
                using (var reader = res.GetResponseStream())
                {
                    //Console.WriteLine(reader.ReadToEnd());
                    var serializer = new DataContractJsonSerializer(typeof(MARGIN));
                    margin = (MARGIN)serializer.ReadObject(reader);
                }
            }
 
            if (margin.messages != null)
            {
                tbInformation.Text.Insert(0margin.messages[0].message_code + " " + margin.messages[0].message_code);
                this.Enabled = true;
                return;
            }
            tbMargin1.Text = margin.data.profitLoss;
            tbMargin2.Text = margin.data.actualProfitLoss;
            tbMargin3.Text = margin.data.margin;
            tbMargin4.Text = margin.data.availableAmount;
 
            this.Enabled = true;
        }
    }
}

【MODEL】

using System.Runtime.Serialization;
 
namespace VirtualMoneyTradeGMO.MODEL
{
    [DataContract]
    public class MARGIN
    {
        [DataMember]
        public string status { getset; }
        [DataMember]
        public secondData data { getset; }
        
        [DataContract]
        public class secondData
        {
            [DataMember]
            public string profitLoss { getset; }
            [DataMember]
            public string actualProfitLoss { getset; }
            [DataMember]
            public string margin { getset; }
            [DataMember]
            public string availableAmount { getset; }
        }
 
        [DataMember]
        public Errors[] messages { get; set; }
        [DataContract]
        public class Errors
        {
            [DataMember]
            public string message_code { get; set; }
            [DataMember]
            public string message_string { get; set; }
        }
 
        [DataMember]
        public string responsetime { getset; }
    }
}

 

赤色が部分が重要です。

エラーが発生した場合は赤枠部分にデータが入ってきます。

 

参考サイト様 

bitcoin.stackexchange.com

argius.hatenablog.jp

 

 

もしこのアプリケーションの作成依頼がございましたら、

コメントに残して頂ければご対応致します。