Bitcoin Forum

Local => Кодеры => Topic started by: xMizar on August 06, 2017, 10:28:24 AM



Title: Вопрос по API Yobit
Post by: xMizar on August 06, 2017, 10:28:24 AM
Добрый день. Подскажите, пожалуйста, возможно кто-то встречался с такой проблемой. Пытаюсь для себя написать на C# простое приложение и пры поппытке вызвать метод getInfo всегда получаю ошибку. Пишет, что ключ, подпись, метод или nonce неверный. Нашел несколько примеров, проверил все, что мог. Ошибки не вижу. Может кто-нибудь знает в чем тут может быть дело? Вот код:

        const string key = "072BCC223A1ADBE86854A4B4A9468EAB";
        const string secret = "4c962093fb943d418afb8fae14841c6b";
        const string tapi = "https://yobit.net/tapi";

        public void GetInfo() {
            int nonce = 1;

            string parameters = $"method=getInfo&nonce=1";

            string address = $"{tapi}?{parameters}";

            var keyByte = Encoding.UTF8.GetBytes(secret);

            string sign1 = string.Empty;
            byte[] inputBytes = Encoding.UTF8.GetBytes(parameters);
            using (var hmac = new HMACSHA512(keyByte))
            {
                byte[] hashValue = hmac.ComputeHash(inputBytes);

                StringBuilder hex1 = new StringBuilder(hashValue.Length * 2);
                foreach (byte b in hashValue)
                {
                    hex1.AppendFormat("{0:x2}", b);
                }
                sign1 =  hex1.ToString();
            }

            WebRequest webRequest = (HttpWebRequest)System.Net.WebRequest.Create(address);
            if (webRequest != null)
            {
                webRequest.Method = "POST";
                webRequest.Timeout = 20000;
                webRequest.ContentType = "application/x-www-form-urlencoded";
                webRequest.Headers.Add("Key", key);
                webRequest.Headers.Add("Sign", sign1);

                using (System.IO.Stream s = webRequest.GetResponse().GetResponseStream())
                {
                    using (System.IO.StreamReader sr = new System.IO.StreamReader(s))
                    {
                        var jsonResponse = sr.ReadToEnd();
                        Console.WriteLine(String.Format("Response: {0}", jsonResponse));
                    }
                }
            }


            Log(nonce.ToString());
        }


Ключ - InfoOnly, nonce специально захардкодил на 1 для простоты. Буду очень признателен за любую помощь


Title: Re: Вопрос по API Yobit
Post by: BrXeon on August 07, 2017, 09:17:20 AM
Добрый день,
Из описания API:
Параметр nonce (минимум 1, максимум 2147483646) при каждом новом запросе должен быть больше значения из предыдущего запроса.
Для обнуления nonce необходимо создать новый ключ.

Т.е. при каждом обращении к Trade API nonce нужно увеличивать, использованный nonce будет выдавать ошибку.


Title: Re: Вопрос по API Yobit
Post by: ferumflex on August 07, 2017, 02:58:35 PM
Поддерживаю с BrXeon, нужно тогда его где то сохранять либо другой вариант брать unix time, но тогда запросы можно будет делать не чаще раза в секунду


Title: Re: Вопрос по API Yobit
Post by: Rora on August 07, 2017, 05:09:49 PM
Quote
нужно тогда его где то сохранять либо другой вариант брать unix time, но тогда запросы можно будет делать не чаще раза в секунду

Можно записывать значение в файл, а при запуске программа должна считывать из файла последнее значение nonce.

Quote
пры поппытке вызвать метод getInfo всегда получаю ошибку

Смотрите какой код ответа возвращает вам биржа, ну смотрите таблицу расшифровки кодов ошибок.


Title: Re: Вопрос по API Yobit
Post by: ligor on August 07, 2017, 07:38:31 PM
Да уж, очень подробная у них документация   >:(.   Вот правильный вариант
Code:
        public void GetInfo()
        {

            string parameters = $"method=getInfo&nonce=" + (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;

            string address = $"{tapi}/";

            var keyByte = Encoding.UTF8.GetBytes(secret);

            string sign1 = string.Empty;
            byte[] inputBytes = Encoding.UTF8.GetBytes(parameters);
            using (var hmac = new HMACSHA512(keyByte))
            {
                byte[] hashValue = hmac.ComputeHash(inputBytes);

                StringBuilder hex1 = new StringBuilder(hashValue.Length * 2);
                foreach (byte b in hashValue)
                {
                    hex1.AppendFormat("{0:x2}", b);
                }
                sign1 = hex1.ToString();
            }

            WebRequest webRequest = (HttpWebRequest)System.Net.WebRequest.Create(address);
            if (webRequest != null)
            {
                webRequest.Method = "POST";
                webRequest.Timeout = 20000;
                webRequest.ContentType = "application/x-www-form-urlencoded";
                webRequest.Headers.Add("Key", key);
                webRequest.Headers.Add("Sign", sign1);

                webRequest.ContentLength = parameters.Length;
                using (var dataStream = webRequest.GetRequestStream())
                {
                    dataStream.Write(inputBytes, 0, parameters.Length);
                }

                using (System.IO.Stream s = webRequest.GetResponse().GetResponseStream())
                {
                    using (System.IO.StreamReader sr = new System.IO.StreamReader(s))
                    {
                        var jsonResponse = sr.ReadToEnd();
                        Console.WriteLine(String.Format("Response: {0}", jsonResponse));
                    }
                }
            }

        }


Title: Re: Вопрос по API Yobit
Post by: xMizar on August 07, 2017, 09:03:54 PM
ligor, огромное спасибо! :)


Title: Re: Вопрос по API Yobit
Post by: mironau on September 16, 2017, 08:54:30 PM
А есть у кого готовое решение для PHP?
Скиньте плиз скрипт.


Title: Re: Вопрос по API Yobit
Post by: aleks_raiden on September 17, 2017, 10:29:15 AM
На РНР нагуглилось два решения, разной степени готовности:

- https://github.com/pepijnolivier/laravel-yobit (https://github.com/pepijnolivier/laravel-yobit)

- https://www.snip2code.com/Snippet/861483/Yobit-API-in-PHP (https://www.snip2code.com/Snippet/861483/Yobit-API-in-PHP)


Title: Re: Вопрос по API Yobit
Post by: mironau on January 20, 2018, 02:49:38 PM
На РНР нагуглилось два решения, разной степени готовности:

- https://github.com/pepijnolivier/laravel-yobit (https://github.com/pepijnolivier/laravel-yobit)

- https://www.snip2code.com/Snippet/861483/Yobit-API-in-PHP (https://www.snip2code.com/Snippet/861483/Yobit-API-in-PHP)


А сайт подключить к API Yobit, чтобы при пополнении баланс на сайте средства зачислялись на Yobit.


Title: Re: Вопрос по API Yobit
Post by: Vovsla on March 15, 2020, 02:21:49 PM
Может кто подсказать по решению на powershell?
Сервер всегда выдает нижеуказанную ошибку. Не пойму в чем проблема в вычислении HMACSHA512 или в запросе

{"success":0,"error":"invalid key, sign, method or nonce"}


Code:
$local:Key = ''
$local:Secret = ''
$local:Nonce = [int](New-TimeSpan -Start ([DateTime]"01/01/2020 00:00") -End (Get-Date)).TotalSeconds

$local:Message = "method=getinfo&nonce=$Nonce"

$local:HMACSHA = New-Object System.Security.Cryptography.HMACSHA512
$HMACSHA.key = [Text.Encoding]::UTF8.GetBytes($Secret)
$local:Signature = $HMACSHA.ComputeHash([Text.Encoding]::UTF8.GetBytes($Message))
$Signature = [Convert]::ToBase64String($Signature)

$local:Result = Invoke-WebRequest -URI 'https://yobit.net/tapi/' -Method 'POST' -ContentType 'application/x-www-form-urlencoded' -Headers @{Sign = $Signature; Key = $Key} -TimeoutSec 20

Write-Host $Result


Title: Re: Вопрос по API Yobit
Post by: reddish111 on March 24, 2020, 10:43:05 AM
Может кто подсказать по решению на powershell?
Сервер всегда выдает нижеуказанную ошибку. Не пойму в чем проблема в вычислении HMACSHA512 или в запросе

{"success":0,"error":"invalid key, sign, method or nonce"}


Code:
$local:Key = ''
$local:Secret = ''
$local:Nonce = [int](New-TimeSpan -Start ([DateTime]"01/01/2020 00:00") -End (Get-Date)).TotalSeconds

$local:Message = "method=getinfo&nonce=$Nonce"

$local:HMACSHA = New-Object System.Security.Cryptography.HMACSHA512
$HMACSHA.key = [Text.Encoding]::UTF8.GetBytes($Secret)
$local:Signature = $HMACSHA.ComputeHash([Text.Encoding]::UTF8.GetBytes($Message))
$Signature = [Convert]::ToBase64String($Signature)

$local:Result = Invoke-WebRequest -URI 'https://yobit.net/tapi/' -Method 'POST' -ContentType 'application/x-www-form-urlencoded' -Headers @{Sign = $Signature; Key = $Key} -TimeoutSec 20

Write-Host $Result

не заданы ключи $local:Key = ''
$local:Secret = ''


Title: Re: Вопрос по API Yobit
Post by: Vovsla on May 18, 2020, 06:48:12 PM
Ну не буду же я всем свои ключи раздавать, у меня они прописаны

Может кто-нить даст рабочий пример getInfo на питоне?


Title: Re: Вопрос по API Yobit
Post by: reddish111 on May 18, 2020, 08:45:06 PM
Ну не буду же я всем свои ключи раздавать, у меня они прописаны

Может кто-нить даст рабочий пример getInfo на питоне?


может...
но я могу дать только за сто тысчь пятсот рублей  8)
можно даже кодом yobit