#please donate: 1DQNJWxVsbiVwTbxVwHXqnN5gfjs8VK2Kk import threading import websocket import cjson,json import time,binascii import md5,base64,hmac,hashlib CHANNELS = { "USD":{ "trade":"dbf1dee9-4f2e-4a08-8cb7-748919a71b21", "ticker":"d5f06780-30a8-4a48-a2f8-7ed181b4a13f", "depth":"24e67e0d-1cad-4cc0-9e7a-f8523ef460fe", } } def serialize(obj): return cjson.encode(obj) def deserialize(msg): return cjson.decode(msg) class MtGoxAPI(threading.Thread): def __init__(self, apikey, secret): self.counter = 0 self.apikey = apikey self.secret = secret threading.Thread.__init__(self) def run(self): self.open_socket("ws://websocket.mtgox.com/mtgox") def nonce(self): self.counter += 1 return ( int( time.time() ) * 1000 ) + self.counter def encode_and_sign(self,data): binary = binascii.unhexlify( self.apikey.replace("-","") ) signed = hmac.new( base64.b64decode(self.secret), data, hashlib.sha512 ).digest() encoded = base64.b64encode( "%s%s%s" % (binary, sign, data) ) return encoded def subscribe(self,channel): output = serialize({"op":"subscribe", "channel":channel, }) def unsubscribe(self,channel): output = serialize({"op":"unsubscribe", "channel":channel, }) def request(self,apicall,cry="USD",params=list(),item="BTC"): nonce = self.nonce() id = md5.new( str(nonce) ).hexdigest() query = {"id":id, "call":apicall, "nonce":nonce, "currency":cry, "parameters":params, "item":item } output = serialize({"op":"call", "id":id, "call":self.encode_and_sign(serialize(query)), "context":"mtgox.com" }) self.ws.send(output) return id def handle_result(self,data): print(data) def handle_depth(self,data): print(data) def handle_ticker(self,data): print(data) def on_message(self,ws,message): data = deserialize(message) op = data.get("op") if op == "private": if private == "depth": self.handle_depth(data) elif private == "trade": self.trades.append(data) elif private == "ticker": self.handle_ticker(data) elif private == "result": self.handle_result(data) def on_open(self,ws): print "### Connection opened ###" def on_close(self,ws): print "### Connection closed ###" def on_error(self,ws, error): print error def open_socket(self,url): websocket.enableTrace(False) self.ws = websocket.WebSocketApp(url, on_message = self.on_message, on_error = self.on_error, on_close = self.on_close) self.ws.on_open = self.on_open self.ws.run_forever() if __name__ == "__main__": apikey = u"" secret = u"" main = MtGoxAPI(apikey,secret).start()