質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

3280閲覧

c#でzaifのapiで認証が行えない

hemuhemu779

総合スコア5

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2016/05/17 16:13

###前提・実現したいこと
c#でzaifのapiで認証し「get_info」を実行したい。(詳細は以下参照)
ネット上にはC#のサンプルが無くて苦しんでます。
https://corp.zaif.jp/api-docs/trade-api/#method_get_info

###発生している問題・エラーメッセージ
httpのリクエストの応答値が以下のようになってしまいます。
response = "{"success": 0, "error": "invalid nonce parameter"}"

###該当のソースコード
class API_ZAIF_get_info
{
static readonly Uri endpointUri = new Uri("https://api.zaif.jp");
static readonly string apiKey = "APIキー";
static readonly string apiSecret = "APIシークレットキー";

public async Task<string> TaskStart() { var method = "POST"; var path = "/tapi"; var query = ""; var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString(); var body = @"{ ""nonce"": """ + timestamp + @""", ""method"": ""get_info"" }"; var data=""; data = HttpUtility.UrlEncode(body); var hash = HASH.SignWithHMACSHA512(data, apiSecret); using (var client = new HttpClient()) using (var request = new HttpRequestMessage(new HttpMethod(method), path + query)) using (var content = new StringContent(body)) { client.BaseAddress = endpointUri; content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); request.Content = content; request.Headers.Add("Key", apiKey); request.Headers.Add("Sign", hash); HttpResponseMessage message = await client.SendAsync(request); if (message.IsSuccessStatusCode) { var response = await message.Content.ReadAsStringAsync(); WriteTextFile_ErrorInfo.write(request.ToString()); WriteTextFile_ErrorInfo.write(message.ToString()); return response; } else { WriteTextFile_ErrorInfo.write(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + "API_ZAIF_get_info"); WriteTextFile_ErrorInfo.write(request.ToString()); WriteTextFile_ErrorInfo.write(message.ToString()); return "false"; } } }

}

C#に詳しい方がいたら、何処が悪いか教えて頂きたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

WebClientを使った方法

// 参照に以下の2つを追加する。 // System.Security // System.Web // // NuGetから以下1つのパッケージをインストールする。 // Newtonsoft.Json using Newtonsoft.Json; using System; using System.Net; using System.Security.Cryptography; using System.Text; using System.Web; namespace zaif_test { class Program { static readonly string API_TRADE_ENDPOINT = "https://api.zaif.jp/tapi"; static readonly string API_KEY = "***"; static readonly string API_SECRET = "***"; static void Main() { var wc = new WebClient(); // nonce用にunixtimeを用いる var unixtime = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; // POSTするデータ var data = HttpUtility.ParseQueryString(string.Empty); data.Add("nonce", unixtime.ToString()); data.Add("method", "get_info"); // Sign を計算する var hash = new HMACSHA512(new UTF8Encoding().GetBytes(API_SECRET)).ComputeHash(new UTF8Encoding().GetBytes(data.ToString())); var sign = BitConverter.ToString(hash).ToLower().Replace("-", ""); // WebClientのヘッダにセットする wc.Headers.Set("Key", API_KEY); wc.Headers.Set("Sign", sign); // POST実行 var res = wc.UploadValues(API_TRADE_ENDPOINT, data); // 結果JSONのデシリアライズ var json = JsonConvert.DeserializeObject(new UTF8Encoding().GetString(res)); // 結果を表示 Console.WriteLine(json); } } }

HttpClientを使った方法

using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Net.Http; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; namespace zaif_test_httpclient { class Program { static readonly string API_TRADE_ENDPOINT = "https://api.zaif.jp/tapi"; static readonly string API_KEY = "***"; static readonly string API_SECRET = "***"; static async Task<object> MyTask() { var httpClient = new HttpClient(); // nonce用にunixtimeを用いる var unixtime = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; // POSTするデータ var content = new FormUrlEncodedContent(new Dictionary<string, string> { { "nonce", unixtime.ToString() }, { "method", "get_info" } }); // Sign を計算する var hash = new HMACSHA512(new UTF8Encoding().GetBytes(API_SECRET)).ComputeHash(new UTF8Encoding().GetBytes(await content.ReadAsStringAsync())); var sign = BitConverter.ToString(hash).ToLower().Replace("-", ""); // HttpClientのヘッダにセットする httpClient.DefaultRequestHeaders.Add("key", API_KEY); httpClient.DefaultRequestHeaders.Add("Sign", sign); // POST実行 var res = await httpClient.PostAsync(API_TRADE_ENDPOINT, content); // 結果JSONのデシリアライズ var json = JsonConvert.DeserializeObject(await res.Content.ReadAsStringAsync()); // 結果を返す return json; } static void Main() { Task.Run(async () => { var obj = await MyTask(); Console.WriteLine(obj); }).Wait(); } } }
{ "success": 1, "return": { "funds": { "jpy": 0.0, "btc": 0.0, "mona": 0.0 }, "deposit": { "jpy": 0.0, "btc": 0.0, "mona": 0.0 }, "rights": { "info": 1, "trade": 1, "withdraw": 1 }, "trade_count": 0, "open_orders": 0, "server_time": 1463503760 } }

投稿2016/05/17 16:50

編集2016/05/19 01:57
aglkjggg

総合スコア769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hemuhemu779

2016/05/19 00:51

ご回答ありがとうございます。 指定された方法で正しい応答を得ることはできました。 けれども「HttpRequestMessage」を用いた方法をご教授頂けないでしょうか。
hemuhemu779

2016/05/19 10:26

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問