Перейти к содержимому

интернет-биржа

Фотография

INDX API. Програмные интерфейсы INDX

INDX API

  • Пожалуйста, авторизуйтесь для ответа.
76 ответов в данной теме

#41 Пользователь barlone (WMID 378319592221 )

  • Группа: Пользователи
  • сообщений 8
  • Регистрация: 14-сентября 15
  • Webmoney BL

Отправлено 21 февраля 2018 - 09:45

 

Как на PHP сгенерировать signature ? Для метода Balance например. Я пример с C# перевел в меру своих знаний вот так:

 

$s = $login . ';' . $password . ';' . $culture . ';' . $wmid;
$s = mb_convert_encoding($s, 'UTF-8','UCS-2LE');
$s = hash('sha256', $s);
$s = base64_encode($s);
 
но получаю все равно "Signature is not correctly generated". 

 

   $sign = base64_encode(hash('sha256',"$login;$password;$culture;$wmid",TRUE)); // третий параметр у hash - true


Сообщение отредактировал barlone: 21 февраля 2018 - 09:48

    • 0
  • Наверх

#42 Пользователь barlone (WMID 378319592221 )

  • Группа: Пользователи
  • сообщений 8
  • Регистрация: 14-сентября 15
  • Webmoney BL

Отправлено 21 февраля 2018 - 15:04

Ну вот, кажется выкатили новую версию API.

 

Посмотрел. От soap отказались. Просто HTTP POST запрос в json (не забыть в запросе выставить заголовок Content-Type: text/json, иначе не сработает). 

Запросил баланс раз 20, вроде стабильно отвечает.


Сообщение отредактировал barlone: 21 февраля 2018 - 18:34

    • 0
  • Наверх

#43 Пользователь barlone (WMID 378319592221 )

  • Группа: Пользователи
  • сообщений 8
  • Регистрация: 14-сентября 15
  • Webmoney BL

Отправлено 21 февраля 2018 - 19:44

Вот как-то так:

<?php
class indx {

 var $login;
 var $pass;
 var $wmid;
 var $culture;
 var $client;

 function indx($login, $pass, $wmid, $culture = 'en-EN')
 {

	$this->login = $login;
	$this->pass = $pass;
	$this->wmid = $wmid;
	$this->culture = $culture;
 	$this->client = curl_init('https://api.indx.ru/');
	curl_setopt($this->client, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($this->client, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($this->client, CURLOPT_SSL_VERIFYHOST, 2);
	curl_setopt($this->client, CURLOPT_SSL_VERIFYPEER, '');
	curl_setopt($this->client, CURLOPT_TIMEOUT, 15);
	curl_setopt($this->client, CURLOPT_CONNECTTIMEOUT, 15);
	curl_setopt($this->client, CURLOPT_HTTPHEADER, array('Content-Type: text/json; charset=UTF-8'));
	curl_setopt($this->client, CURLOPT_POST, 1);
 }

 function Tools()
 {
	$sign = base64_encode(hash('sha256',$this->login.';'.$this->pass.';'.$this->culture,true));
	curl_setopt($this->client, CURLOPT_URL, 'https://api.indx.ru/api/v2/trade/Tools');
	curl_setopt($this->client, CURLOPT_POSTFIELDS, '{"ApiContext":{"Login":"'.$this->login.'","Wmid":"'.$this->wmid.'","Culture":"'.$this->culture.'","Signature":"'.$sign.'"}}'); 
	return json_decode(curl_exec($this->client));
 }

 function Balance()
 {
	$sign = base64_encode(hash('sha256',$this->login.';'.$this->pass.';'.$this->culture.';'.$this->wmid,true));
	curl_setopt($this->client, CURLOPT_URL, 'https://api.indx.ru/api/v2/trade/Balance');
	curl_setopt($this->client, CURLOPT_POSTFIELDS, '{"ApiContext":{"Login":"'.$this->login.'","Wmid":"'.$this->wmid.'","Culture":"'.$this->culture.'","Signature":"'.$sign.'"}}'); 
	return json_decode(curl_exec($this->client));
 }

 function OfferMy()
 {
	$sign = base64_encode(hash('sha256',$this->login.';'.$this->pass.';'.$this->culture.';'.$this->wmid,true));
	curl_setopt($this->client, CURLOPT_URL, 'https://api.indx.ru/api/v2/trade/OfferMy');
	curl_setopt($this->client, CURLOPT_POSTFIELDS, '{"ApiContext":{"Login":"'.$this->login.'","Wmid":"'.$this->wmid.'","Culture":"'.$this->culture.'","Signature":"'.$sign.'"}}'); 
	return json_decode(curl_exec($this->client));
 }

 function OfferList($ID)
 {
	$sign = base64_encode(hash('sha256',$this->login.';'.$this->pass.';'.$this->culture.';'.$this->wmid.';'.$ID,true));
	curl_setopt($this->client, CURLOPT_URL, 'https://api.indx.ru/api/v2/trade/OfferList');
	curl_setopt($this->client, CURLOPT_POSTFIELDS, '{"ApiContext":{"Login":"'.$this->login.'","Wmid":"'.$this->wmid.'","Culture":"'.$this->culture.'","Signature":"'.$sign.'"},"Trading":{"ID":'.$ID.'}}');
	return json_decode(curl_exec($this->client));
 }

 function HistoryTrading($ID, $DateStart, $DateEnd)
 {
	$sign = base64_encode(hash('sha256',$this->login.';'.$this->pass.';'.$this->culture.';'.$this->wmid.';'.$ID.';'.$DateStart.';'.$DateEnd,true));
	curl_setopt($this->client, CURLOPT_URL, 'https://api.indx.ru/api/v2/trade/HistoryTrading');
	curl_setopt($this->client, CURLOPT_POSTFIELDS, '{"ApiContext":{"Login":"'.$this->login.'","Wmid":"'.$this->wmid.'","Culture":"'.$this->culture.'","Signature":"'.$sign.'"},"Trading":{"ID":'.$ID.',"DateStart":"'.$DateStart.'","DateEnd":"'.$DateEnd.'"}}');
	return json_decode(curl_exec($this->client));
 }

 function HistoryTransaction($ID, $DateStart, $DateEnd)
 {
	$sign = base64_encode(hash('sha256',$this->login.';'.$this->pass.';'.$this->culture.';'.$this->wmid.';'.$ID.';'.$DateStart.';'.$DateEnd,true));
	curl_setopt($this->client, CURLOPT_URL, 'https://api.indx.ru/api/v2/trade/HistoryTransaction');
	curl_setopt($this->client, CURLOPT_POSTFIELDS, '{"ApiContext":{"Login":"'.$this->login.'","Wmid":"'.$this->wmid.'","Culture":"'.$this->culture.'","Signature":"'.$sign.'"},"Trading":{"ID":'.$ID.',"DateStart":"'.$DateStart.'","DateEnd":"'.$DateEnd.'"}}');
	return json_decode(curl_exec($this->client));
 }

 function OfferAdd($ID, $Price, $IsBid /* true - покупка, false - продажа */, $Count = 1, $IsAnonymous = true)
 {
	$sign = base64_encode(hash('sha256',$this->login.';'.$this->pass.';'.$this->culture.';'.$this->wmid.';'.$ID,true));
	curl_setopt($this->client, CURLOPT_URL, 'https://api.indx.ru/api/v2/trade/OfferAdd');
	curl_setopt($this->client, CURLOPT_POSTFIELDS, '{"ApiContext":{"Login":"'.$this->login.'","Wmid":"'.$this->wmid.'","Culture":"'.$this->culture.'","Signature":"'.$sign.'"},"Offer":{"ID":'.$ID.',"Count":'.$Count.',"IsAnonymous":'.($IsAnonymous?'true':'false').',"IsBid":'.($IsBid?'true':'false').',"Price":'.$Price.'}}');
	return json_decode(curl_exec($this->client));
 }

 function OfferDelete($offerID)
 {
	$sign = base64_encode(hash('sha256',$this->login.';'.$this->pass.';'.$this->culture.';'.$this->wmid.';'.$offerID,true));
	curl_setopt($this->client, CURLOPT_URL, 'https://api.indx.ru/api/v2/trade/OfferDelete');
	curl_setopt($this->client, CURLOPT_POSTFIELDS, '{"ApiContext":{"Login":"'.$this->login.'","Wmid":"'.$this->wmid.'","Culture":"'.$this->culture.'","Signature":"'.$sign.'"},"OfferID":'.$offerID.'}'); 
	return json_decode(curl_exec($this->client));
 }

}


Сообщение отредактировал barlone: 15 мая 2018 - 07:37

    • 1
  • Наверх

#44 Пользователь barlone (WMID 378319592221 )

  • Группа: Пользователи
  • сообщений 8
  • Регистрация: 14-сентября 15
  • Webmoney BL

Отправлено 22 февраля 2018 - 08:49

Что-то странное происходит с балансом: после покупки/продажи цифра в wmz обновляется с большой задержкой, хотя число нот в портфеле - сразу. А еще потом при последовательных запросах цифра в wmz меняется туда-сюда между старым значением и обновленным.


    • 0
  • Наверх

#45 Знаток Jetix (WMID 818757153425 )

  • Группа: Пользователи
  • сообщений 506
  • Регистрация: 29-июля 17
  • Webmoney BL

Отправлено 22 февраля 2018 - 13:53

Даже ссылки на демо страницы наконец заработали.

 

Переход на чистый json - это отличный прогресс! Ещё б методов добавили (прежде всего для получения общей истории торгов по таймфреймам).

 

 

Что-то странное происходит с балансом: после покупки/продажи цифра в wmz обновляется с большой задержкой, хотя число нот в портфеле - сразу. А еще потом при последовательных запросах цифра в wmz меняется туда-сюда между старым значением и обновленным.

На самой бирже с этим тоже проблемы. Хотя на изменения баланса туда-сюда, вроде, ещё никто никогда не жаловался. Обычно просто обновляется не сразу. При чём число может обновится, но для торгов сумма ещё не доступна. И с нотами та же история.


    • 0
  • Наверх

#46 Новичок Vladisb (WMID 235159910331 )

  • Группа: Пользователи
  • сообщений 1
  • Регистрация: 25-декабря 17
  • Webmoney BL

Отправлено 23 февраля 2018 - 14:19

Клиент на API: https://drive.google...K5OxJAWE_WxGwfw


    • 0
  • Наверх

#47 Новичок Vіktorі (WMID 729732363582 )

  • Группа: Пользователи
  • сообщений 3
  • Регистрация: 22-ноября 16
  • Webmoney BL

Отправлено 03 марта 2018 - 20:27

Подскажите, пожалуйста.

Делаю запрос на https://api.indx.ru/api/v2/trade/Tools

Body: {"ApiContext":{"Login":"-----","Wmid":"-----","Culture":"ru-RU","Signature":"-------"}}

Получаю правильный ответ.

Делаю запрос с такими же значениями в ApiContext на https://api.indx.ru/...trade/OfferList

Body: {"ApiContext":{"Login":"-----","Wmid":"-----","Culture":"ru-RU","Signature":"-------"}, "Trading":{"ID":60}}

 

Но получаю:

{"code":-4,"desc":"Signature is not correctly  generated","value":null}

 

Подпись правильная, так как запрос https://api.indx.ru/api/v2/trade/Tools работает.


Сообщение отредактировал Vіktorі: 03 марта 2018 - 20:28

    • 0
  • Наверх

#48 Знаток Jetix (WMID 818757153425 )

  • Группа: Пользователи
  • сообщений 506
  • Регистрация: 29-июля 17
  • Webmoney BL

Отправлено 03 марта 2018 - 21:28

Подпись правильная, так как запрос https://api.indx.ru/api/v2/trade/Tools работает.

Это только ещё раз подтверждает, что она неправильная!

 

Внимательно читайте доки:

 

формируется из параметров: Login+ ';' + Password+ ';' + Culture

 

формируется из параметров: Login+ ';' + Password+ ';' + Culture+ ';' + Wmid + ';' + ID

 

Первое - сигнатура для Tools.

Второе - сигнатура для OfferList.


    • 1
  • Наверх

#49 Новичок Vіktorі (WMID 729732363582 )

  • Группа: Пользователи
  • сообщений 3
  • Регистрация: 22-ноября 16
  • Webmoney BL

Отправлено 04 марта 2018 - 12:48

Большое спасибо!


    • 0
  • Наверх

#50 Новичок Nikita (WMID 204002110262 )

  • Группа: Пользователи
  • сообщений 4
  • Регистрация: 04-марта 18
  • Webmoney BL

Отправлено 04 марта 2018 - 22:31

Приветствую всех.

 

Пробую сделать запрос используя библиотеку Apache HttpClient для Java:

HttpPost requestPost = new HttpPost("https://api.indx.ru/api/v2/trade/Balance");               
StringEntity params = new StringEntity("ApiContext:{\"Login\":\"---\",\"Wmid\":\"---\",\"Culture\":\"ru-RU\",\"Signature\":\"---\"}");
requestPost.addHeader("Accept", "text/json");
requestPost.setEntity(params);
HttpResponse responsePost=httpClient.execute(requestPost);

В результате приходит вот такой ответ

{"code":-999,"desc":"Invalid argument","value":null}

 

Указанный код ответа отсутствует в описании.

Строку запроса вставил как константу, полученную на стринице https://api.indx.ru/...les/balance.htm

 

Ни как не возьму в толк в чём ошибка.

 

Как быть и что делать  :(


    • 0
  • Наверх

#51 Знаток Jetix (WMID 818757153425 )

  • Группа: Пользователи
  • сообщений 506
  • Регистрация: 29-июля 17
  • Webmoney BL

Отправлено 04 марта 2018 - 23:59

Указанный код ответа отсутствует в описании.

И это не единственный, который там отсутствует.
 
 

Строку запроса вставил как константу, полученную на стринице https://api.indx.ru/...les/balance.htm

Зачем у вас там экранирование кавычек?

И не похоже, чтоб вы отправляли запрос в json.


    • 0
  • Наверх

#52 Пользователь barlone (WMID 378319592221 )

  • Группа: Пользователи
  • сообщений 8
  • Регистрация: 14-сентября 15
  • Webmoney BL

Отправлено 05 марта 2018 - 16:16

Строку запроса вставил как константу, полученную на стринице https://api.indx.ru/...les/balance.htm

 

Вы в строке запроса что-то потеряли. Она начинается с символа {


    • 1
  • Наверх

#53 Новичок Vіktorі (WMID 729732363582 )

  • Группа: Пользователи
  • сообщений 3
  • Регистрация: 22-ноября 16
  • Webmoney BL

Отправлено 05 марта 2018 - 16:22

Приветствую всех.

 

Пробую сделать запрос используя библиотеку Apache HttpClient для Java:

HttpPost requestPost = new HttpPost("https://api.indx.ru/api/v2/trade/Balance");               
StringEntity params = new StringEntity("ApiContext:{\"Login\":\"---\",\"Wmid\":\"---\",\"Culture\":\"ru-RU\",\"Signature\":\"---\"}");
requestPost.addHeader("Accept", "text/json");
requestPost.setEntity(params);
HttpResponse responsePost=httpClient.execute(requestPost);

1. Нужно добавить:

requestPost.addHeader("Content-Type", "application/json");

 

 

2.

​"ApiContext:{\"Login\":\"---\",\"Wmid\":\"---\",\"Culture\":\"ru-RU\",\"Signature\":\"---\"}"

заменить на:

"{ApiContext:{\"Login\":\"---\",\"Wmid\":\"---\",\"Culture\":\"ru-RU\",\"Signature\":\"---\"}}"
 

 


    • 1
  • Наверх

#54 Новичок Nikita (WMID 204002110262 )

  • Группа: Пользователи
  • сообщений 4
  • Регистрация: 04-марта 18
  • Webmoney BL

Отправлено 05 марта 2018 - 22:42

1. Экранирование кавычек необходимо потому что в Java строка обрамляется в двойные кавычки (в противном случае компилятор не даст собрать приложение)

2. barlone и Viktori вы совершенно правы, была пропущена левая фигурная скобка.

 

Всем большое спасибо. От сервера получен эталонный ответ.  :)


    • 0
  • Наверх

#55 Новичок Nikita (WMID 204002110262 )

  • Группа: Пользователи
  • сообщений 4
  • Регистрация: 04-марта 18
  • Webmoney BL

Отправлено 05 марта 2018 - 23:00

Ещё, вопрос, кто нибудь десериализовывал JSON данные пришедшие с сервера библиотекой Gson от гугл?

Судя по всему поля в ответе portfolio и profit будут динамическими, хотелось бы понять кто как организовывал структуру данных.


    • 0
  • Наверх

#56 Новичок Nikita (WMID 204002110262 )

  • Группа: Пользователи
  • сообщений 4
  • Регистрация: 04-марта 18
  • Webmoney BL

Отправлено 22 марта 2018 - 22:59

Сделал так:

AccountBalance accBalance=new AccountBalance();
Gson gson= new Gson();
accBalance=gson.fromJson(strJSON, AccountBalance.class);

ну и сам класс

 

@XmlRootElement
public class AccountBalance 
{
public String code;  
public String desc;
  public Value value;
  
  public static class Value 
  {
    public String wmid;
    public String nickname;
    public Balance balance;
   
    public List<Portfolio> portfolio = null;
    public List<Profit> profit = null;   
    
    public static class Balance 
    {
      public String price;
      public String wmz;
    }
    
    public static class Portfolio 
    {
      public String id;
      public String name;
      public String notes;
      public String price;
      public String type;
      public String kind;
      public String by;
    }

    public static class Profit
    {
      public String symbolid;
      public String buy;
      public String sell;
    }
  }
}

может кому-нить пригодится

 

 


    • -1
  • Наверх

#57 Пользователь Jeka (WMID 051286808169 )

  • Группа: Пользователи
  • сообщений 5
  • Регистрация: 28-января 08
  • МестоположениеМолдова
  • Webmoney BL

Отправлено 02 апреля 2018 - 16:29

Новое API опять сбоит? То по одним инструментам, то по другим котировки не доступны с ошибкой "code":-999,"desc":"Calling a Web service in an error"

У всех так?


Сообщение отредактировал Jeka: 02 апреля 2018 - 16:29

    • 0
  • Наверх

#58 Участник Inprj21 (WMID 398005513422 )

  • Группа: Пользователи
  • сообщений 20
  • Регистрация: 01-июня 16
  • Webmoney BL

Отправлено 09 апреля 2018 - 00:34

Ещё, вопрос, кто нибудь десериализовывал JSON данные пришедшие с сервера библиотекой Gson от гугл?

Судя по всему поля в ответе portfolio и profit будут динамическими, хотелось бы понять кто как организовывал структуру данных.

 

Подклассы лучше вынести за пределы AccountBalance.

 

Я использовал код из BTCETradeBot Version 1.0.5169.19956 Source , но с десериализацией массивов из json пока есть сложности. Архив с примером  классов http://dropmefiles.com/xZhwo

 

Сделал как на харборе. Код возвращал нули в переменных из-за неправильной настройки свойств { get; private set; }. (Замечание для отладки: Если класс объявлен не полностью(без портфолио, профита и тд), десериализация позволяет выбрать часть данных из строки ответа).

Есть массив:

{"items":[{"key":1,"val":"one"},{"key":2,"val":"two"},{"key":3,"val":"three"},{"key":4,"val":"four"}]}


static void Main()
{
  var afterWebRequests = "{\"items\":[{\"key\":1,\"val\":\"one\"},{\"key\":2,\"val\":\"two\"},{\"key\":3,\"val\":\"three\"},{\"key\":4,\"val\":\"four\"}]}";
  var temp = (MyArray)JsonConvert.DeserializeObject(afterWebRequests, typeof(MyArray));

  foreach(Item item in temp.items)
  {
    Console.WriteLine("Key: {0}, Value {1}", item.key, item.val);
  }
  Console.ReadKey();
}

public class MyArray
{
  public List<Item> items { get; set; }
}

public class Item
{
  public int key { get; set; }
  public string val { get; set; }
}

Сообщение отредактировал Inprj21: 11 апреля 2018 - 00:14

    • 0
  • Наверх

#59 Участник Inprj21 (WMID 398005513422 )

  • Группа: Пользователи
  • сообщений 20
  • Регистрация: 01-июня 16
  • Webmoney BL

Отправлено 09 апреля 2018 - 00:38

Собственно o["portfolio"],  ( из portfolio = Portfolio.ReadFromJObject(o["portfolio"] as JObject) ), возвращает null вместо объекта json c массивом переменных portfolio

 

Написал Терминал. Нужно API для тикера и истории торгов, иначе смысла нет.

Можно получить массив структур  с данными для свечей, но для получения истории торгов  требуется  авторизация на бирже. (Вообще-то на др биржах это открытые данные, доступные без авторизации. В ответе апи нужно убрать информацию о покупателе и продавце).

 

Есть соображения?

 

Классы IndxApi и пример их использования, проект c#, для VS2012Express и выше,  http://dropmefiles.com/wqjwT

https://files.webmon.../files/5tE6uPAY


Сообщение отредактировал Inprj21: 18 апреля 2018 - 01:33

    • 0
  • Наверх

#60 Участник Inprj21 (WMID 398005513422 )

  • Группа: Пользователи
  • сообщений 20
  • Регистрация: 01-июня 16
  • Webmoney BL

Отправлено 18 апреля 2018 - 02:26

Зачем нужен биржевой тикер? Тикер содержит краткую информацию о текущем состоянии  на бирже. Взять информацию можно из стаканов и др. запросов, но ответ сервера по стаканам содержит 2 массива аск и бид по 1070-1080 значений. Тикер и стаканы можно читать с разным интервалом или на время отключить. Когда есть график, инф. из стаканов не всегда нужна. В терминале есть возможность обновления по требованию.

Рассмотрим тикер wex.
Sell, Buy - Bid, Ask, верхние значения цены из стаканов.
Last - последнее значение цены из истории торгов, продано или куплено.
High - макисмальное значение цены за некоторый период (может быть час, сутки, неделя, месяц, нужно уточнить)
Low - минимальное значение цены за некоторый период;
Average - среднее значение цены High и Low,  Average = (High +Low)/2;
Server Time - время сервера;
Volume Current - видимо, текущий объем, объем в последней сече (хотя значения не совпадают)
Volume - биржевой объем, видимо весь объем с нарастающим итогом


Сообщение отредактировал Inprj21: 18 апреля 2018 - 02:32

    • 0
  • Наверх





Еще теги с одним или более ключевыми словами: INDX, API

1 человек читают эту тему

0 пользователей, 1 гостей, 0 анонимных