Upbit 平台的 API 使用教程
Upbit 是韩国领先的加密货币交易所,提供广泛的加密货币交易对。对于希望自动化交易策略、构建数据分析工具或集成 Upbit 数据到其他应用程序的开发者来说,Upbit 的 API 提供了一个强大的解决方案。本教程将引导你了解如何使用 Upbit API,包括身份验证、常用 API 端点以及示例代码。
1. 获取 Upbit API 密钥
要开始使用 Upbit API,您必须首先获取一对 API 密钥:Access Key 和 Secret Key。这些密钥用于验证您的身份,并授权您访问 Upbit 的各种 API 端点。以下是获取 API 密钥的详细步骤:
- 登录 Upbit 账户: 前往 Upbit 官方网站 ( https://upbit.com ) 并使用您的用户名和密码登录。如果您还没有 Upbit 账户,则需要先进行注册。注册过程通常需要提供您的身份证明文件,并完成 KYC (了解您的客户) 验证流程。
- 开启 2FA (双因素认证): 为了增强账户的安全性,Upbit 强制要求启用双因素认证后才能生成 API 密钥。在您的账户设置或安全设置中找到 2FA 选项。Upbit 支持多种 2FA 方式,例如 Google Authenticator 或 SMS 验证码。选择您偏好的方式并按照说明进行设置。启用 2FA 后,每次登录或进行敏感操作时,您都需要输入一个动态生成的验证码。
- 生成 API 密钥: 成功登录并启用 2FA 后,导航至“开放 API 管理”页面。该页面通常可以在账户设置、安全设置或个人资料设置中找到。寻找类似“API 키 발급” (API 密钥颁发) 或 “API 密钥管理”的按钮,然后点击它。
-
设置权限:
在生成 API 密钥的过程中,您需要仔细选择 API 密钥的权限。权限控制着 API 密钥可以访问和操作的 Upbit 功能。常见的权限类型包括:
- 交易权限 (Trade): 授予 API 密钥进行交易操作的能力。这包括下单买入或卖出加密货币、取消未成交的订单、查询订单状态等。请谨慎授予此权限,因为它允许使用您的账户资金进行交易。
- 查询权限 (Info): 允许 API 密钥查询账户信息、市场数据和历史交易记录等。您可以使用此权限获取账户余额、查询特定交易对的最新价格、获取深度行情数据等。此权限相对安全,因为它不涉及资金操作。
- 提现权限 (Withdrawal): 允许API密钥发起提现请求,将资金从Upbit账户转移到外部地址。**此权限极其危险,强烈建议不要授予。**
在选择权限时,请遵循最小权限原则,即仅授予 API 密钥完成其任务所需的最低权限。 务必小心选择权限,避免授予不必要的权限,以最大限度地确保账户安全。 例如,如果您仅需要使用 API 查询市场数据,则只需授予查询权限即可。 特别是如果您的密钥可能暴露,只授予查询权限是明智之举。避免授予交易或提现权限,以防止潜在的资金损失。
- 输入 API 密钥名称和 IP 白名单 (可选): 为了方便管理您的 API 密钥,您可以为其设置一个易于识别的名称。例如,您可以根据密钥的用途或所使用的应用程序来命名。为了进一步提高安全性,您可以选择将 API 密钥限制为只能从指定的 IP 地址访问。这称为 IP 白名单。如果启用了 IP 白名单,则只有来自白名单中的 IP 地址的 API 请求才会被允许。填写完信息后,点击“확인” (确认) 按钮。
-
获取 API 密钥:
成功生成 API 密钥后,您会获得两个至关重要的字符串:
- Access Key: Access Key 相当于您的公钥,用于标识您的账户。您需要在 API 请求中使用 Access Key 来声明您的身份。
- Secret Key: Secret Key 相当于您的私钥,用于对 API 请求进行签名,以证明请求的真实性和完整性。 请务必妥善保管您的 Secret Key,切勿将其泄露给任何人。 泄露 Secret Key 可能会导致您的账户被盗用,造成严重的资金损失。不要将 Secret Key 存储在不安全的地方,例如公共代码仓库或未加密的配置文件中。
2. 身份验证
Upbit API 采用 JSON Web Token (JWT) 机制进行严格的身份验证。为了确保安全通信,你需要使用你的 Access Key 和 Secret Key 生成一个有效的 JWT token,并在每一个API请求的
Authorization
请求头中携带该token。 Access Key 和 Secret Key 是 Upbit 提供给你的唯一身份凭证,请务必妥善保管,切勿泄露。
JWT token 的生成过程包含以下关键步骤:创建一个包含必要信息的 payload (负载),例如你的 Access Key 和一个唯一的 nonce (随机数)。nonce 用于防止重放攻击,保证每次请求的唯一性。 然后,使用你的 Secret Key 对 payload 进行签名,生成最终的 JWT token。 Upbit API 期望的签名算法为 HS256,即使用 SHA256 算法进行哈希运算。
以下是一个使用 Python 语言生成 JWT token 的示例代码,你可以根据自己的编程环境进行调整:
import jwt
import uuid
import hashlib
from urllib.parse import urlencode
access_key = "YOUR_ACCESS_KEY" # 替换为你的 Access Key
secret_key = "YOUR_SECRET_KEY" # 替换为你的 Secret Key
def generate_jwt_token(access_key, secret_key):
"""
生成 JWT token 的函数。
Args:
access_key (str): 你的 Upbit Access Key。
secret_key (str): 你的 Upbit Secret Key。
Returns:
str: 生成的 JWT token。
"""
payload = {
'access_key': access_key,
'nonce': str(uuid.uuid4()) # 使用 UUID 生成唯一的 nonce
}
jwt_token = jwt.encode(payload, secret_key, algorithm='HS256') # 使用 HS256 算法进行签名
return jwt_token
jwt_token = generate_jwt_token(access_key, secret_key)
authorization = f'Bearer {jwt_token}'
print(authorization)
代码解释:
uuid.uuid4()
函数用于生成一个随机的 UUID (Universally Unique Identifier),保证 nonce 的唯一性。
jwt.encode()
函数使用 pyjwt 库对 payload 进行编码和签名,生成 JWT token。
algorithm='HS256'
参数指定了签名算法为 HMAC SHA256。 将生成的 JWT token 添加到
Authorization
请求头中,格式为
Bearer {jwt_token}
。 注意替换代码中的
YOUR_ACCESS_KEY
和
YOUR_SECRET_KEY
为你的实际密钥。 请确保你已经安装了
pyjwt
库:
pip install pyjwt
。
重要提示:
-
请务必将代码中的
YOUR_ACCESS_KEY
和YOUR_SECRET_KEY
替换成您在加密货币交易所或服务提供商处获得的真实有效的 Access Key 和 Secret Key。Access Key 用于标识您的身份,Secret Key 用于对请求进行签名,确保请求的安全性。泄露您的 Secret Key 可能导致资产损失,请妥善保管。切勿将这些密钥存储在不安全的地方,如公开的代码仓库或配置文件中。建议使用环境变量或专门的密钥管理服务来安全存储和管理这些敏感信息。 -
nonce
(随机数) 在生成 JSON Web Token (JWT) 时扮演着至关重要的角色,它主要用于防御重放攻击。重放攻击是指攻击者截获并重新发送之前的有效请求。通过引入nonce
,每次生成 JWT Token 都需要使用一个唯一的随机数,即使攻击者截获了之前的 JWT,由于nonce
的唯一性,该 JWT 也无法被再次使用。uuid.uuid4()
是一个 Python 函数,专门用于生成符合 UUID (Universally Unique Identifier) 标准的随机 ID。UUID 是一种由算法生成的 128 位数字,具有极高的唯一性,几乎可以保证在时间和空间上的唯一性。因此,使用uuid.uuid4()
生成nonce
可以有效地防止重放攻击,提高系统的安全性。在实际应用中,确保nonce
的生成足够随机且唯一非常重要。
3. 常用 API 端点
Upbit API 提供了功能全面的端点,涵盖了广泛的加密货币市场数据、用户账户管理以及交易执行等重要功能。以下是一些常用的 API 端点,它们是与 Upbit 交易所交互的核心:
-
市场行情 API:
-
/v1/market/all
: 获取 Upbit 交易所支持的所有交易市场的代码列表。此端点返回每个交易对的唯一标识符,例如 "KRW-BTC" 代表韩元计价的比特币市场。 -
/v1/ticker
: 获取指定交易市场当前的实时交易信息,包括当前价格、最新成交量、24 小时价格变动百分比等关键指标。必须提供markets
参数,指定要查询的一个或多个交易市场代码,多个市场代码之间用逗号分隔,例如KRW-BTC,KRW-ETH
,这将返回比特币和以太坊的实时行情数据。 -
/v1/trades/ticks
: 获取指定交易市场最近发生的成交记录列表,包括成交时间、成交价格和成交数量等详细信息。使用market
参数指定要查询的交易市场代码,例如KRW-XRP
,以获取瑞波币的最新成交记录。
-
-
账户 API:
-
/v1/accounts
: 获取经过身份验证的用户所有账户的详细信息,包括每个账户持有的币种、可用余额、冻结余额等。此端点需要进行身份验证,以确保账户信息的安全性。
-
-
交易 API:
-
/v1/orders
: 创建新的交易订单。需要提供一系列必要的参数来定义订单的细节,例如market
(交易市场代码,例如KRW-BTC
),side
(交易方向,买入 "bid" 或卖出 "ask"),volume
(交易数量,即购买或出售的币种数量),price
(订单价格,仅在限价单中需要指定),ord_type
(订单类型,可以是limit
限价单、price
市价单或market
指定数量市价单)。为了安全地执行交易,需要进行身份验证并获得交易权限。 -
/v1/order
: 查询特定订单的详细信息。必须提供uuid
(订单的唯一通用标识符)或identifier
(用户自定义的订单标识符)参数来指定要查询的订单。只有经过身份验证的用户才能访问此端点。 -
/v1/order/cancel
: 取消尚未成交的订单。需要提供uuid
(订单的唯一通用标识符)或identifier
(用户自定义的订单标识符)参数来指定要取消的订单。只有经过身份验证的用户才能取消其自己的订单。
-
4. 发送 API 请求
与 Upbit API 的交互主要通过发送 HTTP 请求实现。你可以选择任何你熟悉的 HTTP 客户端库来发送 API 请求。为了保证安全性,你的请求需要包含适当的身份验证信息。以下是一个使用 Python 的
requests
库发送 API 请求的示例,它展示了如何使用之前生成的 JWT (JSON Web Token) 进行身份验证:
为了成功发送 API 请求,你需要确保已经安装了
requests
库。如果没有安装,可以使用 pip 进行安装:
pip install requests
接下来,你可以使用以下代码来发送 API 请求:
import requests
import
# 你的 Upbit API 访问密钥和秘密密钥 (请勿在代码中硬编码,推荐使用环境变量或配置文件)
access_key = "YOUR_ACCESS_KEY"
secret_key = "YOUR_SECRET_KEY"
# 生成 JWT Token 的函数 (请参考上一步骤的示例)
def generate_jwt_token(access_key, secret_key):
import jwt
import uuid
payload = {
'access_key': access_key,
'nonce': str(uuid.uuid4())
}
jwt_token = jwt.encode(payload, secret_key, algorithm='HS256')
return jwt_token
# 生成 JWT Token
jwt_token = generate_jwt_token(access_key, secret_key)
# API 端点 URL (例如:查询账户信息的接口)
url = "https://api.upbit.com/v1/accounts"
# 构建 Authorization 请求头,包含 Bearer 认证信息 (JWT Token)
headers = {"Authorization": f"Bearer {jwt_token}"}
try:
# 发送 GET 请求
response = requests.get(url, headers=headers)
# 检查响应状态码
if response.status_code == 200:
# 解析 JSON 响应
data = response.()
# 打印响应数据 (可以根据需要进行处理)
print(.dumps(data, indent=4)) # 使用 .dumps 格式化输出,提高可读性
else:
# 打印错误信息,包括状态码和响应内容
print(f"Error: {response.status_code} - {response.text}")
except requests.exceptions.RequestException as e:
# 捕获请求异常 (例如:网络连接错误)
print(f"Request failed: {e}")
代码解释:
-
import requests
: 导入requests
库,用于发送 HTTP 请求。 -
import
: 导入 -
access_key
和secret_key
: 替换为你实际的 Upbit API 访问密钥和秘密密钥。强烈建议不要在代码中硬编码这些密钥,而是使用环境变量或配置文件来存储。 -
generate_jwt_token(access_key, secret_key)
:使用你的访问密钥和秘密密钥生成 JWT Token。该函数需要 `jwt` 和 `uuid` 库。 -
url
: 设置你要访问的 Upbit API 端点 URL。例如,"https://api.upbit.com/v1/accounts"
用于查询你的账户信息。 -
headers
: 创建一个包含Authorization
头的字典。Authorization
头的值使用 "Bearer " 前缀加上你的 JWT Token。 -
response = requests.get(url, headers=headers)
: 使用requests.get()
函数发送 GET 请求到指定的 URL,并传递请求头。 -
response.status_code
: 检查 HTTP 响应状态码。200 表示请求成功。 -
response.()
: 将响应内容解析为 JSON 格式的数据。 -
response.text
: 获取原始的响应文本。 -
.dumps(data, indent=4)
: 使用 .dumps 格式化输出 JSON 数据,`indent=4` 表示缩进 4 个空格,提高可读性。 -
try...except
块:用于捕获可能发生的异常,例如网络连接错误。
注意事项:
-
替换
YOUR_ACCESS_KEY
和YOUR_SECRET_KEY
为你真实的 Upbit API 密钥。 - 务必安全地存储你的 API 密钥。不要将它们硬编码到代码中,并避免将它们提交到公共代码仓库。
-
根据你要调用的 API 端点,修改
url
变量。 - Upbit API 可能会限制请求频率。如果遇到速率限制错误,请参考 Upbit API 文档调整你的请求策略。
- 仔细阅读 Upbit API 文档,了解每个 API 端点的参数、响应格式和错误代码。
-
根据不同的 API 接口的需求,可能需要发送 POST, PUT, DELETE 等其他类型的 HTTP 请求。
requests
库提供了相应的方法,例如requests.post()
,requests.put()
,requests.delete()
。
重要提示:
-
请务必将代码中的
url
替换为你需要访问的真实 API 端点。该 URL 指向服务器上处理特定请求的资源地址,例如获取用户信息、提交交易等。 -
在 HTTP 请求的
headers
部分,请务必包含Authorization
Header,其值为Bearer {jwt_token}
。其中,{jwt_token}
是你通过身份验证过程成功获取的 JSON Web Token (JWT)。该 JWT token 包含了用户的身份信息和授权信息,用于验证用户的身份,允许其访问受保护的 API 资源。请确保 JWT token 的正确性和时效性。 -
仔细检查 HTTP 响应的
response.status_code
。如果状态码不是 200,则表明 API 请求未能成功执行。200 状态码表示 "OK",即服务器成功处理了请求。其他状态码,如 400(错误请求)、401(未授权)、403(禁止访问)、404(未找到)或 500(服务器内部错误)等,都指示请求遇到了问题。仔细查看response.text
的内容,它通常包含服务器返回的详细错误信息,例如错误类型、错误描述和可能的解决方案。根据错误信息,你可以调试代码、检查请求参数、验证权限设置或联系 API 提供方寻求帮助。
5. 错误处理
在使用 Upbit API 进行数据交互时,理解并妥善处理可能出现的错误至关重要。Upbit API 使用标准的 HTTP 状态码来指示请求的结果,通过这些状态码,开发者可以快速定位问题并采取相应的措施。常见的状态码及其含义包括:
- 200 OK: 这是最理想的状态,表明请求已成功处理并返回了预期的数据。
- 400 Bad Request: 客户端发出的请求存在语法错误或缺少必要的参数。仔细检查请求的 URL、请求头和请求体,确保所有参数都符合 Upbit API 的规范。常见的错误包括参数类型错误、参数值超出范围或缺少必需的参数。
- 401 Unauthorized: 身份验证失败,通常是由于 API 密钥不正确或未激活造成的。确保你已正确配置 API 密钥,并且该密钥已在 Upbit 平台激活。检查 API 密钥和 Secret 密钥是否正确,并确认账户权限是否足够。
- 429 Too Many Requests: 你的请求频率超过了 Upbit API 的限制。Upbit API 有严格的请求频率限制,以防止滥用和维护服务器的稳定性。实施速率限制策略,例如使用指数退避算法,在每次收到 429 错误后逐渐增加重试之间的时间间隔。
- 500 Internal Server Error: 服务器端发生错误,这通常是 Upbit 自身的问题,而非客户端的问题。如果频繁遇到此错误,建议稍后重试或联系 Upbit 技术支持。
在编写代码时,必须包含完善的错误处理机制。
try-except
块是处理 API 请求异常的有效方法。你可以捕获
requests.exceptions.RequestException
异常,该异常是所有与请求相关的异常的基类,并根据具体的错误类型采取不同的处理策略。例如,可以记录错误日志,通知管理员,或在适当的情况下重试请求。对于 429 错误,建议采用指数退避策略,以避免进一步加剧服务器的负担。
6. 速率限制
Upbit API 实施了速率限制策略,旨在防止API的滥用并保障所有用户的服务质量。这些速率限制规则并非一成不变,可能会根据系统负载、API功能以及安全需求进行调整。因此,强烈建议开发者定期查阅 Upbit 官方 API 文档,以便及时了解最新的速率限制详情和任何更新。
当您的请求频率超过了允许的限制,API 将会返回一个 HTTP 429 状态码,表明“请求过多”。此时,您需要暂停发送新的请求,并等待一段时间后才能继续访问。为了应对这种情况,建议在您的应用程序代码中实现智能的重试机制。该机制应能够检测到 429 错误,并自动在适当的延迟后重新尝试发送请求,从而提高程序的健壮性和用户体验。
更进一步,Upbit API 响应的 HTTP Header 中通常包含了有关剩余请求次数和速率限制重置时间的关键信息。通过解析这些 Header 信息,您可以更加精确地监控您的 API 使用情况,并根据剩余的请求次数动态调整请求频率,从而避免达到速率限制,并确保您的应用程序能够高效、稳定地与 Upbit API 进行交互。例如,您可以根据
X-RateLimit-Remaining
和
X-RateLimit-Reset
等 Header 字段来动态调整请求发送频率。