Coinbase API配置指南:手把手教你玩转自动化交易!

阅读:66 分类: 生态

Coinbase 交易所 API 配置

Coinbase 交易所提供强大的 API 接口,允许开发者构建自动化交易机器人、数据分析工具以及其他与加密货币交易相关的应用程序。本文将详细介绍 Coinbase API 的配置过程,帮助你快速上手。

1. 创建 Coinbase 账户并启用 API

必须在 Coinbase 平台上拥有一个账户才能开始API密钥的创建流程。如果你还没有账户,立即访问 Coinbase 官方网站 (coinbase.com) 完成注册。

注册并成功登录账户后,请按照以下详细步骤启用 API 密钥:

  • 访问 API 设置页面: Coinbase 提供 Coinbase.com 和 Coinbase Pro 两个平台,API 设置入口有所不同。
    • Coinbase Pro 用户: 登录 Coinbase Pro 界面 (https://pro.coinbase.com/),找到并点击右上角的个人资料图标,通常以头像或首字母缩写显示。在下拉菜单中,选择 "API 密钥" 选项。
    • Coinbase.com 用户: 访问 Coinbase Developer 平台 (https://developers.coinbase.com/)。登录后,在导航栏或仪表盘中寻找 "My Apps" 或 "我的应用" 选项并点击。
    务必根据你使用的 Coinbase 产品线选择对应的 API 设置入口,因为不同产品线的 API 密钥管理界面和权限设置可能存在细微差异。
  • 创建新的 API 密钥: 成功进入 API 设置页面后,查找并点击 "Create API Key"、"创建 API 密钥" 或类似的按钮。此操作将启动 API 密钥的创建流程。部分平台可能要求你进行双重验证或其他安全验证以确认身份。
  • 设置 API 密钥权限: 在创建 API 密钥的过程中,至关重要的是为该密钥分配合适的权限。Coinbase 提供了精细化的权限控制,你需要根据你的应用程序或脚本的需求,仔细选择所需的权限。以下是常用的权限选项及其详细说明:
    • trade : 赋予密钥执行交易的权限,包括买入和卖出加密货币。慎重授予此权限,仅当你的应用程序需要自动交易时才启用。
    • wallet:accounts:read : 允许密钥读取你的账户信息,例如账户余额、可用资金和加密货币持有量。这是许多应用程序常用的权限,用于展示账户状态。
    • wallet:accounts:create : 授予密钥创建新账户的权限。通常用于自动化账户管理或集成 Coinbase 的服务。
    • wallet:addresses:create : 允许密钥为你的账户创建新的充值地址。这对于自动接收加密货币支付非常有用。
    • wallet:buys:create : 赋予密钥创建购买订单的权限,允许程序自动执行加密货币的购买操作。
    • wallet:sells:create : 允许密钥创建出售订单,使得程序可以自动出售加密货币。
    • wallet:payment-methods:read : 允许密钥读取你的支付方式信息,例如银行账户和信用卡信息。为了安全起见,除非绝对必要,否则不要授予此权限。
    • exchange:read : 允许密钥读取市场数据,例如实时价格、交易量和历史数据。这是构建行情显示、分析和量化交易程序的必要权限。
    • exchange:profile:read : 允许密钥读取你的交易账户信息,包括账户类型、交易手续费率和限制。
    • exchange:fills:read : 允许密钥读取你的成交记录,即已完成的交易。用于审计、风险管理和绩效分析。
    • exchange:orders:read : 允许密钥读取你的订单信息,包括挂单、已成交和已取消的订单。用于监控订单状态。
    • exchange:orders:create : 授予密钥创建订单的权限,允许程序自动下单买入或卖出加密货币。
    • exchange:orders:cancel : 允许密钥取消订单,用于撤销未成交的订单。
    • exchange:transfers:read : 允许密钥读取转账记录,包括充值和提现。用于追踪资金流动。
    • exchange:transfers:create : 允许密钥创建转账,用于自动执行资金转移操作。
    请务必仔细阅读每个权限的说明,并仅选择你的应用程序真正需要的权限。授予过多的权限可能会增加安全风险。创建 API 密钥后,妥善保管你的 API 密钥和密钥,切勿将其泄露给他人。
重要提示: 为了安全起见,你应该只授予你的 API 密钥所需的最低权限。例如,如果你的应用程序只需要读取市场数据,则不应该授予 trade 权限。此外,你应该启用双因素认证 (2FA) 以保护你的 Coinbase 账户。
  • 设置 API 密钥名称: 为你的 API 密钥设置一个描述性的名称,以便于管理。例如,你可以使用 "Trading Bot" 或 "Data Analysis Tool" 作为密钥名称。
  • 创建 API 密钥: 完成权限和名称设置后,点击 "Create" 或类似的按钮,创建 API 密钥。
  • 保存 API 密钥信息: 创建成功后,你将看到你的 API 密钥 (Key) 和密钥密文 (Secret)。务必将这些信息保存在安全的地方,例如密码管理器。 密钥密文只会出现一次,如果你忘记了,只能重新生成新的 API 密钥。
  • 2. 理解 API 密钥的安全

    API 密钥和密钥密文是访问你的 Coinbase 账户的凭证,如同银行账户的密码,因此必须妥善保管,避免未经授权的访问。

    • 不要将 API 密钥和密钥密文存储在代码中: 这是一种极其危险的做法,因为如果你的代码泄露,例如不小心提交到公共版本控制系统或遭受安全漏洞攻击,你的账户将面临被盗用的风险。你应该使用环境变量、配置文件(例如JSON或YAML格式)或专门的密钥管理工具(如 HashiCorp Vault、AWS Secrets Manager、Azure Key Vault 或 Google Cloud Secret Manager)来存储这些敏感信息。这些工具提供了加密存储、访问控制和审计功能,能够更好地保护你的密钥。
    • 不要将 API 密钥和密钥密文提交到公共代码仓库: 在提交代码到 GitHub、GitLab 或其他公共代码仓库之前,务必仔细检查代码,包括历史提交记录,确保其中不包含 API 密钥和密钥密文。可以使用预提交钩子(pre-commit hooks)或者静态代码分析工具来自动检测潜在的密钥泄露风险。 Git-secrets 和 truffleHog 是常用的开源工具,可以扫描代码仓库中的敏感信息。
    • 定期轮换 API 密钥: 为了安全起见,你应该定期轮换 API 密钥,例如每 90 天或 180 天轮换一次。你可以通过 Coinbase 提供的 API 管理界面创建一个新的 API 密钥,并在所有使用旧密钥的地方更新为新密钥。验证新密钥生效后,及时禁用旧的 API 密钥。这一过程减少了密钥泄露后被长期利用的风险,降低潜在的损失。
    • 监控 API 密钥的使用情况: Coinbase 提供 API 使用情况的监控功能,你应该定期检查 API 密钥的使用情况,例如请求频率、调用端点等,以检测异常活动,例如来自未知 IP 地址的请求、超出预期的请求量、或者调用了不应该被访问的端点。设置告警系统,当检测到异常活动时,立即通知相关人员进行处理。利用日志分析工具可以更深入地了解 API 的使用模式,及时发现潜在的安全问题。

    3. 使用 API 密钥进行身份验证

    在使用 Coinbase API 时,你需要使用 API 密钥和密钥密文进行身份验证。Coinbase 使用 API 密钥、时间戳和请求体生成的签名来进行身份验证,以确保请求的完整性和安全性。身份验证是访问受保护资源的关键环节,它允许 Coinbase 验证请求的来源是否合法,并防止未经授权的访问。

    身份验证流程涉及几个关键步骤:客户端需要拥有一个有效的 API 密钥和密钥密文。客户端需要生成一个时间戳,该时间戳表示请求发送的时间。然后,根据请求方法(如 GET、POST、PUT、DELETE)、请求路径和请求体(如果存在)构建一个消息。使用密钥密文对该消息进行哈希签名。Coinbase 服务器收到请求后,会使用相同的算法重新计算签名,并将其与请求中提供的签名进行比较。如果两个签名匹配,则请求被认为是合法的,并被允许访问受保护的资源。

    以下是一个使用 Python 和 requests 库进行身份验证的示例:

    以下代码示例演示了如何使用Python的`requests`库来构造一个经过身份验证的Coinbase API请求。该示例包含了计算签名的函数以及发起不同类型HTTP请求的函数。请注意,实际应用中需要妥善保管`api_key`和`api_secret`,避免泄露。

    import requests import time import hmac import hashlib import api_key = "YOUR_API_KEY" api_secret = "YOUR_API_SECRET" api_url = "https://api.coinbase.com/v2" # 或者 https://api.pro.coinbase.com (Coinbase Pro 已迁移至 Advanced Trade API) def create_signature(timestamp, method, request_path, body=''): message = str(timestamp) + method + request_path + body hmac_key = api_secret.encode('utf-8') message = message.encode('utf-8') signature = hmac.new(hmac_key, message, hashlib.sha256).hexdigest() return signature def make_request(method, endpoint, body=None): timestamp = str(int(time.time())) request_path = endpoint if body: body_ = .dumps(body) else: body_ = '' signature = create_signature(timestamp, method, request_path, body_) headers = { 'Content-Type': 'application/', 'CB-ACCESS-KEY': api_key, 'CB-ACCESS-SIGN': signature, 'CB-ACCESS-TIMESTAMP': timestamp, 'CB-VERSION': '2023-12-01' # 需要根据 API 版本更新, 建议使用最新版本 } url = api_url + endpoint try: if method == 'GET': response = requests.get(url, headers=headers) elif method == 'POST': response = requests.post(url, headers=headers, data=body_) elif method == 'PUT': response = requests.put(url, headers=headers, data=body_) elif method == 'DELETE': response = requests.delete(url, headers=headers) else: print("Unsupported HTTP method") return None response.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx) return response.() except requests.exceptions.RequestException as e: print(f"Request failed: {e}") return None

    代码解释:

    1. 导入必要的库: requests 用于发送HTTP请求, time 用于生成时间戳, hmac hashlib 用于创建签名, 用于处理 JSON 数据。
    2. 设置 API 密钥和 URL: YOUR_API_KEY YOUR_API_SECRET 替换为你实际的 API 密钥和密钥密文。 api_url 定义了 Coinbase API 的基础 URL。请注意,Coinbase Pro API 已迁移至 Advanced Trade API,可能需要更改 URL。
    3. create_signature 函数: 此函数接受时间戳、HTTP 方法、请求路径和请求体作为输入,并生成用于身份验证的签名。 它首先将这些参数连接成一个字符串,然后使用 API 密钥密文作为密钥,使用 HMAC-SHA256 算法对该字符串进行哈希处理。
    4. make_request 函数: 此函数接受 HTTP 方法、API 终结点和可选的请求体作为输入,并发送经过身份验证的 API 请求。 它首先生成时间戳,然后调用 create_signature 函数来创建签名。 然后,它创建一个包含 API 密钥、签名、时间戳和内容类型的标头字典。 它使用 requests 库发送 HTTP 请求,并在标头中包含标头字典。
    5. 错误处理: 代码包括基本的错误处理机制,例如检查不支持的 HTTP 方法以及捕获 requests.exceptions.RequestException 异常。 response.raise_for_status() 会在响应状态码为 4xx 或 5xx 时引发 HTTPError 异常。
    6. CB-VERSION: 请务必使用最新的 API 版本号,可以在Coinbase官方文档中找到。

    使用示例:

    以下代码演示了如何使用 make_request 函数来获取当前用户的 Coinbase 帐户:

    # 获取当前用户的帐户 accounts = make_request('GET', '/accounts') if accounts: print(.dumps(accounts, indent=4)) # 创建一个新的支付请求 body = { "type": "request", "to": "[email protected]", "amount": "1.00", "currency": "BTC", "description": "Payment for services rendered" } payment_request = make_request('POST', '/payments', body=body) if payment_request: print(.dumps(payment_request, indent=4))

    示例:获取账户列表

    在加密货币交易或区块链应用中,获取用户账户列表是常见的操作。通过API接口,我们可以轻松地获取账户信息。

    accounts = make_request('GET', '/accounts')

    上述代码片段展示了如何使用 make_request 函数发起一个HTTP GET请求,访问 /accounts 端点。该端点通常用于返回与用户身份关联的所有账户信息。这里的 make_request 是一个自定义函数,负责处理API请求的细节,例如身份验证、错误处理和数据序列化。

    if accounts:

    在成功收到API响应后,我们需要检查响应是否包含有效的账户数据。 if accounts: 语句用于判断 accounts 变量是否为空或包含错误信息。如果 accounts 不为空,则表示成功获取了账户列表。

    print(accounts)

    如果成功获取了账户列表,我们将其打印到控制台。在实际应用中,我们可能会将这些数据用于更复杂的处理,例如在用户界面上显示账户信息,或进行进一步的计算和分析。需要注意的是, accounts 变量通常包含JSON格式的数据,需要进行解析才能访问其中的账户详细信息,例如账户余额、交易历史等。在生产环境中,直接打印账户信息可能存在安全风险,应谨慎处理敏感数据。

    示例:创建一个新的订单

    在加密货币交易中,创建一个新的订单是执行交易的核心步骤。以下是一个使用Python和交易所API创建市价买单的示例,该订单旨在立即以当前市场价格购买一定数量的比特币(BTC)。

    order = { "type": "market", "side": "buy", "product_id": "BTC-USD", "size": "0.001" }

    参数详解:

    • type : 指定订单类型,这里为 "market",表示市价单。市价单会立即以市场上最优的价格成交。除了市价单,还有限价单 ( "type": "limit" ),允许你设置一个特定的价格,只有当市场价格达到或超过该价格时,订单才会被执行。
    • side : 表示交易方向,"buy" 代表买入,"sell" 代表卖出。
    • product_id : 指定交易的交易对,"BTC-USD" 表示比特币兑美元。不同的交易所支持不同的交易对,你需要根据实际情况进行调整。例如,ETH-USD 表示以太坊兑美元,LTC-BTC 表示莱特币兑比特币。
    • size : 表示订单数量,即购买或出售的加密货币数量。在此示例中,"0.001" 表示购买 0.001 个比特币。注意,不同交易所对最小交易数量有不同的规定。

    补充说明:

    • 限价单 (Limit Order) :如果使用限价单,还需要添加 price 参数,指定订单的成交价格。 例如: { "type": "limit", "side": "buy", "product_id": "BTC-USD", "size": "0.001", "price": "20000" } 这个订单表示以 20000 美元的价格购买 0.001 个比特币。只有当市场价格下跌到 20000 美元或更低时,该订单才会被执行。
    • 其他可选参数: 某些交易所还支持其他参数,例如 time_in_force 用于指定订单的有效期(例如: GTC - Good Till Canceled, IOC - Immediate Or Cancel, FOK - Fill Or Kill), post_only 用于确保订单不会立即成交,而是作为挂单存在于市场上。
    • API调用: 创建订单后,你需要使用交易所的API将订单发送到交易所。这通常涉及使用API密钥进行身份验证,并发送包含订单参数的HTTP请求。

    由于涉及交易,此处需要exchange权限的API KEY

    且强烈建议使用limit单,而不是market单,以控制风险

    在未配置正确的权限和 API KEY 之前,注释掉以下代码

    neworder = makerequest('POST', '/orders', body=order)

    if new_order:

    print(new_order)

    代码解释:

    • api_key api_secret : 务必将这两个变量替换为您在交易所(例如 Coinbase 或 Coinbase Pro)注册账户后获得的专属 API 密钥和 API 密钥密文。 api_key 用于标识您的身份,而 api_secret 则用于生成安全签名,确保请求的真实性和完整性。请务必妥善保管您的 api_secret ,切勿泄露给他人,避免资产损失。
    • api_url : Coinbase 提供了不同的 API 接口, api_url 定义了 API 的基本 URL。根据您使用的平台,可能是 Coinbase.com 或 Coinbase Pro。Coinbase.com 主要面向普通用户,提供简化的交易功能;而 Coinbase Pro 则面向专业交易者,提供更高级的交易工具和更低的费用。请根据您选择的平台设置正确的 api_url
    • create_signature 函数: 此函数是安全通信的关键。它利用您的 API 密钥、当前时间戳和请求体(JSON 格式的请求数据)生成一个唯一的 HMAC-SHA256 签名。时间戳确保请求的时效性,防止重放攻击。签名是对请求内容进行加密处理后的摘要,用于验证请求是否被篡改。正确的签名是交易所验证请求合法性的重要依据。
    • make_request 函数: 该函数负责实际发送 HTTP 请求到 Coinbase API 服务器,并处理身份验证过程。它在请求头中包含了必要的认证信息,例如 API 密钥、时间戳和生成的签名。该函数还负责处理 API 返回的响应,例如检查 HTTP 状态码,处理错误信息,并将响应数据解析为 JSON 格式。对异常情况进行适当的错误处理至关重要,可以帮助您及时发现并解决问题。
    • 示例代码: 代码示例演示了如何使用 API 获取您的账户列表和创建一个新的订单。获取账户列表可以帮助您了解您在交易所持有的资产情况。创建订单则允许您使用 API 进行交易,例如买入或卖出加密货币。这些示例可以作为您使用 Coinbase API 的起点,您可以根据自己的需求进行修改和扩展。请注意,在实际交易之前,务必使用测试环境进行充分的测试,以避免因代码错误导致资金损失。
    注意: 在实际使用中,你需要根据 Coinbase API 文档,调整请求的 URL、参数和请求体。你可以在 Coinbase Developer 平台 (https://developers.coinbase.com/) 找到完整的 API 文档。 此外,不同的 API 版本可能对参数和返回格式有所差异,请务必确认你使用的 API 版本与代码对应。

    4. 处理 Coinbase API 错误

    与 Coinbase API 交互时,必须充分考虑到潜在的错误情况。Coinbase API采用标准的 HTTP 状态码机制来明确指示错误类型,以便开发者能够准确地诊断和处理问题。理解这些状态码对于构建健壮且可靠的应用程序至关重要。

    • 400 Bad Request(错误请求): 此错误表明客户端发送的请求格式存在问题,例如缺少必需的参数、参数类型不正确或请求体结构无效。仔细检查请求参数和格式,确保符合 API 文档的要求是解决此问题的关键。
    • 401 Unauthorized(未授权): 此错误表示客户端提供的身份验证信息无效或缺失。这通常发生在 API 密钥未提供、密钥已过期或密钥权限不足的情况下。验证 API 密钥是否正确配置,并确保拥有执行所需操作的足够权限。检查 API 密钥状态和权限设置。
    • 403 Forbidden(已禁止): 服务器拒绝执行客户端的请求,即使客户端已通过身份验证。这通常是由于客户端尝试访问其没有权限访问的资源或执行其没有权限执行的操作。确认用户的 API 密钥拥有执行特定操作的权限,并检查是否有任何访问限制。
    • 404 Not Found(未找到): 请求的资源在服务器上不存在。这可能意味着请求的 URL 不正确、资源已被删除或资源尚未创建。检查 URL 的拼写和格式,确保请求的资源确实存在。
    • 429 Too Many Requests(请求过多): 客户端在短时间内发送了过多的请求,超过了 API 的速率限制。这是一种常见的错误,尤其是在高流量或自动化脚本的情况下。实施速率限制机制,例如使用指数退避算法,以避免超出 API 的限制。
    • 500 Internal Server Error(服务器内部错误): 服务器在处理请求时遇到了未知的错误。这通常是服务器端的问题,客户端无法直接解决。建议稍后重试请求,或联系 Coinbase 支持寻求帮助。记录错误日志,以便跟踪和调试问题。

    为了构建更具弹性的应用程序,建议在代码中实现全面的错误处理机制。这包括捕获常见的 HTTP 状态码,并根据不同的错误类型采取适当的措施。除了基本的异常处理之外,还可以考虑以下策略:

    • 重试机制: 对于临时性错误(例如 429 或 500),可以实施重试机制,在延迟一段时间后重新发送请求。指数退避算法是一种常用的重试策略,它可以随着重试次数的增加而逐渐增加延迟时间,从而避免对服务器造成过大的压力。
    • 错误日志记录: 详细记录所有 API 错误,包括状态码、错误消息、请求参数等信息。这有助于诊断和解决问题,并监控 API 的性能。
    • 用户通知: 根据错误的严重程度,可以向用户提供适当的反馈。对于影响用户体验的错误,应及时通知用户并提供解决方案。
    • 监控和警报: 实施监控系统,定期检查 API 的性能和错误率。当错误率超过预定义的阈值时,应触发警报,以便及时发现和解决问题。

    请仔细阅读 Coinbase API 的文档,了解有关错误处理的更多详细信息和最佳实践。文档通常会提供特定于 API 的错误代码和建议的解决方案。