Exmo API 使用教程
简介
Exmo 交易所提供了一套功能强大的应用程序编程接口 (API),允许开发者以编程方式访问其交易平台,从而实现自动化交易、深度数据分析、策略回测以及投资组合管理等高级功能。本教程专为中文用户设计,旨在提供一个全面且易于理解的 Exmo API 使用指南。我们将深入探讨 API 的各个方面,包括认证机制、数据格式、可用端点和最佳实践,帮助您快速上手并利用 API 构建各种定制化的加密货币应用程序,例如自动化交易机器人、实时价格监控工具、自定义图表分析平台等。通过本指南,您将能够有效地与 Exmo 交易所进行交互,提升您的交易效率和决策能力。
API 密钥获取
在使用 Exmo API 之前,必须先获得 API 密钥。API 密钥是访问 Exmo 交易平台功能的凭证,类似于用户身份验证,允许您的应用程序或脚本安全地与 Exmo 服务器进行交互。以下详细步骤说明如何获取 API 密钥:
- 登录 Exmo 账户: 访问 Exmo 官方网站 (exmo.com) 并使用您的用户名和密码登录您的账户。如果您还没有账户,需要先注册一个。注册过程通常需要提供您的电子邮件地址、设置密码,并可能需要进行身份验证 (KYC) 才能完全访问所有功能。
- 进入 API 设置页面: 成功登录后,导航到您的账户设置,通常可以在 "Profile" 或 "Settings" 菜单中找到名为 "API"、"API Keys" 或类似的选项。该页面是管理 API 密钥的中心。
- 创建新的 API 密钥: 在 API 设置页面,点击 "Create new key"、"Generate API Key" 或类似的按钮,开始创建一个新的 API 密钥。根据 Exmo 的设计,您可能需要为该 API 密钥提供一个描述性的名称,以便于识别和管理不同的密钥。
-
配置 API 权限:
创建 API 密钥时,关键步骤是配置密钥的权限。Exmo 允许您为每个密钥设置不同的权限,精细控制密钥可以执行的操作。常见的权限包括:
- 交易 (Trade): 允许密钥执行买入和卖出操作。
- 用户信息读取 (User Info): 允许密钥访问账户余额、交易历史记录和其他用户信息。
- 提款 (Withdrawal): 允许密钥发起提款请求(通常需要额外的安全验证)。
- 钱包信息 (Wallet Info): 允许密钥查询钱包地址等信息
- 保存 API 密钥: 成功创建密钥后,Exmo 将生成两个重要的字符串: API Key (API 密钥) 和 Secret Key (密钥) 。API Key 类似于用户名,用于标识您的应用程序;Secret Key 类似于密码,用于验证 API Key 的请求。请务必妥善保管这两个密钥,切勿泄露给任何人。特别注意,Secret Key 只能在创建时查看一次,之后无法再次显示,因此必须立即将其安全保存到一个安全的地方,例如加密的密码管理器。如果 Secret Key 丢失,出于安全考虑,您将无法恢复它。您需要删除当前密钥并重新生成一个新的密钥。请务必理解并遵守这一规定,以避免潜在的安全风险。将API 密钥存放在服务器端,切勿存储在客户端(如:网页的Javascript代码里)。
API 认证
为了保障用户账户安全并授权访问 Exmo API,平台采用基于签名的身份验证机制。 每个API请求都需要通过Secret Key生成签名进行身份验证,确保请求的真实性和完整性。
API 认证的核心流程如下:
- 构建请求参数: 将所有API请求参数,包括必须包含的 API 方法名称,组织成一个关联数组,或者称为字典 (dictionary)。 这是一个键值对的数据结构,用于传递请求所需的各种信息。例如,交易对、数量、价格等。
-
URL 编码参数:
使用 URL 编码(也称为百分号编码)对关联数组中的所有参数值进行编码。 URL 编码将特殊字符转换为 % 加上两位十六进制数的形式,确保参数在 URL 中能正确传输,避免歧义。例如,空格会被编码为
%20
。 - 参数排序: 对经过 URL 编码的所有参数,按照字母顺序进行升序排列。参数排序是生成签名的前提,保证了签名算法输入的一致性,避免因参数顺序不同导致签名验证失败。
- 生成签名: 使用您的 Secret Key 和 HMAC-SHA512 算法,对经过 URL 编码和排序后的参数字符串进行签名。 HMAC-SHA512 是一种哈希消息认证码算法,结合了密钥和 SHA512 哈希函数,提供了更高的安全性。 不同的编程语言拥有不同的 HMAC-SHA512 实现方法,请根据您使用的编程语言选择相应的库或函数。签名结果是一个唯一的字符串,用于验证请求的合法性。
-
添加 API Key 和签名到请求头:
将您的 API Key 添加到
Key
请求头,并将生成的签名添加到Sign
请求头。 API Key 用于标识您的账户,Secret Key 用于生成签名,签名用于验证请求的真实性。 请求头是 HTTP 请求的一部分,用于传递额外的信息。 在发送 API 请求时,请务必正确设置这两个请求头,否则将无法通过身份验证。
常用 API 方法
以下列举一些常用的 Exmo API 方法,并简要说明其功能、参数和使用方式,以便开发者更好地集成 Exmo 交易所的数据和交易功能。
-
/ticker:
获取当前市场行情信息,包括但不限于指定交易对的买一价、卖一价、最高价、最低价、加权平均价、交易量(24 小时内)、交易额(24 小时内)等。此接口是了解市场动态的关键。
- 请求方式:GET
- 参数:无。该接口默认返回所有交易对的行情数据。如果需要特定交易对的数据,建议结合其他接口或自行过滤。
- 返回数据:包含各种交易对的行情信息的 JSON 对象。JSON 对象的每个键代表一个交易对(例如 "BTC_USD"),对应的值包含了该交易对的各项行情指标。
-
示例:
curl -X GET 'https://api.exmo.com/v1.1/ticker'
-
/order_book:
获取指定交易对的订单簿信息,订单簿是市场深度的直观体现,包括买单(Bid)和卖单(Ask)的价格和数量。通过订单簿可以分析市场的买卖力量对比。
- 请求方式:GET
-
参数:
-
pair
: 交易对名称,例如 "BTC_USD"。 这是必选参数,指定要查询的交易对。 -
limit
: 返回的订单数量上限,可选。默认情况下,API 返回一定数量的订单,可以通过此参数调整返回的数量。较大的 limit 值可能影响响应速度。
-
- 返回数据:包含买单和卖单信息的 JSON 对象。JSON 对象通常包含 "ask" 和 "bid" 两个键,分别对应卖单和买单列表。每个订单通常包含价格和数量信息。
-
示例:
curl -X GET 'https://api.exmo.com/v1.1/order_book?pair=BTC_USD&limit=100'
-
/trades:
获取指定交易对的历史成交记录。成交记录反映了市场上实际发生的交易情况,是分析市场趋势的重要数据来源。 通过分析历史成交记录,可以发现交易量、价格波动等规律。
- 请求方式:GET
-
参数:
-
pair
: 交易对名称,例如 "BTC_USD"。这是必选参数,指定要查询的交易对。 -
limit
: 返回的成交记录数量上限,可选。 用于限制返回的成交记录数量。 -
offset
: 从哪条记录开始返回,可选。 用于分页查询,可以获取指定范围内的成交记录。
-
- 返回数据:包含成交记录信息的 JSON 对象。每条成交记录通常包含成交时间、价格和数量信息。
-
示例:
curl -X GET 'https://api.exmo.com/v1.1/trades?pair=BTC_USD&limit=100'
- /user_info: 获取当前用户的账户信息,包括余额、交易权限、账户状态等。 此接口需要进行 API 认证,确保只有授权用户才能访问其账户信息。
- 请求方式:POST
- 参数:无。
- 需要 API 认证。 必须提供有效的 API Key 和 Secret Key,并通过签名验证请求的合法性。
- 返回数据:包含账户信息的 JSON 对象。 JSON 对象会包含各种币种的余额信息、交易权限状态等。
- 示例 (Python):
- /order_create: 创建一个新的订单,允许用户在市场上进行买入或卖出操作。 创建订单需要指定交易对、数量、价格和订单类型等参数。
- 请求方式:POST
-
参数:
-
pair
: 交易对名称,例如 "BTC_USD"。 这是必选参数,指定要交易的交易对。 -
quantity
: 订单数量。 指定要买入或卖出的数量。 -
price
: 订单价格。 指定订单的买入或卖出价格。 -
type
: 订单类型,可以是 "buy"(买入)或 "sell"(卖出)。 指定订单是买入还是卖出。
-
- 需要 API 认证。 必须提供有效的 API Key 和 Secret Key,并通过签名验证请求的合法性。
- 返回数据:包含订单信息的 JSON 对象。 JSON 对象会包含订单 ID、订单状态等信息。
- 示例 (Python):
- /order_cancel: 取消一个已存在的订单。 如果订单尚未完全成交,用户可以通过此接口取消订单。
- 请求方式:POST
-
参数:
-
order_id
: 订单 ID。 指定要取消的订单的 ID。
-
- 需要 API 认证。 必须提供有效的 API Key 和 Secret Key,并通过签名验证请求的合法性.
-
返回数据:包含取消结果信息的 JSON 对象。 JSON 对象会包含取消操作是否成功的状态信息。
-
示例 (Python):
import hashlib import hmac import urllib.parse import requests import API_KEY = "YOUR_API_KEY" SECRET_KEY = "YOUR_SECRET_KEY" def get_user_info(): url = "https://api.exmo.com/v1.1/user_info" payload = {} # No parameters for user_info encoded_payload = urllib.parse.urlencode(payload) signature = hmac.new(SECRET_KEY.encode('utf-8'), encoded_payload.encode('utf-8'), hashlib.sha512).hexdigest() headers = { "Key": API_KEY, "Sign": signature } response = requests.post(url, headers=headers, data=payload) return response.() user_info = get_user_info() print(.dumps(user_info, indent=4))
import hashlib import hmac import urllib.parse import requests import API_KEY = "YOUR_API_KEY" SECRET_KEY = "YOUR_SECRET_KEY" def create_order(pair, quantity, price, order_type): url = "https://api.exmo.com/v1.1/order_create" payload = { "pair": pair, "quantity": quantity, "price": price, "type": order_type } encoded_payload = urllib.parse.urlencode(payload) signature = hmac.new(SECRET_KEY.encode('utf-8'), encoded_payload.encode('utf-8'), hashlib.sha512).hexdigest() headers = { "Key": API_KEY, "Sign": signature } response = requests.post(url, headers=headers, data=payload) return response.() order_result = create_order("BTC_USD", "0.01", "30000", "buy") print(.dumps(order_result, indent=4))
import hashlib import hmac import urllib.parse import requests import API_KEY = "YOUR_API_KEY" SECRET_KEY = "YOUR_SECRET_KEY" def cancel_order(order_id): url = "https://api.exmo.com/v1.1/order_cancel" payload = { "order_id": order_id } encoded_payload = urllib.parse.urlencode(payload) signature = hmac.new(SECRET_KEY.encode('utf-8'), encoded_payload.encode('utf-8'), hashlib.sha512).hexdigest() headers = { "Key": API_KEY, "Sign": signature } response = requests.post(url, headers=headers, data=payload) return response.() cancel_result = cancel_order("YOUR_ORDER_ID") # Replace with your actual order ID print(.dumps(cancel_result, indent=4))
错误处理
Exmo API 使用标准的 HTTP 状态码来明确地指示每个请求的执行结果,无论是成功还是失败。理解这些状态码对于构建健壮的应用程序至关重要。一些常见的状态码及其含义包括:
- 200 OK: 表明请求已成功处理,服务器已返回预期的结果。
- 400 Bad Request: 客户端发出的请求存在语法错误,或者缺少必要的参数,导致服务器无法理解。这通常意味着请求体格式不正确,或者参数类型不符合预期。
- 401 Unauthorized: 客户端尝试访问需要身份验证的资源,但提供的 API 密钥无效、过期,或者没有足够的权限。请检查 API 密钥是否正确配置,以及账户是否拥有执行该操作的权限。
- 403 Forbidden: 服务器拒绝执行该请求,尽管客户端已通过身份验证。这通常是由于 IP 地址被列入黑名单,或者账户权限不足以访问特定资源。请检查 IP 地址是否在白名单中,并确认账户拥有相应的权限。
- 429 Too Many Requests: 客户端在短时间内发送了过多的请求,超过了 API 的速率限制。为了保护服务器的稳定性,Exmo 会对请求频率进行限制。请实施适当的速率限制策略,例如使用指数退避算法来重试请求。
- 500 Internal Server Error: 服务器在处理请求时遇到了意外的错误,导致无法完成操作。这通常是服务器端的内部问题,客户端无法直接解决。如果频繁出现此错误,请联系 Exmo 技术支持。
除了依赖 HTTP 状态码来初步判断请求结果之外,Exmo API 返回的 JSON 响应对象通常会包含一个
error
字段,用于提供更加详细和具体的错误信息。这个字段通常是一个字符串,包含了错误的描述信息,可以帮助开发者更好地理解错误的原因,从而更快地进行调试和修复。在开发 API 客户端时,至关重要的是要全面地处理这些错误信息,以便及时发现和解决潜在的问题,确保应用程序的稳定性和可靠性。务必使用适当的错误处理机制(例如 try-catch 块)来捕获和处理 API 返回的错误,并记录详细的错误日志,以便进行问题分析和排查。
速率限制
为保障Exmo平台的稳定性和安全性,并防止恶意滥用行为,Exmo API 实施了速率限制机制。当客户端在短时间内发起过量请求时,服务器将返回 HTTP 状态码 429 (Too Many Requests) 错误,表明请求已被限制。不同 API 端点的速率限制策略可能有所不同,具体限制规则(例如每分钟或每秒允许的最大请求数)以及超出限制后的恢复时间,详见 Exmo 官方API文档。务必查阅最新的官方文档,了解适用于特定 API 方法的速率限制详情,以便合理规划请求频率。
有效规避速率限制的方法包括:
- 降低请求频率: 优化应用程序逻辑,仅在必要时发送请求,避免不必要的重复请求。合理安排请求队列,确保请求之间有适当的间隔,避免短时间内集中发送大量请求。
- 实施数据缓存: 对于非实时性要求较高的数据,可将API响应数据缓存在客户端,减少对API的直接调用次数。定期更新缓存数据,确保数据的时效性。
- 使用 WebSocket API: 对于需要实时数据更新的场景,优先考虑使用Exmo提供的 WebSocket API。WebSocket 协议允许建立持久连接,实现双向数据传输,避免频繁发起 HTTP 请求,从而有效降低触发速率限制的风险。WebSocket 技术更适用于需要推送更新的场景,如实时交易数据。
- 使用批量请求 (如有提供): 某些API可能支持批量请求,将多个操作合并到一个请求中,减少总请求数量。
通过采用上述策略,可以显著降低触发 Exmo API 速率限制的风险,确保应用程序的稳定运行。
安全建议
- 妥善保管 API 密钥: 切勿将 API 密钥泄露给任何第三方,包括朋友、同事或公开平台。将 API 密钥视为高度敏感的凭据,如同银行密码一样。采用加密存储方法,例如使用密钥管理系统(KMS)或硬件安全模块(HSM)来安全地存储 API 密钥。避免将 API 密钥硬编码到应用程序代码或配置文件中,防止意外泄露。
- 使用 HTTPS: 所有 API 请求必须强制使用 HTTPS(安全超文本传输协议),通过传输层安全(TLS)或安全套接字层(SSL)协议对数据进行加密,从而防止中间人攻击和数据窃听。确保服务器配置正确,强制将 HTTP 请求重定向到 HTTPS。验证服务器的 SSL/TLS 证书是否有效且由受信任的证书颁发机构(CA)颁发。
- 限制 API 权限: 实施最小权限原则,仅为 API 密钥授予完成特定任务所需的最低权限。避免授予 API 密钥过多的权限,以降低潜在的安全风险。仔细审查 API 密钥所需的权限范围,并根据实际需求进行调整。定期审查和更新 API 密钥的权限设置,以确保其符合当前的业务需求。
- 定期更换 API 密钥: 遵循密钥轮换策略,定期更换 API 密钥,以减少长期密钥暴露的风险。建议至少每 90 天更换一次 API 密钥,或者在检测到安全事件或潜在漏洞时立即更换。在更换 API 密钥时,确保旧密钥已失效,并且新密钥已正确配置到所有相关应用程序和服务中。使用自动化工具或脚本来简化 API 密钥轮换过程,并减少人为错误。
- 监控 API 使用情况: 实施全面的 API 使用监控机制,跟踪 API 请求的频率、来源、目标和错误率。设置警报阈值,以便在检测到异常活动(例如,异常高的请求量、来自未知 IP 地址的请求、或未经授权的 API 调用)时及时收到通知。使用日志分析工具来分析 API 使用日志,识别潜在的安全威胁和性能问题。实施速率限制和流量整形策略,以防止 API 被滥用或遭受拒绝服务(DoS)攻击。
上面的例子展示了如何用python语言发送 POST 请求, 进行API认证. 以下是一个 GET 请求的示例:
import hashlib import hmac import urllib.parse import requests import
APIKEY = "YOURAPIKEY" SECRETKEY = "YOURSECRETKEY"
def getticker(): url = "https://api.exmo.com/v1.1/ticker" payload = {} # GET requests can also have parameters in the payload, although they're often in the URL. For this example, it's empty encodedpayload = urllib.parse.urlencode(payload) # Important even if empty signature = hmac.new(SECRETKEY.encode('utf-8'), encodedpayload.encode('utf-8'), hashlib.sha512).hexdigest() headers = { "Key": API_KEY, "Sign": signature } response = requests.get(url, headers=headers, data=payload) # Use requests.get for GET requests return response.()
tickerdata = getticker() print(.dumps(ticker_data, indent=4))
请注意: 这个get_ticker()
函数 仍然 需要提供 API 密钥和签名。虽然 /ticker
端点本身不需要身份验证即可访问,但Exmo的API架构鼓励一致性,因此即使是公开端点也需要正确的密钥和签名,尽管服务器可能不会强制执行它们. 为了避免任何潜在的未来变化或兼容性问题,强烈建议始终包含正确的身份验证头. 对于不需要认证的端点, 即使你没有有效的API key, 也能成功返回数据. 但是一旦需要认证, 缺少或者错误的API key/签名, 就会返回错误信息.
本教程介绍了 Exmo API 的基本概念、API 密钥获取、API 认证、常用 API 方法以及错误处理。希望本教程能够帮助您快速上手并利用 Exmo API 构建自己的加密货币应用程序。 请务必参考 Exmo 官方文档以获取最新的 API 信息和更新。