Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Cryptsy API

Pagina: 1
Acties:

  • tha_crazy
  • Registratie: Maart 2007
  • Laatst online: 21:29
Ik ben bezig om tegen de cryptsy API aan te praten, just for the hell of it.
Maar zit nu al 2 dagen vast op het volgende.

Bij het praten tegen de API blijf ik deze error krijgen, zelfs na het meerdere keren veranderen van de hash functie en alles.
{"success":"0","error":"Unable to Authorize Request - Check Your Post Data"}

Natuurlijk al van alles gelezen erover ondertussen, en voorbeelden in python, php & java gezien, maar ik krijg het maar niet lekker vertaald naar C#

Deze API probeer ik tegenaan te praten: https://www.cryptsy.com/pages/api
Op het moment heb ik dit:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
            Encoding encoding = Encoding.UTF8;
            
            string par = "method=allmyorders&nonce=" + GetUnixTimestamp(DateTime.Now).ToString();

            Uri url = new Uri(_APIUrl).AddQuery("method", "allmyorders");

            byte[] parBytes = encoding.GetBytes(par);
            var keyByte = encoding.GetBytes(_PrivateKey + par);

            var hmac = new HMACSHA512(keyByte);
            string finalpass = BitConverter.ToString(hmac.Key, 0).Replace("-", "");

            //var KeyByte = encoding.GetBytes(_PrivateKey);
            //var hmacsha512 = new HMACSHA512(KeyByte);
            //var messagebytes = encoding.GetBytes(par);

            //var hash = hmacsha512.ComputeHash(messagebytes);

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

            //WebRequest request = WebRequest.Create(url);

            request.ContentType = "application/x-www-form-urlencoded";
            request.Method = "POST";
            
            request.Credentials = new NetworkCredential(_PublicKey, finalpass);

            request.CookieContainer = new CookieContainer();

            try
            {

                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream stream = response.GetResponseStream();

                string strpage2check;
                using (StreamReader sr = new StreamReader(stream))
                {
                    strpage2check = sr.ReadToEnd();
                }

                int y = 1;
            }
            catch (WebException ex)
            {
                HttpWebResponse ErrorResp = (HttpWebResponse)ex.Response;
                if (ErrorResp.StatusCode == HttpStatusCode.NotFound)
                {
                    int x = 9;
                }
            }
        }

  • DaCoTa
  • Registratie: April 2002
  • Laatst online: 22-11 12:54
Ik ben niet vloeiend in C#, maar waar ik bij de Kraken API tegenaanliep is dat je uiteindelijk maar 2 parameter in de header hebt, en alle andere in de post data. Dus maak een post met alle zooi, inclusief nonce, en in het geval van Cryptsy (als ik het zo lees) ook de method. Die hele bups post data moet je HMAC-SHA512 signen met je private key. Het lijkt erop dat je keyByte dus niet correct is.

  • frG
  • Registratie: Augustus 2004
  • Laatst online: 20-11 20:03

frG

Ik heb een werkende API in .NET (c#) draaiend.

Met onderstaand voorbeeld zou je gewoon calls moeten kunnen maken, ik vermoed dat het wellicht bij de encoding fout gaat. Maar wat DaCoTa ook al aangeeft is er een verschil tussen request header, en de daadwerkelijke post data.

Mocht je interesse hebben in de rest van de applicatie laat het maar even weten.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
using CryAPI.Logic.Helpers;
using CryAPI.Models;
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace CryAPI.Logic
{
    public class Connector
    {
        public static string Request(string method, StringBuilder postParameters = null)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Constants.ApiUrl);

            request.Method = "POST";
            request.UserAgent = "CryAPI .NET C#";
            request.ContentType = "application/x-www-form-urlencoded";

            if (postParameters == null)
                postParameters = new StringBuilder();

            postParameters.Insert(0, string.Format("method={0}", method));
            postParameters.Append(string.Format("&nonce={0}", GenerateNonce()));

            var postData = Encoding.ASCII.GetBytes(postParameters.ToString());
            var signature = EncryptionHelper.GetCryptsySignature(postData);

            request.Headers.Add("Sign", signature);
            request.Headers.Add("Key", Constants.PublicKey);

            request = AddPostData(request, postData);

            try
            {
                WebResponse response = request.GetResponse();

                using (Stream responseStream = response.GetResponseStream())
                {
                    StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
                    return reader.ReadToEnd();
                }
            }
            catch (WebException ex)
            {
                var errorMessage = ex.Message;
                WebResponse errorResponse = ex.Response;

                if (errorResponse != null)
                {
                    using (Stream responseStream = errorResponse.GetResponseStream())
                    {
                        StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
                        String errorText = reader.ReadToEnd();
                    }
                }

                throw;
            }
        }

        public static HttpWebRequest AddPostData(HttpWebRequest request, byte[] postData)
        {
            try
            {
                if (postData != null)
                {
                    request.ContentLength = postData.Length;

                    using (var dataStream = request.GetRequestStream())
                    {
                        dataStream.Write(postData, 0, postData.Length);
                    }
                }

                return request;
            }
            catch (WebException ex)
            {
                var errorMessage = ex.Message;
                WebResponse errorResponse = ex.Response;

                if (errorResponse != null)
                {
                    using (Stream responseStream = errorResponse.GetResponseStream())
                    {
                        StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
                        String errorText = reader.ReadToEnd();
                    }
                }

                throw;
            }
        }

        public static string GenerateNonce()
        {
            return ((int)DateTime.Now.Subtract(new DateTime(1970, 1, 1)).TotalSeconds).ToString();
        }
    }
}


Encryption helper:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using CryAPI.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace CryAPI.Logic.Helpers
{
    public class EncryptionHelper
    {
        public static string GetCryptsySignature(byte[] postData)
        {
            var keyByte = Encoding.ASCII.GetBytes(Constants.PrivateKey);
            var hmacsha512 = new HMACSHA512(keyByte);
            var hashedMessage = hmacsha512.ComputeHash(postData);

            string signature = ByteHelper.ByteToString(hashedMessage);

            return signature.ToLower();
        }
    }
}


ByteHelper:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
namespace CryAPI.Logic.Helpers
{
    public static class ByteHelper
    {
        public static string ByteToString(byte[] buff)
        {
            string sbinary = "";
            for (int i = 0; i < buff.Length; i++)
                sbinary += buff[i].ToString("X2"); /* hex format */
            return sbinary;
        }    
    }
}

  • whitecrow
  • Registratie: September 2008
  • Laatst online: 02-07 00:18
frG ik ben heel erg benieuwd naar de rest van de applicatie!

Bedankt voor het posten van dit stuk al. :)

Edit:
Ik weet niet goed wat ik aan moet met de Models en Constants referentie in je code ?

[ Voor 30% gewijzigd door whitecrow op 27-01-2014 12:45 ]


  • frG
  • Registratie: Augustus 2004
  • Laatst online: 20-11 20:03

frG

whitecrow schreef op maandag 27 januari 2014 @ 12:24:
frG ik ben heel erg benieuwd naar de rest van de applicatie!

Bedankt voor het posten van dit stuk al. :)

Edit:
Ik weet niet goed wat ik aan moet met de Models en Constants referentie in je code ?
Zo te zien wordt de model namespace niet direct gebruikt in het betreffende stuk code, deze kan je dus weghalen, in de hele applicatie wordt de response string omgezet in nette objecten.

Wat betreft de constants, dit zijn gewoon strings, en moet je dus vervangen met je eigen waardes, public key etc.

  • Stephan224
  • Registratie: Maart 2002
  • Laatst online: 31-10-2022
Ik ben de ontwikkelaar achter de Simple Trade Bot en de Haasonline Trade Server. Aangezien dat ik ook alles in C# heb denk ik wel dat ik je voor 100% op weg kan helpen. Stuur me maar een PM als je een zetje wil hebben. ;)

Software Developer, checkout my bitcoin software at my website www.haasonline.com (Trade Bots and more...)

Pagina: 1