※ 2019/9/15に投稿時の内容です。API仕様も現時点のものなので作成するときは最新のAPI仕様をご確認ください。記載内容を試すときは自己責任でお願い致します。
GMOコインのAPIは以下言語しかサンプルがありません。
- Node.js
- Python
- Go
- Ruby
- PHP
- Kotlin
APIをたたけばできるということなのでC#でもできると思い試してみました。
他言語で作成されている方も以下の点で参考になるのではないでしょうか。
- エラー内容の確認
開発環境
OS:Windows10 64bit Home
開発環境:VisualStudio2019
プログラム言語:C# (.Net)
GMOコイン API概要
なんというか説明が不十分です。
C#のコードがないのはいいとして、
エラーコードとそのエラー内容の受け取り方がのっていません。。。
あと対処方法も載せてほしいところです。
口座がなくとも、PUBLICキーを使用できるようです。
前準備
①GMOコインにログインしてAPIのページに移動
APIキーを新規作成して以下を入手する
- APIキー
- APIシークレット
②作成したAPIキーのIPアドレスを設定する
【自身のグローバルIPアドレスの調べ方】
192.168.◯.◯はローカルIPアドレスなので注意が必要です。
③APIで取得したい情報にチェックを入れます。
以上でとりあえずAPIキーの設定は完了です。
制限するIPアドレスは絶対に設定してください。
APIキーがもし外部にもれたとしてもここで制限が係るので安全です。
ちなみにAPIキーはPRIVATE APIのみ必要です。
ソースコード
■PUBLIC API
サンプルとして「最新のレート」を取得するAPIを実行してみます。
PUBLIC APIは認証がいらないAPIです。
対象レートは、「BTC_JPY」です。
【フォーム】
【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 sender, EventArgs e) { timer1.Enabled = true; timer1.Interval = 1000; //1秒ごとに取得 } /// <summary> /// タイマー /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Timer1_Tick(object sender, EventArgs 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 { get; set; } [DataMember] public List<secondData> data { get; set; } [DataContract] public class secondData { [DataMember] public string ask { get; set; } [DataMember] public string bid { get; set; } [DataMember] public string high { get; set; } [DataMember] public string last { get; set; } [DataMember] public string low { get; set; } [DataMember] public string symbol { get; set; } [DataMember] public string timestamp { get; set; } [DataMember] public string volume { get; set; } } [DataMember] public string responsetime { get; set; } } }
以下のようにフォームにデータが入っていればOKです。
■PRIVATE API
認証が必要でGMOコインのアカウントおよびAPIキー&APIシークレットキーが必要です。
【フォーム】
【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 sender, EventArgs 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(1970, 1, 1)).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(0, margin.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 { get; set; } [DataMember] public secondData data { get; set; } [DataContract] public class secondData { [DataMember] public string profitLoss { get; set; } [DataMember] public string actualProfitLoss { get; set; } [DataMember] public string margin { get; set; } [DataMember] public string availableAmount { get; set; } } [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 { get; set; } } }
赤色が部分が重要です。
エラーが発生した場合は赤枠部分にデータが入ってきます。
参考サイト様
もしこのアプリケーションの作成依頼がございましたら、
コメントに残して頂ければご対応致します。