求助:使用PowerShell连接POLONIEX API失败,请求协助排查问题
修复你的Poloniex API PowerShell连接代码
我帮你排查了下代码里的几个关键问题,这些应该是导致你连接失败的核心原因:
问题分析
- 签名生成的参数格式错误:Poloniex要求签名必须基于URL编码后的POST查询字符串(比如
command=returnBalances&nonce=1699999999123)生成HMAC-SHA512哈希,但你直接把哈希表对象转成字节了,这完全不符合API的签名规则。 - 编码方式不匹配:Poloniex的API文档明确要求使用UTF-8编码处理参数和签名,而你用了ASCII编码,这会导致签名计算错误。
- Nonce精度不足:你用的是秒级时间戳作为nonce,很容易出现重复值(如果短时间内多次请求),Poloniex要求nonce必须是严格递增的唯一值,毫秒级时间戳更安全。
修正后的完整代码
# 强制启用TLS 1.2,这部分是正确的 [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 # API配置信息 $apiUri = 'https://poloniex.com/tradingApi' $apiKey = 'POLO-API-SECRET-KEY' $apiSecret = 'poloapisecret' # 生成毫秒级UTC时间戳作为nonce,确保唯一且递增 $nonce = [int64]((Get-Date).ToUniversalTime() - [DateTime]"1970-01-01").TotalMilliseconds # 构造POST请求参数 $postParams = @{ command = "returnBalances" nonce = $nonce } # 将参数转换为URL编码的查询字符串(这是生成正确签名的关键步骤) $paramString = ($postParams.GetEnumerator() | ForEach-Object { "$([Uri]::EscapeDataString($_.Key))=$([Uri]::EscapeDataString($_.Value))" }) -join '&' # 计算HMAC-SHA512签名,使用UTF-8编码 $hmac = New-Object System.Security.Cryptography.HMACSHA512 $hmac.Key = [System.Text.Encoding]::UTF8.GetBytes($apiSecret) $signatureBytes = $hmac.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($paramString)) $signature = [Convert]::ToBase64String($signatureBytes) # 设置请求头 $requestHeaders = @{ 'Key' = $apiKey 'Sign' = $signature } try { # 发送POST请求,指定正确的内容类型 $response = Invoke-WebRequest -Uri $apiUri -Method POST -Body $paramString -Headers $requestHeaders -ContentType 'application/x-www-form-urlencoded' # 解析JSON响应 $balanceData = $response.Content | ConvertFrom-Json Write-Output "账户余额信息:" Write-Output $balanceData } catch { # 捕获并输出详细错误信息,方便排查问题 Write-Error "请求失败: $($_.Exception.Message)" if ($_.Exception.Response) { $errorStream = $_.Exception.Response.GetResponseStream() $streamReader = New-Object System.IO.StreamReader($errorStream) $errorDetails = $streamReader.ReadToEnd() | ConvertFrom-Json Write-Output "API返回错误: $($errorDetails.error)" } }
关键改进点说明
- 正确的签名生成流程:先把参数转成URL编码的查询字符串,再基于这个字符串计算签名,完全符合Poloniex的API要求。
- UTF-8编码一致性:不管是处理密钥、参数还是签名,都统一使用UTF-8编码,避免编码不匹配导致的签名无效。
- 可靠的Nonce生成:使用毫秒级UTC时间戳,确保每次请求的nonce都是唯一且递增的,避免触发API的重复nonce限制。
- 明确的内容类型:添加
-ContentType 'application/x-www-form-urlencoded'头,让服务器正确解析POST参数。 - 错误处理:通过try-catch块捕获请求异常,并输出API返回的具体错误信息(比如签名无效、权限不足等),方便快速定位问题。
内容的提问来源于stack exchange,提问作者ASorin
相关产品推荐
相关产品推荐

