import requests
import time
import hmac,hashlib
import logging
import urllib
logging.getLogger("requests").setLevel(logging.NOTSET)
class Cryptsy:
def __init__(self, PublicKey, PrivateKey, domain="api.cryptsy.com"):
self.domain = domain
self.PublicKey = PublicKey
self.PrivateKey = PrivateKey
def _query(self, method, obj_id=None, action=None, query=[], get_method="GET"):
route = "/api/v2/" + method
if(obj_id != None):
route = route + "/" + str(obj_id)
if(action != None):
route = route + "/" + str(action)
query.append(('nonce', time.time()))
queryStr = urllib.urlencode(query)
link = 'https://' + self.domain + route
sign = hmac.new(self.PrivateKey.encode('utf-8'),
queryStr,
hashlib.sha512).hexdigest()
headers = {'Sign': sign, 'Key': self.PublicKey.encode('utf-8')}
if(get_method == "PUT"):
ret = requests.put(link,
params=query,
headers=headers,
verify=False)
elif(get_method == "DELETE"):
ret = requests.delete(link,
params=query,
headers=headers,
verify=False)
elif(get_method == "POST"):
ret = requests.post(link,
params=query,
headers=headers,
verify=False)
else:
ret = requests.get(link,
params=query,
headers=headers,
verify=False)
try:
jsonRet = ret.json()
return jsonRet
except ValueError:
return {"success": False,
"error": {"ValueError": ["Could not load json string."]}}
# Markets
def markets(self):
return self._query(method="markets")
def market(self, obj_id):
return self._query(method="markets", obj_id=obj_id)
def market_orderbook(self, obj_id, limit=100, otype="both", mine=False):
return self._query(method="markets", obj_id=obj_id, action="orderbook",
query=[("limit", limit), ("type", otype), ("mine", mine)])
def market_tradehistory(self, obj_id, limit=100, mine=False):
return self._query(method="markets", obj_id=obj_id, action="tradehistory",
query=[("limit", limit), ("mine", mine)])
def market_triggers(self, obj_id, limit=100):
return self._query(method="markets", obj_id=obj_id, action="triggers",
query=[("limit", limit)])
def market_ohlc(self, obj_id, start=0, stop=time.time(),
interval="minute", limit=100):
intervals = ["minute", "hour", "day"]
if(interval not in intervals):
interval = intervals[0]
return self._query(method="markets",
obj_id=obj_id,
action="ohlc",
query=[("start", start),
("stop", stop),
("interval", interval),
("limit", limit)])
# Currencies
def currencies(self):
return self._query(method="currencies")
def currency(self, obj_id):
return self._query(method="currencies", obj_id=obj_id)
def currency_markets(self, obj_id):
return self._query(method="currencies", obj_id=obj_id, action="markets")
# User
def balances(self, btype="all"):
return self._query(method="balances", query=[("type", btype)])
def balance(self, obj_id, btype="all"):
return self._query(method="balances", obj_id=obj_id, query=[("type", btype)])
def deposits(self, obj_id=0, limit=100):
if(obj_id != 0):
return self._query(method="deposits",
obj_id=obj_id,
query=[("limit", limit)])
return self._query(method="deposits", query=[("limit", limit)])
def withdrawals(self, obj_id=0, limit=100):
if(obj_id != 0):
return self._query(method="withdrawals",
obj_id=obj_id,
query=[("limit", limit)])
return self._query(method="withdrawals", query=[("limit", limit)])
def addresses(self):
return self._query(method="addresses")
def address(self, obj_id):
return self._query(method="addresses", obj_id=obj_id)
def transfers(self, limit=100):
return self._query(method="transfers", query=[("limit", limit)])
# Orders
def order(self, obj_id):
return self._query(method="order", obj_id=obj_id)
def order_create(self, marketid, quantity, ordertype, price):
return self._query(method="order", query=[("quantity", quantity),
("ordertype", ordertype),
("price", price),
("marketid", marketid)],
get_method="POST")
def order_remove(self, obj_id):
return self._query(method="order", obj_id=obj_id, get_method="DELETE")
def order_move(self, obj_id, price=False, quantity=False):
if(price == False and quantity == False):
return {"success": False,
"error": {"ValueError": ["Must supply price and or quantity."]}}
query = []
if(not isinstance(quantity, bool)):
if(isinstance(quantity, float) or isinstance(quantity, int)):
query.append(("quantity", quantity))
if(not isinstance(price, bool)):
if(isinstance(price, float) or isinstance(price, int)):
query.append(("price", price))
return self._query(method="order", obj_id=obj_id, action="move",
query=query,
get_method="GET")
# Triggers
def trigger(self, obj_id):
return self._query(method="trigger", obj_id=obj_id)
def trigger_create(self, marketid, ordertype, quantity,
comparison, price, orderprice, expires=''):
return self._query(method="trigger",
query=[("marketid", marketid),
("type", ordertype),
("quantity", quantity),
("comparison", comparison),
("price", price),
("orderprice", orderprice),
("expires", expires)],
get_method="POST")
def trigger_remove(self, obj_id):
return self._query(method="trigger", obj_id=obj_id, get_method="DELETE")
# Converter
def convert(self, obj_id):
return self._query(method="converter", obj_id=obj_id)
def convert_create(self, fromcurrency, tocurrency, sendingamount=0.0,
receivingamount=0.0, tradekey="", feepercent=0.0):
return self._query(method="converter",
query=[("fromcurrency", fromcurrency),
("tocurrency", tocurrency),
("sendingamount", sendingamount),
("receivingamount", receivingamount),
("tradekey", tradekey),
("feepercent", feepercent)],
get_method="POST")