From 0e8a6fe858a90f6d05e8baec1e08bca01e59a157 Mon Sep 17 00:00:00 2001 From: Evan Mouroutsos Date: Mon, 12 Jun 2017 01:24:28 +0300 Subject: [PATCH 1/2] Add files via upload added converter api call now using request fixed message hmac not working in python 3 --- cexapi/cexapi.py | 48 +++++++++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/cexapi/cexapi.py b/cexapi/cexapi.py index 8b86b88..394c9bd 100644 --- a/cexapi/cexapi.py +++ b/cexapi/cexapi.py @@ -1,15 +1,16 @@ # -*- coding: utf-8 -*- -# Author: t0pep0 +# Original Author: t0pep0 # e-mail: t0pep0.gentoo@gmail.com -# Jabber: t0pep0@jabber.ru -# BTC : 1ipEA2fcVyjiUnBqUx7PVy5efktz2hucb -# donate free =) +# added some modifications me import hmac import hashlib import time import urllib -import urllib2 +from urllib import request +from urllib.parse import urlencode import json +import requests + class API(object): @@ -31,16 +32,16 @@ def __nonce(self): # generate segnature def __signature(self): string = self.__nonce_v + self.__username + self.__api_key # create string - signature = hmac.new(self.__api_secret, string, digestmod=hashlib.sha256).hexdigest().upper() # create signature + signature = hmac.new(bytes(self.__api_secret, 'latin-1'), bytes(string, 'latin-1'), + digestmod=hashlib.sha256).hexdigest().upper() # create signature return signature def __post(self, url, param): # Post Request (Low Level API call) - params = urllib.urlencode(param) - req = urllib2.Request(url, params, {'User-agent': 'bot-cex.io-' + self.__username}) - page = urllib2.urlopen(req).read() - return page + page = requests.post(url, param) + return page.text - def api_call(self, method, param={}, private=0, couple=''): # api call (Middle level) + def api_call(self, method, param={}, private=0, + couple=''): # api call (Middle level) url = 'https://cex.io/api/' + method + '/' # generate url if couple != '': url = url + couple + '/' # set couple if needed @@ -53,29 +54,34 @@ def api_call(self, method, param={}, private=0, couple=''): # api call (Middle answer = self.__post(url, param) # Post Request return json.loads(answer) # generate dict and return - def ticker(self, couple='GHS/BTC'): + def ticker(self, couple='ETH/EUR'): return self.api_call('ticker', {}, 0, couple) - def order_book(self, couple='GHS/BTC'): + def order_book(self, couple='ETH/EUR'): return self.api_call('order_book', {}, 0, couple) - def trade_history(self, since=1, couple='GHS/BTC'): + def trade_history(self, since=1, couple='ETH/EUR'): return self.api_call('trade_history', {"since": str(since)}, 0, couple) def balance(self): return self.api_call('balance', {}, 1) - def current_orders(self, couple='GHS/BTC'): + def current_orders(self, couple='ETH/EUR'): return self.api_call('open_orders', {}, 1, couple) def cancel_order(self, order_id): return self.api_call('cancel_order', {"id": order_id}, 1) - def place_order(self, ptype='buy', amount=1, price=1, couple='GHS/BTC'): - return self.api_call('place_order', {"type": ptype, "amount": str(amount), "price": str(price)}, 1, couple) + def place_order(self, ptype='buy', amount=1, price=1, couple='ETH/EUR'): + return self.api_call('place_order', + {"type": ptype, "amount": str(amount), + "price": str(price)}, 1, couple) - def price_stats(self, last_hours, max_resp_arr_size, couple='GHS/BTC'): + def price_stats(self, last_hours, max_resp_arr_size, couple='ETH/EUR'): return self.api_call( - 'price_stats', - {"lastHours": last_hours, "maxRespArrSize": max_resp_arr_size}, - 0, couple) + 'price_stats', + {"lastHours": last_hours, "maxRespArrSize": max_resp_arr_size}, + 0, couple) + + def converter(self, amount, couple='ETH/EUR'): + return self.api_call('convert',{"amnt" :amount} ,0, couple) From 17be55f9e685ad295fc3f139d7d19f0fa563645b Mon Sep 17 00:00:00 2001 From: Evan Date: Sat, 13 Jan 2018 22:59:27 +0200 Subject: [PATCH 2/2] Update cexapi.py added get_address api call , fixed get_fee function to use correct pair formatting --- cexapi/cexapi.py | 45 +++++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/cexapi/cexapi.py b/cexapi/cexapi.py index 394c9bd..fa1c23f 100644 --- a/cexapi/cexapi.py +++ b/cexapi/cexapi.py @@ -1,18 +1,13 @@ # -*- coding: utf-8 -*- -# Original Author: t0pep0 -# e-mail: t0pep0.gentoo@gmail.com -# added some modifications me +# Author: t0pep0 + import hmac import hashlib import time -import urllib -from urllib import request -from urllib.parse import urlencode import json import requests - class API(object): __username = '' __api_key = '' @@ -29,7 +24,7 @@ def __init__(self, username, api_key, api_secret): def __nonce(self): self.__nonce_v = '{:.10f}'.format(time.time() * 1000).split('.')[0] - # generate segnature + # generate signature def __signature(self): string = self.__nonce_v + self.__username + self.__api_key # create string signature = hmac.new(bytes(self.__api_secret, 'latin-1'), bytes(string, 'latin-1'), @@ -38,19 +33,18 @@ def __signature(self): def __post(self, url, param): # Post Request (Low Level API call) page = requests.post(url, param) - return page.text + return page.text - def api_call(self, method, param={}, private=0, - couple=''): # api call (Middle level) + def api_call(self, method, param={}, private=0, couple=''): # api call (Middle level) url = 'https://cex.io/api/' + method + '/' # generate url if couple != '': url = url + couple + '/' # set couple if needed if private == 1: # add auth-data if needed self.__nonce() param.update({ - 'key': self.__api_key, + 'key' : self.__api_key, 'signature': self.__signature(), - 'nonce': self.__nonce_v}) + 'nonce' : self.__nonce_v}) answer = self.__post(url, param) # Post Request return json.loads(answer) # generate dict and return @@ -74,14 +68,29 @@ def cancel_order(self, order_id): def place_order(self, ptype='buy', amount=1, price=1, couple='ETH/EUR'): return self.api_call('place_order', - {"type": ptype, "amount": str(amount), + {"type" : ptype, "amount": str(amount), "price": str(price)}, 1, couple) + def get_address(self, currency): + return self.api_call('get_address', {'currency': currency}, 1) + def price_stats(self, last_hours, max_resp_arr_size, couple='ETH/EUR'): return self.api_call( - 'price_stats', - {"lastHours": last_hours, "maxRespArrSize": max_resp_arr_size}, - 0, couple) + 'price_stats', + {"lastHours": last_hours, "maxRespArrSize": max_resp_arr_size}, + 0, couple) def converter(self, amount, couple='ETH/EUR'): - return self.api_call('convert',{"amnt" :amount} ,0, couple) + return self.api_call('convert', {"amnt": amount}, 0, couple) + + def get_fee(self, couple=None): + fees = self.api_call('get_myfee', {}, 1) + if couple is None: + return fees + else: + if '/' in couple: + couple = couple.replace('/', ':') + fee = {'couple': couple} + fee['buy'] = fees['data'][couple]['buy'] + fee['sell'] = fees['data'][couple]['sell'] + return fee