字符串索引必须是整数,而不是str - API

时间:2018-02-28 01:42:03

标签: python string api

我的程序发生了一个有趣的行为。

我有以下方法:

def getMarket(self, Currency):
    return self.public_api('GetMarket/' + Currency + '_BTC')

def getBalance(self, Currency):
    self.api_params.clear()
    self.api_params['Currency'] = Currency
    return self.private_api('GetBalance')
my_api = buyBot(API_KEY, API_SECRET)


pumpCoin = my_api.getMarket('OSC')
pumpRawRate = pumpCoin['Data']['High']
pumpRawQty = .02
pumpBuyRate = my_api.calculateBuy(pumpRawRate)
pumpQty = float(pumpRawQty)/float(pumpBuyRate)
pumpSellRate = pumpCoin['Data']['Low']

pumpSellCoin = my_api.getBalance('OSC')


pumpSellAmount = pumpSellCoin["Data"]["Total"]

print str(pumpRawRate) + '\n' + str(pumpBuyRate) + '\n' + str(pumpSellRate) + '\n' + str(pumpQty) + '\n' + str(pumpSellAmount)`

从部分:pumpCoin = my_api.getMarket('OSC')pumpSellRate = pumpCoin['Data']['Low'],我可以轻松获取信息并使用它。

问题似乎是从行开始:pumpSellCoin = my_api.getBalance('OSC')

我收到以下错误消息:

  Traceback (most recent call last):
  File "C:\XXXXXX.py", line 92, in <module>
    pumpSellAmount = pumpSellCoin["Data"]["Total"]
TypeError: string indices must be integers, not str

如果我运行:print (my_api.getBalance('OSC'),我能够看到该呼叫检索到的所有私有API信息,但是当我尝试呼叫1个特定项目时,我不确定为什么它会给我一个问题在堆栈中。

如果您需要更多相关信息,请与我们联系。

非常感谢任何帮助。

我查看了其他帖子,到目前为止,我似乎无法弄清楚确切的原因。

这是private_api代码

def private_api(self, meth):
    time.sleep(1)
    params = self.api_params
    url = self.apisite + meth
    nonce = str(int(time.time()))
    post_data = json.dumps(params)
    hash = hashlib.md5()
    hash.update(post_data)
    base64hash = base64.b64encode(hash.digest())
    sig = self.apikey + "POST" + urllib.quote_plus(url).lower() + nonce + base64hash
    hmacsig = base64.b64encode(hmac.new(base64.b64decode(self.apisecret), sig, hashlib.sha256).digest())
    hdr = "amx " + self.apikey + ":" + hmacsig + ":" + nonce
    headers = { 'Authorization': hdr, 'Content-Type':'application/json; charset=utf-8' }
    request = urllib2.Request(url, data=post_data, headers=headers)
    return urllib2.urlopen(request).read()

2 个答案:

答案 0 :(得分:0)

请将此添加到您的代码中:

print('pumpSellCoin', type(pumpSellCoin["Data"]), type(pumpSellCoin["Data"]["Total"]))
pumpSellAmount = pumpSellCoin["Data"]["Total"]

这将显示您的一个变量是列表或字符串而不是字典,您需要访问的是使用数字而不是"Data""Total"

试试这个例子:

test = 'abcde'
print(type(test))
print(test[0])
print(test[2:4])
print(test['whatever']) # this results in TypeError: string indices must be integers

答案 1 :(得分:0)

如果我按如下方式运行程序:

    my_api = buyBot(API_KEY, API_SECRET)


pumpCoin = my_api.getMarket('OSC')
pumpRawRate = pumpCoin['Data']['High']
pumpRawQty = .02
pumpBuyRate = my_api.calculateBuy(pumpRawRate)
pumpQty = float(pumpRawQty)/float(pumpBuyRate)
pumpSellRate = pumpCoin['Data']['Low']

pumpSellBal = my_api.getBalance('OSC')

print pumpSellBal


#print('pumpSellBal', type(pumpSellBal["Data"]), type(pumpSellBal["Data"]["Total"]))


#pumpSellAmount = pumpSellBal['Data']['Total']

print str(pumpRawRate) + '\n' + str(pumpBuyRate) + '\n' + str(pumpSellRate) + '\n' + str(pumpQty) #+ '\n' + str(pumpSellAmount)

我得到以下结果:

{"Success":true,"Error":null,"Data":[{"CurrencyId":235,"Symbol":"OSC","Total":8561.03652012,"Available":0.00000000,"Unconfirmed":0.00000000,"HeldForTrades":8561.03652012,"PendingWithdraw":0.00000000,"Address":null,"Status":"OK","StatusMessage":null,"BaseAddress":null}]}
1.61e-06
2.415e-06
1.25e-06
8281.57349896

所以我绝对能够前后沟通,但问题似乎只是当我尝试使用来自pumpSellBal = my_api.getBalance(&#39; OSC&#39;)的单一信息时