Подключение к API биржи с 1С

1. downloadpascal 14.12.17 11:07 Сейчас в теме
Здравствуйте, хочу сделать подключение с 1с к API биржи exmo. вот ссылка на АПИ, https://exmo.me/ru/api#/excode_api

Пишут для доступа к данному API требуется авторизация и необходимо использовать POST метод.

URL — необходимо использовать следующий адрес https://api.exmo.com/v1/{api_name} где api_name - это наименование API метода

Авторизация осуществляется с помощью отправки на сервер следующих заголовков:

Key — Публичный ключ, его нужно взять настройках профиля пользователя
(пример: K-7cc97c89aed2a2fd9ed7792d48d63f65800c447b)

Sign — POST данные (param=val¶m1=val1), подписанные секретным ключом методом HMAC-SHA512, секретный ключ также нужно брать в настройках профиля пользователя


Мой код:

apikey     = "K-565a352c53b772281ca10a9b9652114ea62c06c0";
apisecret = "S-3855d9a2915e4793e3fc5410a06b53e547263335 12";	
	
ИмяФайлаВх  = ПолучитьИмяВременногоФайла();
ИмяФайлаИсх = ПолучитьИмяВременногоФайла();
	
	
Сигнатура = HMAC_SHA512(apisecret, ПостСообщение);  // функцию где-то нарыл в инете
	
ЗаголовокHTTP = Новый Соответствие(); 
ЗаголовокHTTP.Вставить("Sign", Сигнатура); 
ЗаголовокHTTP.Вставить("Key", apikey); 
ЗаголовокHTTP.Вставить("Content-Type", "application/x-www-form-urlencoded;"); 
	
	
 SSL   = Новый ЗащищенноеСоединениеOpenSSL;
 HTTP = Новый HTTPСоединение("api.exmo.com/v1/user_info",,,,,5,SSL);   

// вот здесь не понятно, нужно ли писать просто имя "api.exmo.com" или "api.exmo.com/v1/user_info", не понятно куда нужно впихнуть имя метода user_info к примеру

 Ответ = HTTP.ОтправитьДляОбработки(ИмяФайлаИсх, "/tapi", ИмяФайлаВх, ЗаголовокHTTP);
Показать


При подключении выдает что не подключился...


Вот небольшой набросок попытки подключения к АПИ, подскажите пожалуйста, что я делаю не так, и куда копать..

Заранее спасибо!
По теме из базы знаний
Найденные решения
8. downloadpascal 10.01.18 05:55 Сейчас в теме
(7)
Да получилось, вот код


Функция ВызовФункцииAPIЭксмо(СЗ)
	
	Результат     = "";
	
	apikey        = "";
	apisecret     = "";		
	ИмяФайлаВх    = ПолучитьИмяВременногоФайла() + ".bot";
	ИмяФайлаИсх   = ПолучитьИмяВременногоФайла() + ".bot";	
	ПостСообщение = "method=user_info&nonce="+ПолучитьНонс();
	ПостСообщение = "nonce="+ПолучитьНонс();

	Если ТипЗнч(СЗ) = Тип("Строка") Тогда
		ПостСообщение = ПостСообщение + "&" + СЗ;
	Иначе	
	
		Для Каждого ЭлСЗ Из СЗ Цикл
			ПостСообщение = ПостСообщение + "&" + ЭлСЗ.Представление + "=" + ЭлСЗ.Значение; 	
		КонецЦикла;	
		
	КонецЕсли;
	
	
	БинПостСообщение = "";	
	Сигнатура 	   	 = HMAC_SHA512(apisecret, ПостСообщение);	
	ЗаголовокHTTP    = Новый Соответствие();
    ЗаголовокHTTP.Вставить("Sign", Сигнатура);
    ЗаголовокHTTP.Вставить("Key", apikey);
    ЗаголовокHTTP.Вставить("Content-Type", "application/x-www-form-urlencoded");
	
	Текст = Новый ЗаписьТекста(ИмяФайлаВх, КодировкаТекста.ANSI, "");
    Текст.ЗаписатьСтроку(ПостСообщение);
    Текст.Закрыть();
    SSL   = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
	
	Попытка
        HTTP = Новый HTTPСоединение("api.exmo.me",,,,,, SSL);
        HTTP.ОтправитьДляОбработки(ИмяФайлаВх, "v1/"+СЗ, ИмяФайлаИсх, ЗаголовокHTTP);
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
	
	
	// работает как на сервере, так и на клиенте
    Текст = Новый ЧтениеТекста(
        ИмяФайлаИсх, // имя
        КодировкаТекста.ANSI, // кодировка
        Символы.ПС, // разделитель строк (необ.)
        ,
        Истина // монопольный режим (необ.)
    );
 
    // читаем пока есть что читать
    Пока Истина Цикл
        Строка = Текст.ПрочитатьСтроку();
        Если Строка = Неопределено Тогда
            Прервать;
        Иначе
            Результат = Строка;
        КонецЕсли;
    КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

Показать



Процедура БалансЭксмоНажатие(Элемент)
	
	Результат = ВызовФункцииAPIЭксмо("user_info");
	Сообщить(Результат);
	
КонецПроцедуры

Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Swetlana 26 14.12.17 11:49 Сейчас в теме
conn.request("POST", "/" + self.API_VERSION + "/" + api_method, params, headers) пример для pyton
3. Aitbay 14.12.17 12:28 Сейчас в теме
Вот пример

HTTPСоединение = Новый HTTPСоединение("АдресСервера",443,"Пользователь","Пароль",,,Новый ЗащищенноеСоединениеOpenSSL( неопределено, неопределено ));				
HTTPЗапрос     = Новый HTTPЗапрос("ПроцедураВыполнения");
HTTPЗапрос.Заголовки.Вставить("Content-type", "application/json");

DocParam = Новый Структура;
DocParam.Вставить("Ключ" , Значение);

ЗаписьJSON      = Новый ЗаписьJSON;
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(ПредопределенноеЗначение("ПереносСтрокJSON.Нет"));
	
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписи);
	
НастройкиСериализации = Новый НастройкиСериализацииJSON;
НастройкиСериализации.ВариантЗаписиДаты      = ПредопределенноеЗначение("ВариантЗаписиДатыJSON.ЛокальнаяДата");
НастройкиСериализации.ФорматСериализацииДаты = ПредопределенноеЗначение("ФорматДатыJSON.ISO");
	
ЗаписатьJSON(ЗаписьJSON, DocParam, НастройкиСериализации, "ПреобразованиеЗначений");
	
HTTPЗапрос.УстановитьТелоИзСтроки(ЗаписьJSON.Закрыть(),"UTF-8", ИспользованиеByteOrderMark.НеИспользовать);
		
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
СтрокаОтвета = HTTPОтвет.ПолучитьТелоКакСтроку();
Показать
4. downloadpascal 15.12.17 03:03 Сейчас в теме
(3) Откуда пример?

DocParam = Новый Структура;
DocParam.Вставить("Ключ" , Значение);

здесь что должно быть?
5. downloadpascal 15.12.17 05:28 Сейчас в теме

СЗ = "user_info";
	
	apikey    = "***";
	apisecret = "***";	
	
	ИмяФайлаВх  = ПолучитьИмяВременногоФайла();
	ИмяФайлаИсх = ПолучитьИмяВременногоФайла();
	
	ПостСообщение = "nonce="+ПолучитьНонс();
	
	Если ТипЗнч(СЗ) = Тип("Строка") Тогда
		
		ПостСообщение = ПостСообщение + "&" + СЗ; 	
		
	Иначе	
	
		Для Каждого ЭлСЗ Из СЗ Цикл
		
			ПостСообщение = ПостСообщение + "&" + ЭлСЗ.Представление + "=" + ЭлСЗ.Значение; 	
		
		КонецЦикла;	
	
	КонецЕсли;
	
	БинПостСообщение = "";
	
	Сигнатура 	   = HMAC_SHA512(apisecret, ПостСообщение);
	ДлинаСообщения = ЗаписатьСтрокуВФайлUTF8безBOM(ИмяФайлаИсх, ПостСообщение, БинПостСообщение);
	
	
	HTTPЗапрос = Новый HTTPЗапрос;
	Заголовки  = Новый Соответствие;
	    
	HTTPЗапрос.Заголовки.Вставить("Sign", Сигнатура);
	HTTPЗапрос.Заголовки.Вставить("Key" , apikey);
	
	SSL 	   = Новый ЗащищенноеСоединениеOpenSSL;
    HTTP 	   = Новый HTTPСоединение("api.exmo.me",,,,,,SSL);
	
	Ответ = HTTP.ОтправитьДляОбработки(HTTPЗапрос);
	
	СтрокаОтвета = Ответ.ПолучитьТелоКакСтроку();



Показать


Уже подключается оказывается api.exmo.com был заблочен по решению суда, сюда api.exmo.me подключается..
но выдает такой текст:

<h2>EXMO.COM API SERVER</h2>
Please read API documentation https://exmo.com/api_doc

походу косяк где-то здесь
Sign — POST данные (param=valm1=val1), подписанные секретным ключом методом HMAC-SHA512, секретный ключ также нужно брать в настройках профиля пользователя

как-то надо хитро передавать
6. Aitbay 15.12.17 07:00 Сейчас в теме
пробовал через post менеджеры сначала отработать?
например postman для хрома
и у тебя в коде где вызываются и какой метод ? trades, order_book , ticker , pair_settings, currency
для некоторых методов есть параметры pair, limit для некоторых они отсутствуют
и подпись должна быть что то вроде
SSL = Новый ЗащищенноеСоединениеOpenSSL(НовыйСертификатКлиентаФайл("C:\c\User1614.p12",ПарольСер));
технически при вызове HTTP.ОтправитьДляОбработки(HTTPЗапрос);
платформа сама подпишет запрос и не нужно HMAC_SHA512(apisecret, ПостСообщение);
7. HiGHT 09.01.18 12:02 Сейчас в теме
Ну как, получилось?
Я натыкаюсь на ту же ошибку.
<h2>EXMO.COM API SERVER</h2>
Please read API documentation https://exmo.com/api_doc
8. downloadpascal 10.01.18 05:55 Сейчас в теме
(7)
Да получилось, вот код


Функция ВызовФункцииAPIЭксмо(СЗ)
	
	Результат     = "";
	
	apikey        = "";
	apisecret     = "";		
	ИмяФайлаВх    = ПолучитьИмяВременногоФайла() + ".bot";
	ИмяФайлаИсх   = ПолучитьИмяВременногоФайла() + ".bot";	
	ПостСообщение = "method=user_info&nonce="+ПолучитьНонс();
	ПостСообщение = "nonce="+ПолучитьНонс();

	Если ТипЗнч(СЗ) = Тип("Строка") Тогда
		ПостСообщение = ПостСообщение + "&" + СЗ;
	Иначе	
	
		Для Каждого ЭлСЗ Из СЗ Цикл
			ПостСообщение = ПостСообщение + "&" + ЭлСЗ.Представление + "=" + ЭлСЗ.Значение; 	
		КонецЦикла;	
		
	КонецЕсли;
	
	
	БинПостСообщение = "";	
	Сигнатура 	   	 = HMAC_SHA512(apisecret, ПостСообщение);	
	ЗаголовокHTTP    = Новый Соответствие();
    ЗаголовокHTTP.Вставить("Sign", Сигнатура);
    ЗаголовокHTTP.Вставить("Key", apikey);
    ЗаголовокHTTP.Вставить("Content-Type", "application/x-www-form-urlencoded");
	
	Текст = Новый ЗаписьТекста(ИмяФайлаВх, КодировкаТекста.ANSI, "");
    Текст.ЗаписатьСтроку(ПостСообщение);
    Текст.Закрыть();
    SSL   = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
	
	Попытка
        HTTP = Новый HTTPСоединение("api.exmo.me",,,,,, SSL);
        HTTP.ОтправитьДляОбработки(ИмяФайлаВх, "v1/"+СЗ, ИмяФайлаИсх, ЗаголовокHTTP);
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
	
	
	// работает как на сервере, так и на клиенте
    Текст = Новый ЧтениеТекста(
        ИмяФайлаИсх, // имя
        КодировкаТекста.ANSI, // кодировка
        Символы.ПС, // разделитель строк (необ.)
        ,
        Истина // монопольный режим (необ.)
    );
 
    // читаем пока есть что читать
    Пока Истина Цикл
        Строка = Текст.ПрочитатьСтроку();
        Если Строка = Неопределено Тогда
            Прервать;
        Иначе
            Результат = Строка;
        КонецЕсли;
    КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

Показать



Процедура БалансЭксмоНажатие(Элемент)
	
	Результат = ВызовФункцииAPIЭксмо("user_info");
	Сообщить(Результат);
	
КонецПроцедуры

Показать
22. user933538 24.08.19 15:24 Сейчас в теме
(8) Немного не понятно что в этом коде значит ПолучитьНонс() и зачем два раза задавать переменную ПостСообщение или это для примера?
9. downloadpascal 10.01.18 05:56 Сейчас в теме
(7) но что-то не хочу на этой бирже, плохие отзывы, может попробуем на бинанс подключиться? там стоп-лоссы есть
10. downloadpascal 10.01.18 05:58 Сейчас в теме
там при передаче сигнатуры выходит такая ошибка:
Сигнатура: 22cc6b2e0cd00f701d9d5510a6e5d4a6a67f9e5a61d7f8e4a203d3ae81b9­ae2b
{"code":-1100,"msg":"Illegal characters found in parameter 'signature'; legal range is '^[A-Fa-f0-9]{64}$'."}

вроде как нету ее, от A-F, от 0-9, 64 символа...
но там get запрос, может быть что-то с кодировкой при передаче запроса?

Может кто знает?
12. user597294 20.01.18 23:58 Сейчас в теме
Добрый день. Можете описать функцию:
Сигнатура = HMAC_SHA512(apisecret, ПостСообщение); // функцию где-то нарыл в инете
13. downloadpascal 22.01.18 10:08 Сейчас в теме
(12)


Функция HMAC_SHA512(СекретныйКлюч, Строка) Экспорт
    Текст = Новый COMОбъект("System.Text.UTF8Encoding");
    Криптография = Новый COMОбъект("System.Security.Cryptography.HMACSHA512");
    Криптография.Key = Текст.GetBytes_4(СекретныйКлюч);
    ХешБайт = Криптография.ComputeHash_2(Текст.GetBytes_4(Строка)).Выгрузить();
    HTML = Новый COMОбъект("htmlfile");
    HTML.Open("text/html");
    HTML.Write("<sc ript>ПреобразоватьСтроку = function(x,y){return x.toString(y?y:16)}</sc ript>");
    ЯваСкрипт = HTML.documentElement.document.Script;
    Хеш = "";
    Для Каждого Байт Из ХешБайт Цикл
        Символ = ЯваСкрипт.ПреобразоватьСтроку(Байт);
        Хеш = Хеш + ?(СтрДлина(Символ) = 2, Символ, "0"+Символ);
    КонецЦикла;
    Возврат Хеш;
КонецФункции


Показать
VladimirMezentsev; +1 Ответить
15. SmAlex 1 22.01.18 11:55 Сейчас в теме
(13) Функция HMAC_SHA512:
Символ = ЯваСкрипт.ПреобразоватьСтроку(Байт);
Ругается "Поле объекта не обнаружено ПреобразоватьСтроку"
14. downloadpascal 22.01.18 10:09 Сейчас в теме
(12) АПИ простой, лучше на бинансе, там торги больше,
у меня бот уже торгует, вроде пока ниче, норм...
16. SmAlex 1 22.01.18 21:26 Сейчас в теме
(14) Подскажите! Что может быть? Куда копать? Функция HMAC_SHA512 не запускается:

{ВнешняяОбработка.ExmoAPIBot.Форма.Форма.Форма(93)}: Метод объекта не обнаружен (ПреобразоватьСтроку)
Символ = ЯваСкрипт.ПреобразоватьСтроку(Байт);
17. downloadpascal 23.01.18 05:39 Сейчас в теме
(16) может быть где скрипт пробел...скорее всего, сделайте как на скрине
Прикрепленные файлы:
18. SmAlex 1 23.01.18 14:19 Сейчас в теме
(17) Действительно, пробел проглядел, спасибо, работает!
Я правда, другой вариант нашел:

Символ =DecToHex(Байт);

Функция DecToHex(Знач _Число)
	
	База = 16;
	Результат = "";
	
	Пока _Число <> 0 Цикл
		Поз =_Число % База;
		Результат = Сред("0123456789ABCDEF", Поз + 1, 1) + Результат;
		_Число = Цел(_Число / База);
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции
Показать

Но первый вариант лучше. Буду его использовать.
Если не секрет, как торговля идет? Стоит над ботом мучиться?
19. downloadpascal 24.01.18 07:58 Сейчас в теме
(18) пока вроде нормально, потихоньку по 10% делает, но есть риски...я хочу на арбиртраж настроить, между несколькими биржами...тогда безрисково на разнице курсов
20. downloadpascal 24.01.18 08:00 Сейчас в теме
(18) бот не сложный, главное подключиться к нему, а так просто, я на бинансе сделал, там sha256, и немного по другому, get запросами...
хочу на эксмо тоже подключиться... и между биржами гонять
21. akodkin 04.02.19 21:48 Сейчас в теме
(20)
Добрый день!
Подскажите пожалуйста, удалось подключиться к EXMO и баланс вернуть?
У меня в результате приведенного кода возникает ошибка:
Error 40005: Authorization error, Incorrect signature.
Помогите, куда копать? В результате успеха обещаю вознаграждение.
23. user1497158 04.12.20 23:01 Сейчас в теме
Добрый день!
Подскажите пож-та как создается ордер на покупку/продажу.
Баланс выводит. получаю баланс приблизительно так -
Сообщить(ВызовФункцииAPIЭксмо("user_info")["balances"]["USD"]);
Как правильно создать ордер, как правильно передать параметры в функцию?
ВызовФункцииAPIЭксмо("order_create"), но помимо "order_create" нужно еще передать массив
"pair"=>"BTC_USD",
"quantity"=>3,
"price"=>100,
"type"=>"buy"

этот момент пока непонятен.
Спасибо заранее.
24. user1497158 06.12.20 17:07 Сейчас в теме
(23)
Добрый день!
Подскажите пож-та как создается ордер на покупку/продажу.
Баланс выводит. получаю баланс приблизительно так -
Сообщить(ВызовФункцииAPIЭксмо("user_info")["balances"]["USD"]);
Как правильно создать ордер, как правильно передать параметры в функцию?
ВызовФункцииAPIЭксмо("order_create"), но помимо "order_create" нужно еще передать массив
"pair"=>"BTC_USD",
"quantity"=>3,
"price"=>100,
"type"=>"buy"
этот момент пока непонятен.
Спасибо заранее.


В общем, сам спросил и сам решил проблему)
немного переписал функцию ВызовФункцииAPIЭксмо. теперь вызов выглядит так ВызовФункцииAPIЭксмо(API_metod, API_param)
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот