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

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

Фотография

Пример API Python 2.7.17

API

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

#1 Пользователь Dmitrid (WMID 519046945291 )

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

Отправлено 27 Январь 2020 - 20:02

# -*- 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

    • 0
  • Наверх

#2 Пользователь Dmitrid (WMID 519046945291 )

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

Отправлено 27 Январь 2020 - 20:03

Прошу сильно не пинать!!!


    • 0
  • Наверх

#3 Пользователь Lik (WMID 162361304700 )

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

Отправлено 11 Март 2020 - 14:24

Добрый день.

Все написано красиво.

Только хорошо бы добавить запрос:

Tick - Статистика сделок за период времени.


    • 0
  • Наверх

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

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

Отправлено 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.


    • 0
  • Наверх

#5 Пользователь Lik (WMID 162361304700 )

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

Отправлено 16 Март 2020 - 13:50

Спасибо. Замечание все по существу.

А что все таки с запросом:

Tick - Статистика сделок за период времени ?


    • 0
  • Наверх

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

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

Отправлено 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)

 


    • 0
  • Наверх

#7 Пользователь Lik (WMID 162361304700 )

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

Отправлено 16 Март 2020 - 15:38

import requests
import base64
import hashlib
import time
class Indx:
    
    def __init__(selfLogin,Password,Culture,Wmid):
        self.AuthS = Login + ";" + Password + ";" + Culture
        self.Auth = AuthS";" + Wmid
 
    def make_paramsselfAuthID = ''DateStart = ''
  DateEnd = ''sOfferID = ''ifS = FalseTick_ID = ''Tick_Kind = '')
        if not ifS:
            if ID: Auth += ';'+ID
            if DateStart: Auth += ';' + DateStart
            if DateEnd: Auth += ';' + DateEnd
            if sOfferID: Auth += ';' + sOfferID
            if Tick_ID: Auth += ';' + Tick_ID
            if Tick_Kind: Auth += ';' + Tick_Kind
        sig = base64.b64encode(hashlib.sha256(Auth.encode(
'utf-8')).digest())
        return  params = {"ApiContext": {"Login": Login, "Wmid": Wmid, 
       "Culture""ru-RU""Signature": sig} }
    
    def api(selfapi_nameapi_params={}):
        time.sleep(2)
        header = {"Content-type""application/json; charset=utf-8"}
        response=requests.post('api.indx.ru/api/v2/trade/'+api_name, data = api_params, headers = header )
        return response.text
    
    def Balance(self):
        return self.api('Balance', self.make_params(self.Auth))
    
    def Tools(self):
        return self.api('Tools', self.make_params(self.AuthS,'','','','',True)
    
    def HistoryTrading(self,ID,DateStart,DateEnd):
        params = self.make_params(self.Auth,ID,DateStart,DateEnd)
        params['Trading'] = {"ID":ID,"DateStart":DateStart,
"DateEnd":DateEnd}}
        return self.api('HistoryTrading', params)
    
    def HistoryTransaction(self,ID,DateStart,DateEnd):
        params = self.make_params(self.Auth,ID,DateStart,DateEnd)
        params['Trading'] = {"ID":ID,"DateStart":DateStart,"DateEnd":DateEnd}}
        return self.api('HistoryTransaction', params)
    
    def OfferMy(self):
        return self.api('OfferMy', self.make_params(self.Auth))
    
    def OfferList(selfID):
        params = self.make_params(self.Auth,ID)
        params['Trading'] = {'ID': ID}
        return self.api('OfferList', params)
    
    def OfferAdd(selfIDCountIsBidPrice):
        params = self.make_params(self.Auth,ID)
        params['Offer'] = {"ID": ID, "Count": Count, "IsAnonymous"'true',
 "IsBid": IsBid, "Price": Price}
        return self.api('OfferAdd', params)
    
    def OfferDelete(selfOfferID):
        params = self.make_params(self.Auth,'','','',str(OfferID))
        params['OfferId']=OfferID
        return self.api('OfferAdd', params)
    
    def Tick(selfTick_IDTick_Kind):
        params = self.make_params(self.Auth,'','','','',False,Tick_ID,Tick_Kind)
        params['Tick'] = {"ID": Tick_ID, "Kind": Tick_Kind} }
        return self.api('tick', params)

Сообщение отредактировал Lik: 17 Март 2020 - 12:07

    • 0
  • Наверх

#8 Пользователь Lik (WMID 162361304700 )

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

Отправлено 16 Март 2020 - 15:39

Jetix, Надеюсь к этому коде не замечаний?
    • 0
  • Наверх

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

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

Отправлено 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 - совсем кощунство.


    • 0
  • Наверх

#10 Пользователь Lik (WMID 162361304700 )

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

Отправлено 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

    • 0
  • Наверх

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

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

Отправлено 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! Начните наконец тестировать собственный код!


    • 0
  • Наверх





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

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

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