欧意法币交易:KYC认证是绊脚石还是保护伞?真相了!
66
2025-03-09
Upbit 作为韩国领先的数字货币交易所,其 API 提供了强大的功能,允许开发者自动化交易、获取市场数据、管理账户信息等。 本文旨在提供一份详尽的 Upbit API 使用指南,帮助读者快速上手并应用于实际场景。
要充分利用 Upbit API 提供的强大功能,第一步是拥有一个有效的 API 密钥。 这需要您首先在 Upbit 交易所完成账户注册和身份验证流程。 身份验证是确保账户安全和符合监管要求的必要步骤。 完成验证后,您需要导航至 Upbit 账户中的 "API 管理" 页面,通常可以在账户设置或安全设置部分找到该页面。
在 "API 管理" 页面,您将看到 API 密钥申请的详细信息。 仔细阅读并理解所有条款和条件至关重要。 您需要明确了解使用 API 密钥的责任和风险。 在申请过程中,您需要选择并启用与您的交易策略和需求相符的权限。
成功申请 API 密钥后,Upbit 将为您提供两组重要的字符串:
Upbit API 提供了全面的功能,通过一系列接口支持开发者构建各种加密货币交易应用。这些接口涵盖了广泛的领域,包括但不限于实时市场行情数据、订单管理、账户信息查询等,允许用户程序与Upbit交易所进行高效且安全的交互。
以下是一些常用的 API 接口类别和示例,方便开发者快速上手:
开发者在使用 Upbit API 时,务必仔细阅读官方文档,了解每个接口的详细参数、返回值和使用限制。同时,需要妥善保管 API 密钥,避免泄露,以确保账户安全。
/market/all
: 获取所有交易对的详细信息。此接口返回的数据包括但不限于:
/ticker
: 获取指定交易对的实时行情快照。此接口提供的数据包括:
/trades/ticks
: 获取指定交易对的实时成交记录。此接口返回的数据包括:
/candles/minutes/{unit}
: 获取指定交易对的分钟级 K 线数据。
unit
参数指定 K 线的周期,可以是以下值:
/candles/hours
接口)
/candles/days
: 获取指定交易对的日 K 线数据。数据结构与分钟级 K 线类似,但时间周期为一天。
/candles/weeks
: 获取指定交易对的周 K 线数据。数据结构与分钟级 K 线类似,但时间周期为一周。
/candles/months
: 获取指定交易对的月 K 线数据。数据结构与分钟级 K 线类似,但时间周期为一个自然月。
/orders/chance
: 获取指定交易对的下单可能性。此接口用于在实际下单前预估交易的可行性,会返回账户余额是否足够支付、交易对的最小下单数量限制、以及其他可能影响下单的因素。通过此接口,用户可以避免因资金不足或下单数量不符合规则而导致的交易失败。
/orders
: 下单接口,用于提交买入或卖出指定交易对的订单。用户可以通过此接口指定交易对、买卖方向(买入或卖出)、下单价格、下单数量等参数。根据交易所的实现,此接口可能支持市价单、限价单等多种订单类型。
/order
: 查询指定订单的详细信息。该接口允许用户通过订单ID查询特定订单的详细状态,包括订单类型(买入或卖出)、下单价格、下单数量、已成交数量、订单状态(例如,待成交、部分成交、完全成交、已撤销等)、以及下单时间等信息。
/orders/cancel
: 取消指定订单。用户可以通过此接口取消尚未完全成交的订单。通常需要提供订单ID作为参数。取消订单后,交易所会将冻结的资金或数字资产解冻,返回到用户的账户中。
/orders
: 查询未成交订单列表。此接口返回用户当前所有未完全成交的订单列表,方便用户监控订单状态并进行管理。列表中通常包含订单的交易对、买卖方向、下单价格、下单数量、剩余未成交数量、以及下单时间等信息。
/trades/ticks
: 查询指定交易对的历史成交记录。此接口返回该交易对过去一段时间内的成交价格、成交数量和成交时间。这些数据可以用于技术分析,帮助用户了解市场趋势,并做出更明智的交易决策。
/accounts
: 用于获取用户的账户资产信息,包括账户的余额、持仓情况以及其他相关的账户信息。
GET
方法,但具体实现取决于API的设计。
limit
和
offset
,以便于处理大量数据。
{
"accountId": "用户账户ID",
"currency": "USDT",
"availableBalance": 1000.00,
"lockedBalance": 50.00,
"totalBalance": 1050.00,
"positions": [
{
"symbol": "BTCUSDT",
"amount": 0.01,
"averagePrice": 60000.00
},
{
"symbol": "ETHUSDT",
"amount": 0.1,
"averagePrice": 3000.00
}
]
}
Upbit API 采用基于 JWT (JSON Web Token) 的身份验证机制。JWT 是一种开放标准 (RFC 7519),用于安全地将信息作为 JSON 对象在各方之间传输。在 Upbit API 的上下文中,你需要使用你的 Access Key 和 Secret Key 来生成一个 JWT,然后将此 JWT 作为令牌在 HTTP 请求头中发送,以此来验证你的身份并获得访问 API 资源的授权。
Access Key 和 Secret Key 是你在 Upbit 交易所创建 API 密钥时获得的。请务必妥善保管你的 Secret Key,不要泄露给他人,避免造成安全风险。
以下是使用 Python 编程语言生成 JWT 的示例代码,展示了如何使用你的 Access Key 和 Secret Key 构建并签名一个有效的 JWT 令牌:
import jwt
import uuid
import hashlib
access_key = "YOUR_ACCESS_KEY"
secret_key = "YOUR_SECRET_KEY"
payload = {
'access_key': access_key,
'nonce': str(uuid.uuid4())
}
jwt_token = jwt.encode(payload, secret_key, algorithm='HS256')
authorization_token = f'Bearer {jwt_token}'
print(authorization_token)
代码解释:
import jwt
: 导入 Python 的 JWT 库,用于编码和解码 JWT。你需要使用
pip install pyjwt
命令安装该库。
import uuid
: 导入 uuid 库,用于生成唯一的 nonce 值。
access_key = "YOUR_ACCESS_KEY"
: 将你的 Upbit Access Key 替换为
YOUR_ACCESS_KEY
。
secret_key = "YOUR_SECRET_KEY"
: 将你的 Upbit Secret Key 替换为
YOUR_SECRET_KEY
。
请务必注意保护你的 Secret Key。
payload = { ... }
: 创建 JWT 的 payload(负载),payload 包含
access_key
和
nonce
。
access_key
: 你的 Upbit Access Key。
nonce
: 一个随机的、唯一的字符串,用于防止重放攻击。每次生成 JWT 时,都应该生成一个新的 nonce 值。这里使用了
uuid.uuid4()
来生成一个 UUID (Universally Unique Identifier) 作为 nonce。
jwt_token = jwt.encode(payload, secret_key, algorithm='HS256')
: 使用你的 Secret Key 和 HS256 算法对 payload 进行签名,生成 JWT 令牌。HS256 是一种常用的对称加密算法。
authorization_token = f'Bearer {jwt_token}'
: 构建最终的 Authorization token,其格式为
Bearer [JWT 令牌]
。
Bearer
是一种授权方案的名称,表示持有者(bearer)令牌。
print(authorization_token)
: 打印生成的 Authorization token。你可以将此 token 复制到你的 API 请求头中。
使用 Authorization Token 发送请求:
在发送 API 请求时,需要将
authorization_token
添加到 HTTP 请求头的
Authorization
字段中。例如,使用 Python 的
requests
库发送请求:
import requests
url = "https://api.upbit.com/v1/accounts"
headers = {"Authorization": authorization_token}
response = requests.get(url, headers=headers)
print(response.())
这个例子展示了如何获取你的 Upbit 账户信息。 将
url
替换为你要访问的 API 端点,并确保请求头中包含正确的
Authorization
字段。
access_key
: 替换成你的 Access Key。Access Key 用于标识你的身份,类似于用户名。请务必妥善保管你的 Access Key,避免泄露。Access Key 通常在你的账户管理或API设置页面中可以找到。
secret_key
: 替换成你的 Secret Key。Secret Key 用于对请求进行签名,类似于密码。Secret Key 必须严格保密,任何泄露都可能导致安全风险。 不要将 Secret Key 存储在客户端代码中或提交到公共版本控制系统。
nonce
: 一个随机字符串,用于防止重放攻击。 每次请求都必须生成一个新的
nonce
。
nonce
的目的是确保即使攻击者截获了你的请求,也无法重放该请求,因为服务器会验证
nonce
的唯一性。 建议使用高强度的随机数生成器来生成
nonce
,并确保其长度足够长,以增加攻击难度。通常可以使用时间戳结合随机数来生成。
jwt.encode()
: 使用 Access Key 和 Secret Key 对 payload 进行签名,生成 JWT(JSON Web Token)。JWT 是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息,作为 JSON 对象。 签名过程确保 JWT 的完整性,防止数据被篡改。payload 中包含需要传输的数据,例如用户身份信息、权限等。算法通常使用 HMAC SHA256 或 RSA 等。
authorization_token
: 将 JWT 封装成 "Bearer" 格式的 Authorization 头。
Authorization
头是 HTTP 协议中用于身份验证的标准方式。 "Bearer" 是一种授权方案,表明请求携带的是一个令牌(Token)。服务器会验证该令牌的有效性,并根据令牌中包含的信息来授权访问。 完整的 Authorization 头的格式为:
Authorization: Bearer <JWT>
。
获得授权令牌 (Authorization token) 后,便可构建并发送 API 请求。您可以使用各种 HTTP 客户端库来实现此目的。下面的示例展示了如何利用 Python 的
requests
库向 Upbit API 发送经过身份验证的 GET 请求,以获取账户信息。
确保您已安装
requests
库。如果尚未安装,请使用 pip 安装:
pip install requests
以下代码段展示了如何构造带有授权头的 API 请求:
import requests
import jwt
import uuid
import hashlib
# 替换成您的 Upbit 访问密钥和密钥
access_key = "YOUR_ACCESS_KEY"
secret_key = "YOUR_SECRET_KEY"
# 构建 payload,包含访问密钥
payload = {
'access_key': access_key,
'nonce': str(uuid.uuid4())
}
# 使用密钥对 payload 进行签名,生成 JWT
jwt_token = jwt.encode(payload, secret_key, algorithm='HS256')
# 构建 Authorization 头部,包含 JWT
authorization_token = f"Bearer {jwt_token}"
# API 端点 URL
url = "https://api.upbit.com/v1/accounts"
# 设置请求头部,包含 Authorization 令牌
headers = {
"Authorization": authorization_token
}
# 发送 GET 请求
response = requests.get(url, headers=headers)
# 打印响应状态码
print(f"状态码: {response.status_code}")
# 打印响应内容 (JSON 格式)
print(f"响应内容: {response.()}")
代码详解:
requests
用于发送 HTTP 请求,
jwt
用于生成 JSON Web Token (JWT),
uuid
用于生成唯一标识符,
hashlib
用于哈希。
YOUR_ACCESS_KEY
和
YOUR_SECRET_KEY
替换为您在 Upbit 平台获得的真实密钥。
access_key
) 和一个随机数 (
nonce
)。
nonce
用于防止重放攻击,确保每次请求的唯一性。
secret_key
) 对 payload 进行签名,生成 JWT。算法通常使用 HS256。
requests.get()
方法发送 GET 请求到指定的 URL,并包含设置好的 headers。
response.status_code
) 以确认请求是否成功。状态码 200 表示成功。使用
response.()
将响应内容解析为 JSON 格式,并打印出来。
重要提示:
url
: API 接口的统一资源定位符 (URL)。这是用于访问特定 API 端点的地址。请务必使用正确的 URL,包括任何必要的查询参数,以确保请求被路由到预期的资源。
headers
: 请求头,它是一个字典,包含关于 HTTP 请求的元数据。其中,
"Authorization"
字段至关重要,用于传递 JSON Web Token (JWT)。JWT 是一种标准,用于在各方之间安全地传输声明,通常用于身份验证和授权。
"Content-Type"
字段也可能需要,通常设置为
"application/"
,表示请求体是 JSON 格式。其他常见的 header 还包括
"User-Agent"
,用于标识发出请求的客户端。
requests.get()
: 使用 Python 的
requests
库发送 HTTP GET 请求。 GET 请求用于从服务器检索数据。根据 API 接口的设计,也可能需要使用其他 HTTP 方法,例如
requests.post()
用于发送数据到服务器以创建或更新资源,
requests.put()
用于替换现有资源,
requests.patch()
用于部分修改资源,
requests.delete()
用于删除资源。发送 POST, PUT, PATCH 请求时,通常需要在请求中包含
data
或
参数来传递请求体。
response.status_code
: HTTP 状态码,它是一个三位数的数字,指示服务器对请求的处理结果。常见的状态码包括:200 (OK),表示请求成功;201 (Created),表示成功创建了一个新资源;400 (Bad Request),表示客户端请求错误,例如请求格式不正确;401 (Unauthorized),表示客户端未经授权,需要身份验证;403 (Forbidden),表示服务器拒绝了请求,即使客户端已通过身份验证;404 (Not Found),表示服务器找不到请求的资源;500 (Internal Server Error),表示服务器内部错误。理解状态码对于调试 API 交互至关重要。
response.()
: 将 HTTP 响应体解析为 JSON (JavaScript Object Notation) 格式。JSON 是一种轻量级的数据交换格式,易于阅读和编写,也易于机器解析和生成。如果 API 返回的数据不是 JSON 格式,可能需要使用其他方法来解析响应,例如
response.text
获取原始文本内容,或者使用专门的库来解析 XML 或其他数据格式。 确保 API 响应的 Content-Type 是
application/
,否则尝试
response.()
可能会引发错误。
200 OK
: 请求成功。服务器已成功处理请求并返回了请求的内容。这通常表示 API 调用成功,并返回了预期的结果数据。
400 Bad Request
: 客户端请求错误。服务器无法理解或处理该请求,通常是由于请求参数不符合 API 接口的要求,例如缺少必要的参数、参数格式错误或参数值超出有效范围。检查请求参数的名称、类型和取值范围。
401 Unauthorized
: 身份验证失败。客户端未提供有效的身份验证凭据,或提供的凭据无效或已过期。在使用 JWT 身份验证的 API 中,这通常表示 JWT 无效或已过期。客户端需要重新获取有效的 JWT 并将其包含在后续的请求头中。
403 Forbidden
: 禁止访问。服务器理解该请求,但拒绝执行。这通常表示客户端没有访问该 API 接口的权限,即使提供了有效的身份验证凭据。联系 API 提供商确认是否有访问该 API 接口的权限或需要进行额外的授权。
429 Too Many Requests
: 请求过多。客户端在短时间内发送了过多的请求,触发了 Upbit 的限流策略。API 提供商通常会限制客户端在一定时间内可以发送的请求数量,以防止服务器过载。客户端需要降低请求频率,并根据 API 提供商提供的限流策略进行调整,例如使用指数退避算法重试请求。
500 Internal Server Error
: 服务器内部错误。服务器在处理请求时遇到了意外错误,无法完成请求。这通常是服务器端的问题,客户端无法直接解决。客户端可以稍后重试请求,或联系 Upbit 技术支持寻求帮助。服务器错误日志可能会包含关于错误的更多详细信息。
本节展示如何通过API提交交易订单。以下是一个使用Python编写的示例,演示了创建限价买单的过程。
导入必要的Python库。
requests
用于发送HTTP请求,
uuid
用于生成唯一标识符(nonce),
jwt
用于创建JSON Web Token (JWT),
hashlib
用于计算哈希值,
urllib.parse
用于编码URL查询字符串。
import requests
import uuid
import jwt
import hashlib
import urllib.parse
设置API密钥。将
YOUR_ACCESS_KEY
和
YOUR_SECRET_KEY
替换为你的Upbit账户的实际密钥。访问密钥用于标识你的账户,密钥则用于签名请求以确保安全。
access_key = "YOUR_ACCESS_KEY"
secret_key = "YOUR_SECRET_KEY"
定义订单参数。
market
指定交易对(例如,"KRW-BTC"表示韩元兑比特币),
side
指定买卖方向("bid"为买入,"ask"为卖出),
volume
指定订单数量,
price
指定订单价格,
order_method
指定订单类型("limit"为限价单,"price"为市价单,"market"指定买卖方向的市价单)。
market = "KRW-BTC"
side = "bid" # "bid" for buy, "ask" for sell
volume = 0.0001 # Quantity of order
price = 50000000 # Price of order
order_method = "limit" # "limit", "price", "market"
构建查询参数。将订单参数组合成一个字典,然后使用
urllib.parse.urlencode
将其编码为URL查询字符串。编码过程将字典转换为适合包含在URL中的字符串。
query = {
'market': market,
'side': side,
'volume': volume,
'price': price,
'ord_type': order_method,
}
query_string = urllib.parse.urlencode(query).encode()
计算查询哈希值。使用SHA512算法对查询字符串进行哈希处理。哈希值用于验证请求的完整性,防止篡改。哈希算法的选择需要在API文档中确认。
m = hashlib.sha512()
m.update(query_string)
query_hash = m.hexdigest()
创建JWT payload。创建一个包含访问密钥、nonce(唯一标识符)、查询哈希值和哈希算法的字典。Nonce确保每个请求都是唯一的,即使重复发送相同的请求,也会被视为不同的交易。
payload = {
'access_key': access_key,
'nonce': str(uuid.uuid4()),
'query_hash': query_hash,
'query_hash_alg': 'SHA512',
}
生成JWT token。使用密钥对payload进行签名,生成JWT token。该token作为授权凭证,用于验证请求的身份。算法通常为HS256,但请参考API文档确认。
jwt_token = jwt.encode(payload, secret_key, algorithm='HS256')
authorization_token = f'Bearer {jwt_token}'
设置API endpoint。指定API的URL,这里是Upbit的订单提交endpoint。
url = "https://api.upbit.com/v1/orders"
构建请求头。在HTTP请求头中添加Authorization字段,值为Bearer加上JWT token。该header用于向服务器验证客户端的身份。
headers = {
"Authorization": authorization_token
}
定义请求数据。将查询参数作为请求数据发送到API。 对于POST请求,数据通常以表单形式发送。
data = query
发送POST请求。使用
requests.post
方法发送POST请求到API endpoint,包含请求头和数据。
response = requests.post(url, headers=headers, data=data)
处理响应。打印HTTP状态码和响应内容。状态码指示请求是否成功(例如,200表示成功),响应内容包含API返回的数据,例如订单ID或者错误信息。
print(response.status_code)
print(response.())
market
: 指定进行交易的交易对。 格式为 "报价货币-基础货币",例如 "KRW-BTC" 表示用韩元 (KRW) 购买比特币 (BTC)。
side
: 表示交易的方向。"bid" 代表买入操作,即希望以指定或市场价格购买一定数量的基础货币;"ask" 代表卖出操作,即希望以指定或市场价格卖出一定数量的基础货币。
volume
: 指示交易的数量,即希望买入或卖出的基础货币的数量。 该数值通常以基础货币的单位表示。
price
: 交易价格。 仅当使用限价单 (
ord_type
为 "limit") 时才需要提供此参数。 该价格代表您希望买入或卖出的特定价格。 如果市场价格未达到指定价格,订单将不会立即执行。
ord_type
: 订单类型,定义订单的执行方式。
"limit"
: 限价单。 允许您指定交易价格 (
price
) 和数量 (
volume
)。 订单只有在市场价格达到或优于指定价格时才会成交。
"price"
: 市价单 (按指定价格买入/卖出)。注意, 部分交易所可能不支持此类型。
"market"
: 市价单 (按当前市场价格买入/卖出)。 订单会立即以当前市场上可用的最佳价格成交。 使用市价单时,通常只需要指定交易数量 (
volume
),而不需要指定价格 (
price
)。
requests.post()
: 使用 Python 的
requests
库发送 HTTP POST 请求到交易所的下单接口。 POST 请求通常用于提交数据到服务器。 在此场景下,是将包含订单信息的 JSON 数据发送到交易所的服务器,以请求执行交易。 确保正确设置请求头 (Headers),例如
Content-Type: application/
,并包含必要的身份验证信息 (例如 JWT)。
在使用 Upbit API 进行交易或数据查询时,务必重视错误处理机制。当 API 请求未能成功执行时,Upbit 服务器会返回包含特定错误码和描述性错误信息的响应。开发者应依据这些错误码和错误信息,实现周全的错误处理逻辑,以确保应用的稳定性和可靠性。以下是几种常见的错误处理策略:
Upbit API 实施了速率限制机制,旨在保护系统免受恶意或意外的大量请求冲击,确保所有用户的稳定服务体验。这种限制并非针对特定用户,而是全局性的,适用于所有访问 Upbit API 的客户端。
不同的 API 接口根据其功能和资源消耗,设置了不同的速率限制。例如,交易相关的接口可能比获取市场信息的接口具有更严格的限制,这是为了保障交易系统的稳定性和安全性。开发者在使用 Upbit API 前,务必详细查阅官方文档,了解每个接口的具体速率限制规则,包括每分钟或每秒钟允许的最大请求数量。
开发者在集成 Upbit API 时,必须谨慎控制请求频率,避免超出设定的速率限制。建议采用以下策略:
当客户端请求超出速率限制时,Upbit API 将返回 HTTP 状态码 429 (Too Many Requests)。同时,响应头中通常会包含 `Retry-After` 字段,指示客户端应该在多少秒后重试请求。开发者应该捕获 429 错误,并根据 `Retry-After` 字段的提示,暂停发送请求一段时间,然后再尝试重新发送。盲目重试可能会导致更长时间的封禁。
请务必仔细阅读 Upbit 官方文档,其中包含了最新的速率限制策略、错误代码说明以及最佳实践建议。开发者应严格遵守这些规则,以确保应用程序的正常运行和 Upbit API 的稳定使用。
为了简化与 Upbit API 的交互并提升开发效率,开发者可以选择使用软件开发工具包(SDK)。SDK 本质上是一组预先编写好的代码库,它封装了底层 API 请求的复杂性,并以更简洁、更易于理解的方式暴露功能。
相比于直接使用 HTTP 客户端(如 cURL 或其他 HTTP 请求库)手动构建和发送 API 请求,SDK 提供了更高层次的抽象。开发者无需关心诸如 URL 构造、请求头设置、身份验证处理以及响应解析等细节,而是可以通过调用 SDK 提供的预定义函数或类来完成相应的操作。
Upbit 官方提供了 Kotlin 版本的 SDK,方便使用 Kotlin 语言进行开发的工程师。社区和第三方开发者也贡献了多种语言的 SDK,包括但不限于 Python、Java 和 Node.js 等流行编程语言。这意味着开发者可以根据自己的技术栈和偏好选择合适的 SDK,从而快速集成 Upbit API 到自己的应用程序中。
使用 SDK 的优势在于:
因此,在开发与 Upbit 相关的应用程序时,强烈建议考虑使用 SDK 来简化开发流程,提高代码质量,并降低维护成本。开发者可以根据自己的编程语言,搜索并选择由 Upbit 官方或信誉良好的第三方提供的 SDK。