# -*- coding: utf-8 -*- import httplib import json import base64 import hashlib import time Login = '' Wmid = '' Culture = '' Password = '' ID = '' class Api(): def __init__(self): pass def public_api(self, api_name, api_params={}): time.sleep(2) header = {"Content-type": "application/json; charset=utf-8"} connection = httplib.HTTPSConnection("api.indx.ru") connection.request("POST", "/api/v2/trade/" + api_name, str(api_params), header) response = connection.getresponse() # print response.status, response.reason a = json.load(response) connection.close() return a def Balance(self): string = Login + ";" + Password + ";" + Culture + ";" + Wmid new_string = string.encode('utf-8') sig = base64.b64encode(hashlib.sha256(string.encode('utf-8')).digest()) # .decode('utf-8') params = {"ApiContext": {"Login": Login, "Wmid": Wmid, "Culture": "ru-RU", "Signature": sig}} a = Api() b = a.public_api('Balance', params) return b def Tools(self): string = Login + ";" + Password + ";" + Culture new_string = string.encode('utf-8') sig = base64.b64encode(hashlib.sha256(string.encode('utf-8')).digest()) # .decode('utf-8') params = {"ApiContext":{"Login":Login,"Wmid":Wmid,"Culture":"ru-RU","Signature":sig}} a = Api() b = a.public_api('Tools', params) return b def HistoryTrading(self): #DateStart = #DateEnd = string = Login + ';' + Password + ';' + Culture + ';' + Wmid + ';' + ID + ';' + DateStart + ';' + DateEnd new_string = string.encode('utf-8') sig = base64.b64encode(hashlib.sha256(string.encode('utf-8')).digest()) # .decode('utf-8') params = {"ApiContext": {"Login": Login, "Wmid": Wmid, "Culture": "ru-RU", "Signature": sig},"Trading":{"ID":0,"DateStart":DateStart,"DateEnd":DateEnd}} a = Api() b = a.public_api('HistoryTrading', params) return b def HistoryTransaction(self): #DateStart = #DateEnd = string = Login+ ';' + Password+ ';' + Culture + ';' + Wmid + ';' + ID + ';' + DateStart + ';' + DateEnd new_string = string.encode('utf-8') sig = base64.b64encode(hashlib.sha256(string.encode('utf-8')).digest()) # .decode('utf-8') params = {"ApiContext": {"Login": Login, "Wmid": Wmid, "Culture": "ru-RU", "Signature": sig},"Trading":{"ID":0,"DateStart":DateStart,"DateEnd":DateEnd}} a = Api() b = a.public_api('HistoryTransaction', params) return b def OfferMy(self): string = Login + ";" + Password + ";" + Culture + ";" + Wmid sig = base64.b64encode(hashlib.sha256(string.encode('utf-8')).digest()) params = {"ApiContext": {"Login": Login, "Wmid": Wmid, "Culture": "ru-RU", "Signature": sig}} a = Api() b = a.public_api('OfferMy', params) return b['value'] def OfferList(self): string = Login + ";" + Password + ";" + Culture + ";" + Wmid + ";" + ID sig = base64.b64encode(hashlib.sha256(string.encode('utf-8')).digest()) params = {"ApiContext": {"Login": Login, "Wmid": Wmid, "Culture": "ru-RU", "Signature": sig}, "Trading": {"ID": ID}} a = Api() b = a.public_api('OfferList', params) return b def OfferAdd(self, Count, IsBid, Price): string = Login + ";" + Password + ";" + Culture + ";" + Wmid + ";" + ID sig = base64.b64encode(hashlib.sha256(string.encode('utf-8')).digest()) # .decode('utf-8') params = {"ApiContext": {"Login": Login, "Wmid": Wmid, "Culture": "ru-RU", "Signature": sig}, "Offer": {"ID": ID, "Count": Count, "IsAnonymous": 'true', "IsBid": IsBid, "Price": Price}} a = Api() b = a.public_api('OfferAdd', params) return b def OfferDelete(self, OfferID): string = Login + ";" + Password + ";" + Culture + ";" + Wmid + ";" + str(OfferID) sig = base64.b64encode(hashlib.sha256(string.encode('utf-8')).digest()) # .decode('utf-8') params = {"ApiContext": {"Login": Login, "Wmid": Wmid, "Culture": "ru-RU", "Signature": sig}, "OfferId": OfferID} a = Api() b = a.public_api('OfferDelete', params) return b
#1
Пользователь
Отправлено 27 января 2020 - 20:02
#2
Пользователь
Отправлено 27 января 2020 - 20:03
Прошу сильно не пинать!!!
#4
Знаток
Отправлено 15 марта 2020 - 23:10
Все написано красиво.
Я б не сказал, что красиво, скорее, наоборот.
a = Api() b = a.public_api('Balance', params)
Вот это вообще цензурных слов нет. Додуматься инициализировать класс внутри каждого его метода ради того, чтоб вызвать другой метод этого же класса.
Там должно быть так:
result = self.public_api('Balance', params)
Да и отдельная переменная для результата смысла тоже не имеет, можно сразу:
return self.public_api('Balance', params)
sig = base64.b64encode(hashlib.sha256(string.encode('utf-8')).digest())
Вот это есть смысл вынести в отдельный метод: оно же абсолютно одинаковое для всех запросов, какой смысл многократно дублировать? Даже в примере (хоть и на другом языке) оно вынесено отдельно.
def HistoryTrading(self): #DateStart = #DateEnd = string = Login + ';' + Password + ';' + Culture + ';' + Wmid + ';' + ID + ';' + DateStart + ';' + DateEnd new_string = string.encode('utf-8') sig = base64.b64encode(hashlib.sha256(string.encode('utf-8')).digest()) # .decode('utf-8') params = {"ApiContext": {"Login": Login, "Wmid": Wmid, "Culture": "ru-RU", "Signature": sig},"Trading":{"ID":0,"DateStart":DateStart,"DateEnd":DateEnd}} a = Api() b = a.public_api('HistoryTrading', params) return b def HistoryTransaction(self): #DateStart = #DateEnd = string = Login+ ';' + Password+ ';' + Culture + ';' + Wmid + ';' + ID + ';' + DateStart + ';' + DateEnd new_string = string.encode('utf-8') sig = base64.b64encode(hashlib.sha256(string.encode('utf-8')).digest()) # .decode('utf-8') params = {"ApiContext": {"Login": Login, "Wmid": Wmid, "Culture": "ru-RU", "Signature": sig},"Trading":{"ID":0,"DateStart":DateStart,"DateEnd":DateEnd}} a = Api() b = a.public_api('HistoryTransaction', params) return b
А в этих двух методах, во-первых, будут ошибки из-за использования переменных DateStart и DateEnd без объявления (которое закомментировано), а во-вторых, они должны быть среди параметров метода, чтоб интервал можно было задавать при вызове.
Ну, и 2020 год на дворе, поддержка Python 2.7 уже прекращена, нет смысла на нём писать что-то новое. Этот код достаточно простой, чтоб работать и под третьей версией, но использование httplib этого не позволит. Вместо этой библиотеки, в принципе, лучше было использовать requests.
#6
Знаток
Отправлено 16 марта 2020 - 15:24
А что все таки с запросом:
Tick - Статистика сделок за период времени ?
Вот:
def Tick(self, Tick_ID, Tick_Kind): string = Login + ";" + Password + ";" + Culture + ";" + Wmid + ";" + Tick_ID + ";" + Tick_Kind sig = base64.b64encode(hashlib.sha256(string.encode('utf-8')).digest()) params = {"ApiContext": {"Login": Login, "Wmid": Wmid, "Culture": "ru-RU", "Signature": sig}, "Tick": {"ID": Tick_ID, "Kind": Tick_Kind}} return self.public_api('tick', params)
#7
Пользователь
Отправлено 16 марта 2020 - 15:38
Сообщение отредактировал Lik: 17 марта 2020 - 12:07
#9
Знаток
Отправлено 17 марта 2020 - 02:26
Jetix, Надеюсь к этому коде не замечаний?
Вот тут сразу три замечания:
def Tools(self): return self.api('Tools', make_params(self.AuthS),'','','','',True)
1. Похоже, что там закрывающая скобка в неправильном месте у make_params.
2. Сам вызов make_params неправильный - это же метод текущего класса, он должен вызываться через self.
3. Это же Python! Что это за куча пустых кавычек? В Python же не зря существуют именованные параметры.
Проблемы из пунктов 2 и 3 повторяются многократно.
Ещё одна проблема вот здесь:
class Ndx(self):
Если вы пишите под Python 2, то в скобках должен быть object (чтоб использовать классы нового стиля), а если под Python 3, то в скобках не должно ничего быть (если вы сознательно не наследуетесь от чего-то) и сами скобки тоже не нужны.
Я так понимаю, что вы этот код не запускали ни разу, иначе б увидели как вываливаются ошибки.
Ну, и менее критичное замечание - это формирование строки параметров. Тут, на самом деле, можно придраться ко многому.
Например, почему так:
self.Auth = Login + ";" + Password + ";" + Culture + ";" + Wmid self.AuthS = Login + ";" + Password + ";" + Culture
А не так:
self.AuthS = Login + ";" + Password + ";" + Culture self.Auth = self.AuthS + ";" + Wmid
То есть, зачем дважды формировать строку с нуля, если основная часть одинаковая?
А следующий пункт - это зачем вообще две разные переменные, если Wmid можно добавлять к строке при необходимости, как это происходит с остальными непостоянными параметрами?
И наконец лапша из if-оф при добавлении параметров. Это, в принципе, плохая практика, а для Python - совсем кощунство.
#10
Пользователь
Отправлено 17 марта 2020 - 11:39
Jetix, Надеюсь к этому коде не замечаний?
Вот тут сразу три замечания:
def Tools(self): return self.api('Tools', make_params(self.AuthS),'','','','',True)1. Похоже, что там закрывающая скобка в неправильном месте у make_params.
2. Сам вызов make_params неправильный - это же метод текущего класса, он должен вызываться через self.
3. Это же Python! Что это за куча пустых кавычек? В Python же не зря существуют именованные параметры.
Проблемы из пунктов 2 и 3 повторяются многократно.
Ещё одна проблема вот здесь:class Ndx(self):Если вы пишите под Python 2, то в скобках должен быть object (чтоб использовать классы нового стиля), а если под Python 3, то в скобках не должно ничего быть (если вы сознательно не наследуетесь от чего-то) и сами скобки тоже не нужны.
Я так понимаю, что вы этот код не запускали ни разу, иначе б увидели как вываливаются ошибки.
Ну, и менее критичное замечание - это формирование строки параметров. Тут, на самом деле, можно придраться ко многому.
Например, почему так:self.Auth = Login + ";" + Password + ";" + Culture + ";" + Wmid self.AuthS = Login + ";" + Password + ";" + CultureА не так:
self.AuthS = Login + ";" + Password + ";" + Culture self.Auth = self.AuthS + ";" + WmidТо есть, зачем дважды формировать строку с нуля, если основная часть одинаковая?
А следующий пункт - это зачем вообще две разные переменные, если Wmid можно добавлять к строке при необходимости, как это происходит с остальными непостоянными параметрами?
И наконец лапша из if-оф при добавлении параметров. Это, в принципе, плохая практика, а для Python - совсем кощунство.
Все что мог поправил. Куча if делают make_params универсальным. Более простого варианта не придумал.
С именованными параметрами пока не сталкивался - не знаю, как тут их применить)
На github создал проект:
https://github.com/l...indx_api_python
Прошу туда внести правки если заметите еще что-то)
Сообщение отредактировал Lik: 17 марта 2020 - 12:16
#11
Знаток
Отправлено 17 марта 2020 - 21:26
Куча if делают make_params универсальным. Более простого варианта не придумал.
Универсальность - это хорошо, а лапша - это плохо!
Просто передаёте дополнительные параметры в словаре, а потом джоините его содержимое и добавляете к строке. В таком случае if-оф вообще не будет (в каждом случае вызова make_params словарь уже и так будет содержать только нужные параметры).
С именованными параметрами пока не сталкивался - не знаю, как тут их применить)
У вас в коде уже есть пример:
requests.post('api.indx.ru/api/v2/trade/'+api_name, data = api_params, headers = header )
И это самые основы Python! Хотя по вашему коду очевидно, что Python точно не ваш "родной" язык.
Прошу туда внести правки если заметите еще что-то)
Мне нет смысла указывать на ошибки, на которые вам укажет интерпретатор Python! Начните наконец тестировать собственный код!
Еще теги с одним или более ключевыми словами: API
INDX →
Общие вопросы по работе на INDX →
Need API documentation linkАвтор 939976855781, 05 янв 2020 ![]() |
|
|
||
INDX →
Общие вопросы по работе на INDX →
Зачем существует API INDXАвтор Jetix, 18 апр 2018 ![]() |
|
|
||
INDX →
Общие вопросы по работе на INDX →
Не рабатает чать APIАвтор xoptov, 14 янв 2018 ![]() |
|
|
||
INDX →
Общие вопросы по работе на INDX →
INDX API. Програмные интерфейсы INDXАвтор MD, 29 июн 2013 ![]() |
|
|
0 человек читают эту тему
0 пользователей, 0 гостей, 0 анонимных