2017-05-20 45 views
1

我使用的是Python包裝從上面的腳本我得到HTTP錯誤422 Poloniex購買請求

import urllib 
import urllib2 
import json 
import time 
import hmac,hashlib 

def createTimeStamp(datestr, format="%Y-%m-%d %H:%M:%S"): 
    return time.mktime(time.strptime(datestr, format)) 

class poloniex: 
    def __init__(self, APIKey, Secret): 
     self.APIKey = APIKey 
     self.Secret = Secret 

    def post_process(self, before): 
     after = before 

     # Add timestamps if there isnt one but is a datetime 
     if('return' in after): 
      if(isinstance(after['return'], list)): 
       for x in xrange(0, len(after['return'])): 
        if(isinstance(after['return'][x], dict)): 
         if('datetime' in after['return'][x] and 'timestamp' not in after['return'][x]): 
          after['return'][x]['timestamp'] = float(createTimeStamp(after['return'][x]['datetime'])) 

     return after 

    def api_query(self, command, req={}): 

     if(command == "returnTicker" or command == "return24Volume"): 
      ret = urllib2.urlopen(urllib2.Request('https://poloniex.com/public?command=' + command)) 
      return json.loads(ret.read()) 
     elif(command == "returnOrderBook"): 
      ret = urllib2.urlopen(urllib2.Request('https://poloniex.com/public?command=' + command + '&currencyPair=' + str(req['currencyPair']))) 
      return json.loads(ret.read()) 
     elif(command == "returnMarketTradeHistory"): 
      ret = urllib2.urlopen(urllib2.Request('https://poloniex.com/public?command=' + "returnTradeHistory" + '&currencyPair=' + str(req['currencyPair']))) 
      return json.loads(ret.read()) 
     else: 
      req['command'] = command 
      req['nonce'] = int(time.time()*1000) 
      post_data = urllib.urlencode(req) 

      sign = hmac.new(self.Secret, post_data, hashlib.sha512).hexdigest() 
      headers = { 
       'Sign': sign, 
       'Key': self.APIKey 
      } 

      ret = urllib2.urlopen(urllib2.Request('https://poloniex.com/tradingApi', post_data, headers)) 
      jsonRet = json.loads(ret.read()) 
      return self.post_process(jsonRet) 


    def returnTicker(self): 
     return self.api_query("returnTicker") 

    def return24Volume(self): 
     return self.api_query("return24Volume") 

    def returnOrderBook (self, currencyPair): 
     return self.api_query("returnOrderBook", {'currencyPair': currencyPair}) 

    def returnMarketTradeHistory (self, currencyPair): 
     return self.api_query("returnMarketTradeHistory", {'currencyPair': currencyPair}) 


    # Returns all of your balances. 
    # Outputs: 
    # {"BTC":"0.59098578","LTC":"3.31117268", ... } 
    def returnBalances(self): 
     return self.api_query('returnBalances') 

    # Returns your open orders for a given market, specified by the "currencyPair" POST parameter, e.g. "BTC_XCP" 
    # Inputs: 
    # currencyPair The currency pair e.g. "BTC_XCP" 
    # Outputs: 
    # orderNumber The order number 
    # type   sell or buy 
    # rate   Price the order is selling or buying at 
    # Amount  Quantity of order 
    # total   Total value of order (price * quantity) 
    def returnOpenOrders(self,currencyPair): 
     return self.api_query('returnOpenOrders',{"currencyPair":currencyPair}) 


    # Returns your trade history for a given market, specified by the "currencyPair" POST parameter 
    # Inputs: 
    # currencyPair The currency pair e.g. "BTC_XCP" 
    # Outputs: 
    # date   Date in the form: "2014-02-19 03:44:59" 
    # rate   Price the order is selling or buying at 
    # amount  Quantity of order 
    # total   Total value of order (price * quantity) 
    # type   sell or buy 
    def returnTradeHistory(self,currencyPair): 
     return self.api_query('returnTradeHistory',{"currencyPair":currencyPair}) 

    # Places a buy order in a given market. Required POST parameters are "currencyPair", "rate", and "amount". If successful, the method will return the order number. 
    # Inputs: 
    # currencyPair The curreny pair 
    # rate   price the order is buying at 
    # amount  Amount of coins to buy 
    # Outputs: 
    # orderNumber The order number 
    def buy(self,currencyPair,rate,amount): 
     return self.api_query('buy',{"currencyPair":currencyPair,"rate":rate,"amount":amount}) 

    # Places a sell order in a given market. Required POST parameters are "currencyPair", "rate", and "amount". If successful, the method will return the order number. 
    # Inputs: 
    # currencyPair The curreny pair 
    # rate   price the order is selling at 
    # amount  Amount of coins to sell 
    # Outputs: 
    # orderNumber The order number 
    def sell(self,currencyPair,rate,amount): 
     return self.api_query('sell',{"currencyPair":currencyPair,"rate":rate,"amount":amount}) 

    # Cancels an order you have placed in a given market. Required POST parameters are "currencyPair" and "orderNumber". 
    # Inputs: 
    # currencyPair The curreny pair 
    # orderNumber The order number to cancel 
    # Outputs: 
    # succes  1 or 0 
    def cancel(self,currencyPair,orderNumber): 
     return self.api_query('cancelOrder',{"currencyPair":currencyPair,"orderNumber":orderNumber}) 

    # Immediately places a withdrawal for a given currency, with no email confirmation. In order to use this method, the withdrawal privilege must be enabled for your API key. Required POST parameters are "currency", "amount", and "address". Sample output: {"response":"Withdrew 2398 NXT."} 
    # Inputs: 
    # currency  The currency to withdraw 
    # amount  The amount of this coin to withdraw 
    # address  The withdrawal address 
    # Outputs: 
    # response  Text containing message about the withdrawal 
    def withdraw(self, currency, amount, address): 
     return self.api_query('withdraw',{"currency":currency, "amount":amount, "address":address}) 
trader_obj=poloniex('apikey','secretkey') 
print trader_obj.buy("BTC_XRP",0.00016900,50) 

如果從已在文檔中給出https://pastebin.com/fbkheaRb腳本。
我想要下訂單,但我得到urllib2.HTTPError:HTTP錯誤422:
我無法解決問題,我相信在購買參數中有一些語義錯誤。 我找不到任何相關的文件。

回答

2

第一導入請求庫

import requests 

,然後替換:

ret = urllib2.urlopen(urllib2.Request('https://poloniex.com/tradingApi', post_data, headers)) 
jsonRet = json.loads(ret.read()) 

由:

ret = requests.post('https://poloniex.com/tradingApi', data=req, headers=headers) 
jsonRet = json.loads(ret.text) 

看到張貼Sending a JSON POST using urllib2 results in HTTP 422了類似的問題

+0

這對我有效!出於某種原因,我只是因爲「buy」命令而得到了錯誤422,而沒有其他人(比如「returnCompleteBalances」)。 – KTC

1

I H在使用舊的/存在的API/SECRET時發生相同的問題。嘗試刪除當前的API密鑰並創建一個新密鑰。那麼它應該工作。

+0

這對我有用:) – user3714163

0

在撥打電話獲得Poloniex公開訂單時,我偶爾會回到422。 展望提琴手這是問題:

隨機數必須大於1517395651712761.

我的應用程序是多線程的,從而在不同的線程另一個請求必須有「打」這一個Poloniex,即使它是之後創建(具有更大的隨機數)。

1

取代:

REQ [ '的隨機數'] = INT(了time.time()* 1000)

由:

REQ [ '的隨機數'] = INT(了time.time( )* 1000000000)