Exmo API 接口中文使用指南
简介
Exmo是一家全球性的加密货币交易所,提供包括但不限于比特币、以太坊、莱特币等多种数字资产的交易服务。为了满足高级用户和开发者的需求,Exmo提供了功能强大的应用程序编程接口(API),允许用户通过编写代码来自动化交易、获取实时市场数据、管理账户信息以及执行其他操作。通过Exmo API,开发者能够构建定制化的交易策略、集成Exmo的数据到自己的应用中,或者开发第三方的交易工具和平台。本文旨在详细介绍Exmo API的各项功能,并提供实际可用的示例代码,旨在帮助开发者快速掌握并有效利用Exmo API,从而在加密货币交易领域实现更高的效率和灵活性。我们将深入探讨API的认证机制、数据格式、请求方法以及常见API调用的实践案例。
准备工作
在使用 Exmo API 之前,你需要完成以下准备工作,确保能够顺利进行后续的API调用和数据交互。
- 注册Exmo账户:访问Exmo官方网站(exmo.com)并创建一个账户。请务必使用真实有效的邮箱地址进行注册,以便接收验证邮件和重要通知。完成注册后,根据平台要求进行身份验证(KYC),这通常需要提供身份证明文件和地址证明等信息。未完成身份验证的账户可能在API使用上受到限制。
创建 API 密钥
登录您的 Exmo 账户,导航至 API 设置页面。该页面通常位于您的个人资料或安全设置部分。您将在该页面生成一对 API 密钥,包括:
- API Key (公钥): 此密钥用于识别您的账户,可以安全地嵌入到您的应用程序代码中。
- Secret Key (私钥): 此密钥用于对您的 API 请求进行签名,是验证您身份的关键。 请务必极其谨慎地保管您的 Secret Key。绝对不要与任何人分享,也不要将其存储在不安全的位置,如版本控制系统或公共服务器。 一旦泄露,他人可以利用您的私钥进行未经授权的操作,可能导致资金损失。
强烈建议启用双因素认证(2FA)以增加帐户安全性,并定期更换您的API密钥。
了解 API 文档: Exmo 提供了详细的 API 文档,其中包含了所有可用 API 端点的说明、参数、返回值等信息。仔细阅读 API 文档是使用 API 的关键。可以在Exmo官方网站找到API文档。API 认证
Exmo API 采用基于签名的认证机制,以确保交易的安全性和用户的身份验证。每一次向Exmo服务器发起的API请求,都必须附带一个经过特定算法生成的签名。Exmo服务器接收到请求后,会使用同样的算法对签名进行验证,以确认请求的真实性和完整性,从而防止未经授权的访问和潜在的恶意操作。
这种基于签名的认证方式,可以有效防止中间人攻击和其他类型的安全威胁,确保只有持有有效密钥的用户才能执行交易或访问账户信息。签名算法的具体细节,对于开发者来说至关重要,需要严格遵循Exmo官方文档的指导。
构建请求参数字符串: 将所有请求参数按照字母顺序排序,并将键值对连接成字符串。例如,如果参数为{'pair': 'BTC_USD', 'limit': 100}
,排序后的字符串为 limit=100&pair=BTC_USD
。
Secret Key
对请求参数字符串进行 HMAC-SHA512 加密。API Key
作为 Key
请求头,将签名作为 Sign
请求头添加到 HTTP 请求中。常用 API 端点
以下是一些常用的 Exmo API 端点,它们允许开发者访问 Exmo 交易所的数据和功能。这些端点提供了关于交易对、订单簿、交易历史、用户账户信息等的各种信息。正确使用这些端点需要有效的 API 密钥和遵循 Exmo 的 API 使用条款。
/v1.1/ticker: 获取所有交易对的实时行情信息。代码示例 (Python)
以下是一个使用 Python 调用 Exmo API 获取账户信息的示例。该示例展示了如何构建 API 请求,包括生成签名以确保请求的安全性。
import hashlib
import hmac
import time
import urllib.parse
import requests
上述代码片段导入了必要的 Python 库。
hashlib
库用于创建加密哈希,
hmac
库用于生成 HMAC(Keyed-Hashing for Message Authentication),
time
库用于获取当前时间戳,
urllib.parse
用于编码 URL 参数,而
requests
库则用于发送 HTTP 请求。使用这些库可以安全有效地与 Exmo API 进行交互。
替换为你的 API Key 和 Secret Key
在使用 EXMO API 之前,必须将以下变量替换为你的实际 API Key 和 Secret Key。这些密钥用于验证你的身份并授权你访问账户信息和执行交易。
API_KEY = "YOUR_API_KEY"
SECRET_KEY = "YOUR_SECRET_KEY"
generate_signature(params, secret_key)
函数用于创建 API 请求的签名,确保请求的完整性和真实性。该签名使用 HMAC-SHA512 算法,结合请求参数和你的 Secret Key 生成。
def generate_signature(params, secret_key):
"""生成 API 签名."""
params_string = urllib.parse.urlencode(sorted(params.items()))
signature = hmac.new(
secret_key.encode('utf-8'),
params_string.encode('utf-8'),
hashlib.sha512
).hexdigest()
return signature
get_user_info()
函数演示了如何使用 EXMO API 获取用户账户信息。它构建 API 请求,添加必要的头部信息(包括 API Key 和签名),并处理 API 响应。
def get_user_info():
"""获取用户账户信息."""
url = "https://api.exmo.com/v1.1/user_info"
params = {
"nonce": int(round(time.time() * 1000)) # 使用毫秒级时间戳作为 nonce
}
signature = generate_signature(params, SECRET_KEY)
headers = {
"Key": API_KEY,
"Sign": signature
}
try:
response = requests.post(url, headers=headers, data=params)
response.raise_for_status() # 检查 HTTP 状态码
data = response.()
print(data) # 输出账户信息
return data
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
return None
except ValueError as e:
print(f"JSON 解析失败: {e}")
return None
在
headers
中,
Key
字段设置为你的
API_KEY
,
Sign
字段设置为使用
generate_signature()
函数生成的签名。
nonce
参数是防止重放攻击的时间戳,以毫秒为单位生成。
使用
requests.post()
发送 POST 请求到 EXMO API 的
/v1.1/user_info
端点。
response.raise_for_status()
会在 HTTP 响应状态码指示错误时抛出异常。API 响应以 JSON 格式返回,并使用
response.()
解析。
错误处理包括捕获
requests.exceptions.RequestException
(例如网络连接错误) 和
ValueError
(例如 JSON 解析错误)。如果发生任何错误,函数将打印错误消息并返回
None
。
if __name__ == "__main__":
get_user_info()
这段代码确保
get_user_info()
函数只有在脚本作为主程序运行时才会被调用。这允许你将此代码作为模块导入到其他脚本中,而无需立即执行
get_user_info()
函数。
代码说明:
- 详细的代码注释,解释每一行代码的目的和功能,例如变量定义、函数调用、循环结构和条件判断。对于复杂的算法,提供步骤分解和数学原理说明,确保代码逻辑清晰易懂。
hashlib
, hmac
, time
, urllib.parse
, requests
.
generate_signature
函数: 该函数用于生成 API 签名。它接收请求参数和 Secret Key
作为输入,并返回签名字符串。 注意使用了 urllib.parse.urlencode
对参数进行URL编码。get_user_info
函数: 该函数调用 /v1.1/user_info
端点获取用户账户信息。
- 构造请求参数,包括
nonce
(一个随机数,用于防止重放攻击). 这里使用了毫秒级的时间戳作为 nonce,更精确。 - 生成签名。
- 设置请求头,包括
API Key
和签名。 - 发送 POST 请求。
- 处理响应,包括检查 HTTP 状态码和解析 JSON 数据。
- 添加了错误处理,捕获请求异常和 JSON 解析异常。
get_user_info
函数并打印结果。运行代码:
-
确保已经安装了 Python 的
requests
库。这个库是发送 HTTP 请求的核心工具,方便与交易所 API 进行交互。如果尚未安装,可以通过在命令行或终端中执行pip install requests
命令来安装。pip
是 Python 的包管理器,用于安装和管理第三方库。 -
在代码中,务必将占位符
YOUR_API_KEY
和YOUR_SECRET_KEY
替换成你在交易所申请到的真实 API 密钥。API 密钥通常由一个公共密钥 (API Key) 和一个私有密钥 (Secret Key) 组成。公共密钥用于标识你的身份,私有密钥用于对请求进行签名,确保安全性。妥善保管你的私有密钥,切勿泄露给他人,否则可能导致资金损失。API 密钥的申请流程通常在交易所的开发者文档或 API 管理页面可以找到。 -
完成上述配置后,就可以运行脚本了。在运行之前,建议仔细检查代码,确保 API 密钥已正确配置,并且代码逻辑符合预期。运行脚本的方式取决于你使用的开发环境,例如可以在命令行中执行
python your_script_name.py
,或者在集成开发环境 (IDE) 中直接运行。运行过程中,注意观察输出信息,以便及时发现和解决问题。
交易
在加密货币交易中,通过API接口进行自动化交易已经成为一种常见的做法。Exmo 交易所提供了一套API,允许开发者使用编程语言(如 Python)与其平台进行交互,执行诸如下单、查询账户余额、获取市场数据等操作。
以下是一个使用 Python 调用 Exmo API 创建市价买单的示例。此示例展示了如何构建请求、计算签名并发送到Exmo API服务器。请注意,你需要拥有一个Exmo账户,并且创建API密钥和密钥才能使用该功能,并且需要进行相应的权限设置。为了保证安全,API密钥和密钥请勿泄露,并妥善保管。
import hashlib
import hmac
import time
import urllib.parse
import requests
这些是Python代码中需要用到的库:
-
hashlib
: 提供了多种哈希算法,用于创建安全的消息摘要,本例中用于计算API请求的签名。 -
hmac
: 用于创建带密钥的哈希消息认证码,这对于验证请求的完整性和真实性至关重要。 -
time
: 提供了时间相关的功能,本例中使用它来获取当前时间戳,作为API请求的一部分。 -
urllib.parse
: 用于解析和构建URL,确保API请求的参数格式正确。 -
requests
: 是一个流行的HTTP库,用于发送HTTP请求,例如向Exmo API服务器发送下单请求。
在实际应用中,需要将API密钥、密钥以及交易参数(例如交易对、购买数量)替换为实际值。还应该添加错误处理机制,以应对API调用失败的情况。例如,检查HTTP响应状态码,处理可能的异常,并记录日志以便于调试。
替换为你的 API Key 和 Secret Key
API_KEY = "YOUR_API_KEY"
SECRET_KEY = "YOUR_SECRET_KEY"
def generate_signature(params, secret_key):
"""生成 API 签名."""
# 将参数字典按照键名进行排序,并转换为 URL 编码的字符串。
params_string = urllib.parse.urlencode(sorted(params.items()))
# 使用 HMAC-SHA512 算法对参数字符串进行签名。
signature = hmac.new(
secret_key.encode('utf-8'),
params_string.encode('utf-8'),
hashlib.sha512
).hexdigest()
return signature
def create_market_buy_order(pair, quantity):
"""创建市价买单."""
# Exmo API 的订单创建接口 URL。
url = "https://api.exmo.com/v1.1/order_create"
# 构造请求参数。
params = {
"pair": pair,
"quantity": quantity,
"type": "market_buy",
"price": "0", # 市价单价格设置为0,表示以当前市场最优价格成交。
"nonce": int(round(time.time() * 1000)) # nonce 是一个唯一的时间戳,用于防止重放攻击。
}
# 使用私钥对请求参数进行签名。
signature = generate_signature(params, SECRET_KEY)
headers = {
"Key": API_KEY, # API 密钥,用于身份验证。
"Sign": signature # 请求签名,用于验证请求的完整性和真实性。
}
try:
# 使用 POST 方法向 Exmo API 发送请求。
response = requests.post(url, headers=headers, data=params)
# 检查 HTTP 响应状态码,如果不是 200,则抛出异常。
response.raise_for_status()
# 将响应内容解析为 JSON 格式。
data = response.()
# 打印响应数据。
print(data)
return data
except requests.exceptions.RequestException as e:
# 处理请求异常,例如网络错误、超时等。
print(f"请求失败: {e}")
return None
except ValueError as e:
# 处理 JSON 解析异常,例如响应内容不是有效的 JSON 格式。
print(f"JSON 解析失败: {e}")
return None
if __name__ == "__main__":
# 交易对和购买数量
trading_pair = "BTC_USD" # 指定交易对,例如 BTC/USD。
buy_quantity = "0.001" # 例如购买 0.001 BTC
create_market_buy_order(trading_pair, buy_quantity)
注意: 市价单的价格price
设置为"0"
。
错误处理
Exmo API 在交互过程中可能会返回多种错误代码,作为专业的加密货币开发者,理解并妥善处理这些错误代码至关重要,它直接关系到应用程序的稳定性和用户体验。开发者必须根据不同的错误代码采取相应的处理措施,例如重试、记录日志或通知用户。以下列出一些常见的错误代码及其含义:
-
400
: 客户端发出的请求参数不符合API的要求。这通常表示请求中缺少必要的参数,或者参数的格式不正确。开发者应仔细检查请求参数,并根据API文档进行修正。 -
401
: 认证失败,通常是由于API密钥无效或未正确配置。开发者应检查API密钥是否已正确设置,并确保其与Exmo账户关联。请注意,某些API端点可能需要特定的权限,确保API密钥具有足够的权限。 -
429
: 请求频率过高,超过了Exmo API的限制。为了防止滥用,Exmo会对API请求的频率进行限制。开发者应实施速率限制策略,例如使用令牌桶算法或漏桶算法,以避免超出限制。也可以使用指数退避算法进行重试。 -
500
: 服务器内部错误,表示Exmo服务器在处理请求时遇到了未知的错误。这通常是Exmo方面的问题,开发者可以稍后重试请求。如果错误持续发生,建议联系Exmo技术支持。
在代码中添加完善的错误处理机制是至关重要的,它可以有效提高应用程序的健壮性和可靠性。可以通过检查
response.status_code
属性来获取HTTP状态码,并基于不同的状态码判断请求是否成功。例如,200 表示成功,而 4xx 或 5xx 表示错误。还可以检查返回的JSON数据中的
result
字段。如果该字段的值为
false
,则表示请求失败,此时
error
字段通常会包含更详细的错误信息,例如错误代码和错误描述。开发者应该解析
error
字段的内容,并根据错误类型采取相应的处理措施。例如,可以根据错误代码进行重试、记录日志或向用户显示错误消息。务必记录详细的错误日志,以便于问题排查和调试。在处理错误时,需要考虑到网络延迟、服务中断等因素,并采取相应的容错措施,例如使用超时机制和重试机制。通过全面的错误处理,可以显著提高应用程序的稳定性和用户体验。
Exmo API 提供了一系列强大的功能,开发者可以利用这些功能构建各种加密货币交易应用程序。希望本文能够帮助你快速入门 Exmo API。 记住,安全至关重要,务必妥善保管你的 API 密钥。