You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:使用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)"
    }
}

关键改进点说明

  1. 正确的签名生成流程:先把参数转成URL编码的查询字符串,再基于这个字符串计算签名,完全符合Poloniex的API要求。
  2. UTF-8编码一致性:不管是处理密钥、参数还是签名,都统一使用UTF-8编码,避免编码不匹配导致的签名无效。
  3. 可靠的Nonce生成:使用毫秒级UTC时间戳,确保每次请求的nonce都是唯一且递增的,避免触发API的重复nonce限制。
  4. 明确的内容类型:添加-ContentType 'application/x-www-form-urlencoded'头,让服务器正确解析POST参数。
  5. 错误处理:通过try-catch块捕获请求异常,并输出API返回的具体错误信息(比如签名无效、权限不足等),方便快速定位问题。

内容的提问来源于stack exchange,提问作者ASorin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:41:53