我的爱好是通过api买卖比特币,而我已经成功地使用python通过使用“请求”库来做到这一点,而lua也存在。我正在使用bitstamp API。但是,我的lua代码无法正常工作。
这是python wich作品的代码
import time
import hashlib
import hmac
import requests
import ast
import pprint
nonce = str(int(time.time()))
customer_id = 'some id'
api_key = 'some string'
API_SECRET = 'some other string'
message = nonce + customer_id + api_key
signature = hmac.new(API_SECRET, msg=message, digestmod=hashlib.sha256).hexdigest().upper()
# --------------Requests Parameters------------------------
params = {"key": api_key, "signature": signature, 'nonce': nonce}
# --------------Get Account Balance--------------------------
r = requests.post('https://www.bitstamp.net/api/v2/balance/', data=params)
print(r.text)
现在此代码有效,我得到了成功的答复。
但是我的lua代码无法正常工作,因为我从api中收到一个错误,因此它不是语法错误。这是lua代码。
requests= require("requests")
openssl = require("openssl")
nonce = tostring(os.time())
customer_id = 'some id'
api_key = 'some string'
API_SECRET = 'some other string'
message = nonce..customer_id..api_key
signature = openssl.hmac.digest('sha256',message,API_SECRET)
signature = string.upper(signature)
print(signature)
params = {['key'] = api_key, ['signature'] = signature, ['nonce'] = nonce}
r = requests.post{"https://www.bitstamp.net/api/v2/balance/", data = params}
print(r.text)
print(r.status_code)
我从此代码从服务器获得的响应是
{“状态”:“错误”,“原因”:“缺少密钥,签名和随机数参数”,“代码”:“ API0000”} 403
值API0000是来自api(https://www.bitstamp.net/api/)的错误代码,表示“参数未在API请求中发布”
我只是不知道我在这里做错了什么。任何想法都会被贬低。谢谢。
答案 0 :(得分:3)
使用http://httpbin.org/post,我看到Lua将其发送为module.exports = {"timestamp":"08/14/2019 12:23"}
,而Python将其发送为"data"
,并且标题为"form"
我使用
得到相同的结果"Content-Type:application/x-www-form-urlencoded"
顺便说一句:params = "key=some string&nonce=1565817138&signature=7DE82CB42D1B8F38F7AC1A74EC3A5E06F1AA3A20A14F3DD0E7040F088FBF9F69"
headers = {["Content-Type"] = "application/x-www-form-urlencoded"}
url = "http://httpbin.org/post"
-- url = "https://www.bitstamp.net/api/v2/balance/"
r = requests.post{url, data = params, headers = headers}
不能是字典/表格,因为它将转换为
params
而且我不很了解Lua将字典转换成期望的字符串的方法。
编辑:我创建此文件是为了将"{\"key\":\"some string\",\"nonce\":\"1565888007\", ...
转换为正确的字符串
params
结果:
params = {['key'] = api_key, ['signature'] = signature, ['nonce'] = nonce}
params_str = {}
for k, v in pairs(params) do
table.insert(params_str, k..'='..v)
end
params = table.concat(params_str, '&')
print('params> '..params)
完整代码:
params> signature=1492CA16012C0A6F9AAF7DDD66F649FF1DCF0E675D743AEBF77E0E437C8FF006&key=some string&nonce=1565889236