├── .gitignore ├── Cryptsy.py ├── README.md └── requirements.txt /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | test.py 3 | virt/ -------------------------------------------------------------------------------- /Cryptsy.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import time 3 | import hmac,hashlib 4 | import logging 5 | import urllib 6 | 7 | logging.getLogger("requests").setLevel(logging.NOTSET) 8 | 9 | class Cryptsy: 10 | def __init__(self, PublicKey, PrivateKey, domain="api.cryptsy.com"): 11 | self.domain = domain 12 | self.PublicKey = PublicKey 13 | self.PrivateKey = PrivateKey 14 | 15 | def _query(self, method, obj_id=None, action=None, query=[], get_method="GET"): 16 | 17 | route = "/api/v2/" + method 18 | if(obj_id != None): 19 | route = route + "/" + str(obj_id) 20 | if(action != None): 21 | route = route + "/" + str(action) 22 | 23 | query.append(('nonce', time.time())) 24 | queryStr = urllib.urlencode(query) 25 | link = 'https://' + self.domain + route 26 | sign = hmac.new(self.PrivateKey.encode('utf-8'), 27 | queryStr, 28 | hashlib.sha512).hexdigest() 29 | headers = {'Sign': sign, 'Key': self.PublicKey.encode('utf-8')} 30 | 31 | if(get_method == "PUT"): 32 | ret = requests.put(link, 33 | params=query, 34 | headers=headers, 35 | verify=False) 36 | elif(get_method == "DELETE"): 37 | ret = requests.delete(link, 38 | params=query, 39 | headers=headers, 40 | verify=False) 41 | elif(get_method == "POST"): 42 | ret = requests.post(link, 43 | params=query, 44 | headers=headers, 45 | verify=False) 46 | else: 47 | ret = requests.get(link, 48 | params=query, 49 | headers=headers, 50 | verify=False) 51 | try: 52 | jsonRet = ret.json() 53 | return jsonRet 54 | except ValueError: 55 | return {"success": False, 56 | "error": {"ValueError": ["Could not load json string."]}} 57 | 58 | 59 | # Markets 60 | def markets(self): 61 | return self._query(method="markets") 62 | 63 | def market(self, obj_id): 64 | return self._query(method="markets", obj_id=obj_id) 65 | 66 | def market_orderbook(self, obj_id, limit=100, otype="both", mine=False): 67 | return self._query(method="markets", obj_id=obj_id, action="orderbook", 68 | query=[("limit", limit), ("type", otype), ("mine", mine)]) 69 | 70 | def market_tradehistory(self, obj_id, limit=100, mine=False): 71 | return self._query(method="markets", obj_id=obj_id, action="tradehistory", 72 | query=[("limit", limit), ("mine", mine)]) 73 | 74 | def market_triggers(self, obj_id, limit=100): 75 | return self._query(method="markets", obj_id=obj_id, action="triggers", 76 | query=[("limit", limit)]) 77 | 78 | def market_ohlc(self, obj_id, start=0, stop=time.time(), 79 | interval="minute", limit=100): 80 | intervals = ["minute", "hour", "day"] 81 | if(interval not in intervals): 82 | interval = intervals[0] 83 | return self._query(method="markets", 84 | obj_id=obj_id, 85 | action="ohlc", 86 | query=[("start", start), 87 | ("stop", stop), 88 | ("interval", interval), 89 | ("limit", limit)]) 90 | 91 | 92 | # Currencies 93 | def currencies(self): 94 | return self._query(method="currencies") 95 | 96 | def currency(self, obj_id): 97 | return self._query(method="currencies", obj_id=obj_id) 98 | 99 | def currency_markets(self, obj_id): 100 | return self._query(method="currencies", obj_id=obj_id, action="markets") 101 | 102 | 103 | # User 104 | def balances(self, btype="all"): 105 | return self._query(method="balances", query=[("type", btype)]) 106 | 107 | def balance(self, obj_id, btype="all"): 108 | return self._query(method="balances", obj_id=obj_id, query=[("type", btype)]) 109 | 110 | def deposits(self, obj_id=0, limit=100): 111 | if(obj_id != 0): 112 | return self._query(method="deposits", 113 | obj_id=obj_id, 114 | query=[("limit", limit)]) 115 | return self._query(method="deposits", query=[("limit", limit)]) 116 | 117 | def withdrawals(self, obj_id=0, limit=100): 118 | if(obj_id != 0): 119 | return self._query(method="withdrawals", 120 | obj_id=obj_id, 121 | query=[("limit", limit)]) 122 | return self._query(method="withdrawals", query=[("limit", limit)]) 123 | 124 | def addresses(self): 125 | return self._query(method="addresses") 126 | 127 | def address(self, obj_id): 128 | return self._query(method="addresses", obj_id=obj_id) 129 | 130 | def transfers(self, limit=100): 131 | return self._query(method="transfers", query=[("limit", limit)]) 132 | 133 | 134 | # Orders 135 | def order(self, obj_id): 136 | return self._query(method="order", obj_id=obj_id) 137 | 138 | def order_create(self, marketid, quantity, ordertype, price): 139 | return self._query(method="order", query=[("quantity", quantity), 140 | ("ordertype", ordertype), 141 | ("price", price), 142 | ("marketid", marketid)], 143 | get_method="POST") 144 | 145 | def order_remove(self, obj_id): 146 | return self._query(method="order", obj_id=obj_id, get_method="DELETE") 147 | 148 | def order_move(self, obj_id, price=False, quantity=False): 149 | if(price == False and quantity == False): 150 | return {"success": False, 151 | "error": {"ValueError": ["Must supply price and or quantity."]}} 152 | 153 | query = [] 154 | if(not isinstance(quantity, bool)): 155 | if(isinstance(quantity, float) or isinstance(quantity, int)): 156 | query.append(("quantity", quantity)) 157 | 158 | if(not isinstance(price, bool)): 159 | if(isinstance(price, float) or isinstance(price, int)): 160 | query.append(("price", price)) 161 | 162 | return self._query(method="order", obj_id=obj_id, action="move", 163 | query=query, 164 | get_method="GET") 165 | 166 | 167 | # Triggers 168 | def trigger(self, obj_id): 169 | return self._query(method="trigger", obj_id=obj_id) 170 | 171 | def trigger_create(self, marketid, ordertype, quantity, 172 | comparison, price, orderprice, expires=''): 173 | return self._query(method="trigger", 174 | query=[("marketid", marketid), 175 | ("type", ordertype), 176 | ("quantity", quantity), 177 | ("comparison", comparison), 178 | ("price", price), 179 | ("orderprice", orderprice), 180 | ("expires", expires)], 181 | get_method="POST") 182 | 183 | def trigger_remove(self, obj_id): 184 | return self._query(method="trigger", obj_id=obj_id, get_method="DELETE") 185 | 186 | 187 | # Converter 188 | def convert(self, obj_id): 189 | return self._query(method="converter", obj_id=obj_id) 190 | 191 | def convert_create(self, fromcurrency, tocurrency, sendingamount=0.0, 192 | receivingamount=0.0, tradekey="", feepercent=0.0): 193 | return self._query(method="converter", 194 | query=[("fromcurrency", fromcurrency), 195 | ("tocurrency", tocurrency), 196 | ("sendingamount", sendingamount), 197 | ("receivingamount", receivingamount), 198 | ("tradekey", tradekey), 199 | ("feepercent", feepercent)], 200 | get_method="POST") 201 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | CryptsyPythonV2 2 | =============== 3 | 4 | Python Library for Cryptsy's V2 API 5 | 6 | 7 | Requirements 8 | ============ 9 | * Tested in Python 2.7 10 | * requests lib. (http://docs.python-requests.org/en/latest/) 11 | 12 | Examples 13 | ======== 14 | Print Last Hours Worth of OHLC 15 | ```python 16 | from Cryptsy import Cryptsy 17 | from pprint import pprint 18 | import time 19 | 20 | c = Cryptsy("", "") 21 | ohlc = c.market_ohlc(132, start=0, stop=time.time(), interval="minute", limit=60) 22 | pprint(ohlc) 23 | ``` 24 | 25 | 26 | List Currencies 27 | ```python 28 | from Cryptsy import Cryptsy 29 | from pprint import pprint 30 | 31 | c = Cryptsy("", "") 32 | currencies = c.currencies() 33 | pprint(currencies) 34 | ``` 35 | 36 | 37 | Create Converter Quote with 2% fee. 38 | ```python 39 | from Cryptsy import Cryptsy 40 | from pprint import pprint 41 | 42 | c = Cryptsy("", "") 43 | quote = c.convert_create(3, 132, sendingamount=1, tradekey="", feepercent=2) 44 | pprint(quote) 45 | ``` 46 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | argparse==1.2.1 2 | requests==2.8.0 3 | wsgiref==0.1.2 4 | --------------------------------------------------------------------------------