Форум программистов, компьютерный форум, киберфорум
Delphi: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/160: Рейтинг темы: голосов - 160, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 29.01.2015
Сообщений: 41

Работа с API биржи yobit

08.08.2017, 23:58. Показов 36049. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Пытаюсь написать программу для автоматизированной работы на бирже. Встрял в самом начале на этапе авторизации.





Вот код:

Delphi
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
var key, secret:string;
   url,sign:string;
   HTTP:THttpSend;
   list:TStringList;
   nonce:string;
begin
key:='///;
secret:='///';
nonce:=inttostr(DateTimeToUnix(now));
 
url:='https://yobit.net/tapi/';
sign:=SHA512DigestToHex(CalcHMAC_SHA512(secret, nonce));
 
HTTP:=THttpSend.Create;
HTTP.Headers.Add('key:'+key);
HTTP.Headers.Add('sign:'+sign);
HTTP.HTTPMethod('GET',url);
list:=TStringList.Create;
list.LoadFromStream(HTTP.Document);
memo1.Lines.Add(inttostr(HTTP.ResultCode)+#13#10+list.Text);
list.Free;
HTTP.Free;
 
 
end;
получаю ошибку HTTP 500


А вот информация по API с сайта


Адрес для отправки запросов Trade API: https://yobit.net/tapi/
Для каждого запроса нужна аутентификация.
Все ответы сервер отдаёт в формате JSON
Пример успешного ответа сервера:
{"success":1,"return":{ответ}}
Пример ответа, информирующего об ошибке:
{"success":0,"error":"ошибка"}
Аутентификация
Каждый запрос Trade API должен пройти аутентификацию.
Аутентификация происходит способом отправки следующих HTTP-заголовков:
Key - API-ключ, пример: FAF816D16FFDFBD1D46EEF5D5B10D8A2
Sign - цифровая подпись, POST-параметры (?param0=val0 & ...& nonce=1) подписанные секретным ключом с помощью HMAC-SHA512
Параметр nonce (минимум 1, максимум 2147483646) при каждом новом запросе должен быть больше значения из предыдущего запроса.
Для обнуления nonce необходимо создать новый ключ.



Подскажите пожалуйста, что я делаю не так?

Добавлено через 14 часов 50 минут
А если посылать только заголовки

Delphi
1
2
HTTP.Headers.Add('key:'+key);
HTTP.Headers.Add('sign:'+sign);
то в ответ, в мемо приходит 0.

Ни как не получается получить
{"success":1,"return":{ответ}}
или хотя бы
{"success":0,"error":"ошибка"}

Возможно неверно делаю вывод ответа?

Добавлено через 4 минуты
и еще не совсем понятно с параметром nonce, возможно из за него неверно формируется подпись?

Добавлено через 14 часов 24 минуты
Пошел другим путем, через INDY

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
key:='';
secret:='';
 
nonce := FormatDateTime('yyyymmddhhnnsszzz',now);
url:='https://yobit.net/tapi/?';
 
 
IdHTTP1.Request.UserAgent:= 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
post := TStringStream.Create;
post.WriteString('getInfo&'+ nonce);
sign:=SHA512DigestToHex(CalcHMAC_SHA512(secret, post.DataString));
IdHttp1.Request.CustomHeaders.FoldLines := false;
idhttp1.Request.CustomHeaders.Values['Content-Type']:='application/x-www-form-urlencoded';
idhttp1.Request.CustomHeaders.Values['Key']:=Key;
idhttp1.Request.CustomHeaders.Values['Sign']:=sign;
 
Memo1.Text:= idhttp1.POST(URL, post);
Получаю в ответ: {"success":0,"error":"invalid key, sign, method or nonce"}

Может с подписью что не так? Подскажите хоть что - нибудь))
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.08.2017, 23:58
Ответы с готовыми решениями:

TIdHTTP и API биржи YObit
На бирже используется защита от ddos cloudflare.com При попытке открыть, например, следующий url: ...

Работа с API биржи hitbtc.com synapse https
Доброго времени суток! Необходимо научиться, работать с hitbtc.com через их api. https://api.hitbtc.com/ а именно, узнавать балланс,...

Yobit банит (API)!
При работе этой программы Yobit банит за большое число запросов, плохой Yobit . Програма выдает 300 пар из 8000, потом пишет ошибку. Как...

35
5949 / 4525 / 1094
Регистрация: 29.08.2013
Сообщений: 28,105
Записей в блоге: 3
09.08.2017, 08:13
может дело в https?
0
0 / 0 / 0
Регистрация: 29.01.2015
Сообщений: 41
11.08.2017, 21:43  [ТС]
qwertehok, запросы, не требующие авторизации проходят без проблем

Добавлено через 6 минут
Нашел на просторах инета вроде как работающий код на С#.

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
  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));
                    }
                }
            }
 
        }


Попытался переделать его на делфи:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
IdHTTP1.Request.UserAgent:= 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
post := TStringStream.Create;
//post.WriteString('Key':=key+'Sign':=sign);
 
sign:=SHA512DigestToHex(CalcHMAC_SHA512(secret, 'method=TradeHistory&pair=ltc_btc&nonce='));
 
//Memo1.Text:= idhttp1.Post('https://yobit.net/tapi/?method=TradeHistory&pair=ltc_btc&nonce'+nonce);
   parameters:= 'method=getInfo&nonce' + nonce;
 IdHttp1.Request.URL:= 'https://yobit.net/tapi/' ;
  IdHttp1.Request.Method:='POST';
    IdHttp1.Request.ContentType:='application/x-www-form-urlencoded';
     idhttp1.Request.CustomHeaders.Addvalue('Key',key);
idhttp1.Request.CustomHeaders.AddValue('Sign', sign);
 idhttp1.Request.ContentLength:=parameters.length;
 
 
 
 
 
//Memo1.Text:= idhttp1.Post('https://yobit.net/tapi/?method=TradeHistory&pair=ltc_btc&nonce'+nonce);
Конец кода, а именно отправку не разобрался как сделать... Может кто подскажет, основываясь на коде на шарпе, как доделать на делфи?))
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
14.08.2017, 08:13
delphi то хоть какая?
0
0 / 0 / 0
Регистрация: 29.01.2015
Сообщений: 41
14.08.2017, 09:45  [ТС]
krapotkin, XE6
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
14.08.2017, 11:14
Тогда indy, да
В свежих есть нативный THttpClient
0
0 / 0 / 0
Регистрация: 29.01.2015
Сообщений: 41
15.08.2017, 01:01  [ТС]
Очередная попытка...

Delphi
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
procedure TForm1.Button4Click(Sender: TObject);
var
  params: TStringList;
  Response: TStringStream;
  key, secret:string;
   url,sign,nonce:string;
begin
  try
    params := TStringList.Create;
    Response := TStringStream.Create('');
 
    IdHTTP1.Request.UserAgent:= 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
     key:='8E415CE2CEEBF65FBF9EBA9588EC8A54';
     secret:='881d751985ba0aa3c2600d4120709649';
 
nonce := FormatDateTime('yyyymmddhhnnsszzz',now);
url:='https://yobit.net/tapi/';
params.Add('&nonce='+nonce);
    sign:=SHA512DigestToHex(CalcHMAC_SHA512(secret, url));
  idhttp1.Request.ContentType:='application/x-www-form-urlencoded';
idhttp1.Request.CustomHeaders.Addvalue('Key',key);
idhttp1.Request.CustomHeaders.AddValue('Sign', sign);
    IdHTTP1.Post(url,params,response);
    Showmessage(Response.DataString);
  finally
    begin
      Response.Free;
      params.Free;
    end;
  end;
end;
Все равно что то не так получается, ответ{"success":0,"error":"invalid key, sign, method or nonce"}
в чем может быть дело?
0
5949 / 4525 / 1094
Регистрация: 29.08.2013
Сообщений: 28,105
Записей в блоге: 3
15.08.2017, 07:01
какие невизуальные компоненты у тебя на форме?
0
0 / 0 / 0
Регистрация: 29.01.2015
Сообщений: 41
15.08.2017, 07:10  [ТС]
qwertehok, Tidhttp и IdSSLIOHandlerSocketOpenSSL
0
5949 / 4525 / 1094
Регистрация: 29.08.2013
Сообщений: 28,105
Записей в блоге: 3
15.08.2017, 08:23
1 закинь еще для cookies компонент
2 построй запрос в мемо и попробуй его ввести в браузер
или наоборот - сначала в браузере сделай что бы работало, а потом переноси в Delphi

Добавлено через 50 минут
и посмотри что у тебя с nonce

Цитата Сообщение от Sergey1990 Посмотреть сообщение
FormatDateTime('yyyymmddhhnnsszzz',now);
не nn, наверное, а mm
на сервере написано
Параметр nonce (минимум 1, максимум 2147483646) при каждом новом запросе должен быть больше значения из предыдущего запроса.
максимум 2147483646
а у тебя 20140815082359999
0
0 / 0 / 0
Регистрация: 29.01.2015
Сообщений: 41
15.08.2017, 09:50  [ТС]
qwertehok, Спасибо, буду пробовать сначала через браузер. А как передать заголовки через браузер? https://yobit.net/tapi/ получается {"success":0,"error":"invalid key, sign, method or nonce"} что вполне логично так как заголовки не передаются
0
0 / 0 / 0
Регистрация: 29.09.2017
Сообщений: 1
29.09.2017, 12:00
Привет. Получилось разобраться ?
0
0 / 0 / 0
Регистрация: 18.10.2017
Сообщений: 4
18.10.2017, 03:00
Цитата Сообщение от Sergey1990 Посмотреть сообщение
url:='https://yobit.net/tapi/'; params.Add('&nonce='+nonce); sign:=SHA512DigestToHex(CalcHMAC_SHA512( secret, url));
Если еще актуально, то хеш надо брать от параметров запроса, т.е строки типа 'method=getInfo&nonce=12345', а не от url.
0
0 / 0 / 0
Регистрация: 09.06.2015
Сообщений: 2
26.10.2017, 10:58
У меня вот так работает

Delphi
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
function TForm1.api_query(api_opt: TStringList): AnsiString;
var
  param, nonce: String;
  sign: AnsiString;
  http_req: TIdHTTP;
  i: Integer;
begin
  result := '';
  if api_opt.Count > 0 then
  begin
    param := api_opt[0];
 
    if api_opt.Count > 1 then
      for i := 1 to api_opt.Count - 1 do
        param := param + '&' + api_opt[i];
 
    nonce := 'nonce=' + IntToStr(DateTimeToUnix(Now));
    api_opt.add(nonce);
 
    sign := SHA512DigestToHex(CalcHMAC_SHA512(api_sec, param + '&' + nonce));
 
    http_req := TIdHTTP.Create(self);
    http_req.ReadTimeout := 7000;
    http_req.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
    http_req.Request.CustomHeaders.AddValue('Key', api_key);
    http_req.Request.CustomHeaders.AddValue('Sign', sign);
 
    try
      result := http_req.post(url_tapi, api_opt);
      if CheckBox4.Checked then
        Memo1.Lines.Insert(0, ' -> RES: ' + result);
    except
      on pe: EIdHTTPProtocolException do
        Memo1.Lines.Insert(0, ' -> api error : ' + TimeToStr(Time) + ' ' + pe.Message);
      on e: Exception do
        Memo1.Lines.Insert(0, ' -> api error : ' + TimeToStr(Time) + ' ' + e.Message);
    end;
    http_req.Free;
  end;
end;
Вызов функции
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
var
  tr: TStringList;
begin
  tr := TStringList.Create;
  // tr.Add('method=getInfo');
  tr.add('method=Trade');
  tr.add('pair=btc_usd');
  tr.add('type=sell');
  tr.add('rate=5000');
  tr.add('amount=0.002');
  api_query(tr);
  tr.Free;
end;
0
0 / 0 / 0
Регистрация: 27.10.2017
Сообщений: 7
27.10.2017, 14:55
kosy13,
Практически один в один скопировал ваш код.
В результате получаю {"success":0,"error":"invalid sign"}
Этот код у вас работает именно с yobit.net?
Какую версию модуля cHash.pas используете?
Бьюсь второй день - "invalid sign" и все тут ((
0
0 / 0 / 0
Регистрация: 09.06.2015
Сообщений: 2
02.11.2017, 18:23
вот такой
Вложения
Тип файла: zip cHash.zip (24.0 Кб, 77 просмотров)
0
0 / 0 / 0
Регистрация: 10.03.2016
Сообщений: 1
17.11.2017, 13:25
Победили проблему-то?
0
844 / 739 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
03.12.2017, 23:44
kosy13, А ордер получается программно установить?
0
0 / 0 / 0
Регистрация: 18.10.2017
Сообщений: 4
07.12.2017, 00:20
NIKOLAYY, У меня так, все работает.
Delphi
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
function TYoBitTradeAPI.GetAPIMethod(key, sicretkey: string;
  parametrs: tstringlist): string;
var
  param, sign: string;
  postpar: tstringlist;
  i: integer;
begin
  param := '';
  for i := 0 to parametrs.Count - 2 do
    param := param + parametrs[i] + '&';
  param := param + parametrs[parametrs.Count - 1];
  // postpar := tstringlist.create;
  // param := 'method=' + method + '&nonce=' + inttostr(nonce);
  sign := GetHMACSha1(param, sicretkey);
  // postpar.Add('key='+key);
  // postpar.Add('sign='+sign);
  http.Request.CustomHeaders.FoldLines := false;
  // http.Request.CustomHeaders.Values['Content-Type']:='application/x-www-form-urlencoded';
  http.Request.CustomHeaders.Values['Key'] := key;
  http.Request.CustomHeaders.Values['Sign'] := sign;
  http.Request.ContentLength := length(param);
  http.HandleRedirects := true;
  try
    result := http.Post('https://yobit.net/tapi/', parametrs);
  except
    exit;
  end;
end;
 
function TYoBitTradeAPI.GetHMACSha1(Input, MyKey: string): String;
var
  B: TIdBytes;
  Sha: TIdHMACSHA512;
  AText: string;
begin
  Sha := TIdHMACSHA512.create;
  try
    Sha.key := ToBytes(MyKey);
    B := Sha.HashValue(ToBytes(Input));
    AText := tohex(B);
    result := LowerCase(AText);
  finally
    Sha.Free;
  end;
end;
0
844 / 739 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
07.12.2017, 04:45
tetrisarena,
О норм! Сча попробую чуть позже отпишу че там! ))

Добавлено через 9 минут
tetrisarena,
Да не как бы у меня не заработало..
А можеш дать исходники или сказать какие библиотеки подключал ну и прочее?
Но лучше исходничок в сборе ))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.12.2017, 04:45
Помогаю со студенческими работами здесь

Как работать с YoBit API?
Есть API, которые описаны в разделе "Trade API" Никак не могу сделать запрос, все время сервер возвращает ошибку. Подскажите, что не...

Непонятный ответ API биржи poloniex
Здравствуйте! Собственно, сам код: import urllib import urllib.request import json import time import hmac,hashlib ...

Оператор условия не работает (API Биржи cryptopia)
Строка if : не работает как задумовалось Пары со значениям Volume=0 не нужны, но они серомно вылазят как бы я не делал. import...

Работа с vk.api
Здравствуйте. Появилась задача для определённого пользователя вывести список друзей, с указанием пола, города, и статусе(онлайн). ...

Работа c VK api
Всем привет! Решил написать сюда, не могу понять в чем проблема. Пишу код для обращения к вк апи. Запускаю на компьютере, выдает ошибку 28....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru