Coinbase API使用指南:快速入门与实战技巧!

2025-03-08 13:16:15 51

Coinbase API 接口使用指南

Coinbase API 提供了一套强大的工具,允许开发者以编程方式访问和管理 Coinbase 账户,实现交易、获取市场数据、管理钱包等功能。本文将深入探讨 Coinbase API 的使用方法,包括身份验证、常用接口、数据格式以及错误处理等方面。

身份验证

访问 Coinbase API 需要进行身份验证,以确保只有授权用户才能访问其数据和功能。目前,Coinbase 提供两种主要的身份验证机制:OAuth2 和 API Key。

OAuth2 (开放授权) :OAuth2 是一种授权框架,允许第三方应用程序在不共享用户密码的情况下访问 Coinbase 资源。它基于令牌 (Token) 授权机制,用户授权第三方应用程序后,应用程序会获得一个访问令牌,使用该令牌代表用户访问 Coinbase API。OAuth2 适用于需要代表用户执行操作的应用程序,例如交易或获取账户信息。这种方式的优点是安全性较高,用户可以随时撤销对应用程序的授权。

OAuth2 的流程通常包括:

  • 应用程序向 Coinbase 请求授权。
  • Coinbase 显示授权页面,用户可以选择是否授权应用程序访问其数据。
  • 如果用户授权,Coinbase 将返回一个授权码给应用程序。
  • 应用程序使用授权码向 Coinbase 请求访问令牌。
  • Coinbase 验证授权码并返回访问令牌和刷新令牌。
  • 应用程序使用访问令牌访问 Coinbase API。
  • 当访问令牌过期时,应用程序可以使用刷新令牌获取新的访问令牌。

API Key (API 密钥) :API Key 是一种简单的身份验证方式,通过生成 API 密钥和密钥来实现身份验证。API 密钥允许开发者使用一组明确定义的权限访问 Coinbase API。这种方式适用于不需要代表特定用户执行操作的应用程序,例如获取市场数据或创建 Webhook。API Key 的安全性相对较低,需要妥善保管,避免泄露。

使用 API Key 时,通常需要在每个 API 请求的头部或参数中包含 API 密钥和密钥。Coinbase 会验证这些密钥,如果验证成功,则允许访问 API。API Key 可以配置不同的权限,例如只读权限或读写权限,以限制其访问范围。强烈建议使用具有最小权限的 API Key,以降低安全风险。

选择哪种身份验证方式取决于应用程序的需求。如果需要代表用户执行操作,则应使用 OAuth2。如果只需要访问公共数据或执行不需要用户授权的操作,则可以使用 API Key。

1. OAuth2:

OAuth2 (开放授权2.0) 是一种广泛使用的授权框架,它允许第三方应用程序安全地代表用户访问其Coinbase账户数据和执行操作,而无需用户直接共享他们的Coinbase登录密码。 OAuth2协议通过提供一个安全且标准化的方式来授权第三方应用访问用户资源,极大地提升了安全性和用户体验。

  • 注册应用: 第一步是在Coinbase开发者门户( https://developers.coinbase.com/ )上注册一个新的应用程序。注册成功后,您将获得一个唯一的Client ID和一个Client Secret。 Client ID 是应用程序的公共标识符,而Client Secret则是应用程序的密钥,务必妥善保管。
  • 授权流程: 用户在使用您的应用程序时,会被重定向到Coinbase提供的授权页面。 在这个页面上,用户将有机会审查您的应用程序请求的权限范围,并决定是否授权。如果用户授权,Coinbase会生成一个授权码,并将用户重定向回您的应用程序,同时附带这个授权码。授权码的有效期很短,必须尽快使用。
  • 获取 Access Token: 您的应用程序需要使用Client ID、Client Secret以及上一步获取的授权码,向Coinbase API的token endpoint发起请求。 Coinbase API会验证这些信息,如果验证成功,将返回一个Access Token和一个Refresh Token。 Access Token用于访问受保护的资源,而Refresh Token则用于在Access Token过期后获取新的Access Token。
  • 使用 Access Token: 获取Access Token后,您可以将其包含在后续对Coinbase API的请求的 Authorization header中,以代表用户执行操作。 Authorization header通常采用 "Bearer" 方案,例如: Authorization: Bearer YOUR_ACCESS_TOKEN 。 请注意,Access Token应该被视为敏感信息,需要安全地存储和传输。
  • 刷新 Access Token: Access Token具有有限的有效期,通常为几小时。 一旦Access Token过期,您将无法再使用它来访问Coinbase API。 为了避免中断用户的访问,您可以使用Refresh Token来获取一个新的Access Token,而无需再次提示用户授权。 Refresh Token的有效期通常比Access Token长,但也有过期时间,因此您需要定期使用Refresh Token来刷新Access Token。

OAuth2特别适用于需要代表用户执行操作的场景,例如将Coinbase账户集成到第三方交易平台、投资组合跟踪工具或支付应用程序中。 通过OAuth2,这些应用程序可以安全地访问用户的Coinbase数据并执行诸如交易、查询余额和转移资金等操作,而无需直接访问用户的密码。

2. API Key:

API Key 提供了一种更为直接和灵活的身份验证方法,适用于开发者构建自动化交易和数据分析系统。您可以直接在 Coinbase 开发者门户生成 API Key 和相应的 API Secret,以便安全地访问 Coinbase 的各种 API 服务。

  • 生成 API Key: 通过 Coinbase 开发者门户,您可以轻松创建并管理多个 API Key。每个 API Key 都会关联一个唯一的 API Secret,用于后续的签名验证过程。务必妥善保管您的 API Secret,避免泄露,因为它能授予未经授权的访问权限。
  • 设置权限: API Key 的强大之处在于可以精细地控制其权限范围。您可以根据应用程序的需求,为 API Key 设置不同的权限级别。例如,您可以创建一个只读权限的 API Key 用于获取市场数据,而创建一个具有交易权限的 API Key 用于执行买卖操作。细粒度的权限控制有助于降低潜在的安全风险。常用的权限包括: wallet:accounts:read (读取账户信息)、 wallet:buys:create (创建购买订单)、 wallet:sells:create (创建出售订单)等。
  • 使用 API Key: 要使用 API Key 进行身份验证,您需要将 API Key、API Secret 以及时间戳 (timestamp) 包含在每个 API 请求的 HTTP header 中。时间戳用于防止重放攻击,确保请求的有效性。

以下是 API 请求 Header 的示例:

CB-ACCESS-KEY: YOUR_API_KEY
CB-ACCESS-SIGN: YOUR_API_SIGNATURE
CB-ACCESS-TIMESTAMP: CURRENT_TIMESTAMP

其中, YOUR_API_SIGNATURE 是使用 API Secret 对请求数据进行加密后生成的签名。具体的签名过程如下:将时间戳 (timestamp)、HTTP 请求方法 ( method ,如 GET POST )、API 端点的路径 ( requestPath ,如 /v2/accounts ) 以及请求体 ( body ,如果没有请求体则为空字符串 "" ) 按顺序拼接成一个字符串。然后,使用 API Secret 对该字符串进行 HMAC-SHA256 加密,得到最终的签名。请求体的 JSON 字符串必须是规范化的,顺序要保持一致。

简而言之,签名过程可以概括为:

signature = HMAC-SHA256(timestamp + method + requestPath + body, API_SECRET)

务必使用符合安全标准的加密库来执行 HMAC-SHA256 加密,确保签名的正确性和安全性。

API Key 尤其适用于需要自己编写脚本或应用程序来访问 Coinbase API 的场景。例如,您可以编写一个 Python 脚本来自动监控市场价格并执行交易,或者开发一个移动应用程序来管理您的 Coinbase 账户。使用 API Key,您可以完全掌控对 Coinbase API 的访问,并构建高度定制化的应用程序。

常用 API 接口

Coinbase API 提供了强大的数据访问和交易能力,允许开发者构建各种加密货币应用。以下是一些常用的 API 接口及其使用方法,这些接口覆盖了账户管理、交易执行、市场数据获取等方面,为开发者提供了全面的工具:

1. 获取账户信息:

  • GET /v2/accounts : 获取所有账户列表。此接口允许用户检索其在Coinbase交易所拥有的所有账户的列表。每个账户代表一种特定的加密货币或法币,并包含有关账户余额和其他相关信息。

    以下Python代码示例展示了如何使用Coinbase API获取账户信息。需要注意的是,为了安全起见,请勿将API密钥和密钥直接嵌入到代码中。使用环境变量或配置文件来存储这些敏感信息。

          
    import requests
    import hmac
    import hashlib
    import time
    import 
    import os
    
    API_KEY = os.environ.get("COINBASE_API_KEY")  # 从环境变量中获取API密钥
    API_SECRET = os.environ.get("COINBASE_API_SECRET")  # 从环境变量中获取API密钥
    API_URL = "https://api.coinbase.com/v2/"
    
    def generate_signature(timestamp, method, request_path, body=""):
        message = timestamp + method + request_path + body
        signature = hmac.new(API_SECRET.encode('utf-8'), message.encode('utf-8'), hashlib.sha256).hexdigest()
        return signature
    
    def get_accounts():
        endpoint = "accounts"
        method = "GET"
        request_path = "/v2/" + endpoint
        timestamp = str(int(time.time()))
        signature = generate_signature(timestamp, method, request_path)
    
        headers = {
            "CB-ACCESS-KEY": API_KEY,
            "CB-ACCESS-SIGN": signature,
            "CB-ACCESS-TIMESTAMP": timestamp,
            "Content-Type": "application/"
        }
    
        url = API_URL + endpoint
        response = requests.get(url, headers=headers)
        response.raise_for_status()  # 检查请求是否成功,如果失败则抛出异常
        return response.()
    
    try:
        accounts = get_accounts()
        print(.dumps(accounts, indent=4))
    except requests.exceptions.RequestException as e:
        print(f"An error occurred: {e}")
    except Exception as e:
        print(f"An unexpected error occurred: {e}")
          
        

    此代码首先导入必要的库,例如 requests 用于发送HTTP请求, hmac hashlib 用于生成API签名,以及 time 用于获取当前时间戳。 然后,它定义了 generate_signature 函数,该函数使用您的API密钥和密钥对请求进行签名,这是与Coinbase API进行身份验证所必需的。 get_accounts 函数构造请求标头,包括API密钥,签名和时间戳,然后向 /v2/accounts 端点发送GET请求。 它打印返回的JSON响应,其中包含您的帐户信息。代码加入了错误处理,使用了更安全的API Key读取方式。Content-Type更明确的声明为application/. 添加了异常处理,提升代码的健壮性。

  • GET /v2/accounts/:account_id : 获取指定账户的详细信息。通过提供特定的 account_id ,此接口允许用户检索有关特定账户的详细信息,包括其当前余额、可用余额、币种类型和其他相关元数据。

2. 获取市场数据:

  • GET /v2/prices/:currency_pair/spot : 获取指定货币对的实时现货价格。此端点提供指定货币对当前的市场中间价,该价格通常用于参考,而非实际的成交价格。货币对的格式为“交易货币-计价货币”,例如“BTC-USD”代表比特币/美元。

    以下是使用Python和 requests 库调用此API端点的示例代码:

    import requests
    import time
    import 
    import hmac
    import hashlib
    
    API_KEY = "YOUR_API_KEY"
    API_SECRET = "YOUR_API_SECRET"
    API_URL = "https://api.coinbase.com/" # 假设是Coinbase API URL
    
    def generate_signature(timestamp, method, request_path, body=''):
        message = 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 get_spot_price(currency_pair="BTC-USD"):
        endpoint = f"prices/{currency_pair}/spot"
        method = "GET"
        request_path = "/v2/" + endpoint
        timestamp = str(int(time.time()))
    
        signature = generate_signature(timestamp, method, request_path)
    
        headers = {
            "CB-ACCESS-KEY": API_KEY,
            "CB-ACCESS-SIGN": signature,
            "CB-ACCESS-TIMESTAMP": timestamp,
            "Content-Type": "application/" # 更正为 application/
        }
    
        url = API_URL + endpoint
        response = requests.get(url, headers=headers)
        response.raise_for_status() # 检查响应状态码,如果不是 200 则抛出异常
        return response.()  # 解析为 JSON
    
    try:
        spot_price = get_spot_price()
        print(.dumps(spot_price, indent=4))
    except requests.exceptions.RequestException as e:
        print(f"请求出错: {e}")
    except Exception as e:
        print(f"发生未知错误: {e}")
    

    代码解释:

    • API_KEY API_SECRET 需要替换为你自己的API密钥和密钥。
    • generate_signature 函数用于生成请求签名,这是大多数交易所API的安全要求。它使用HMAC-SHA256算法对时间戳、HTTP方法和请求路径进行签名。
    • get_spot_price 函数构造请求的URL和头部,发送GET请求到API端点,并返回JSON格式的响应数据。
    • response.raise_for_status() 用于检查HTTP响应状态码。如果状态码不是200(成功),则会引发异常,有助于快速发现API调用问题。
    • 错误处理: try...except 块用于捕获可能的网络请求错误 (requests.exceptions.RequestException) 和其他异常,使程序更健壮。
    • Content-Type 指定为 application/.
  • GET /v2/prices/:currency_pair/buy : 获取指定货币对的买入价格。该端点返回的通常是交易所提供的最优买入价格,包含手续费和其他费用。这个价格会略高于现货中间价。请注意,实际成交价格可能会因为订单簿的深度和交易量而有所不同。
  • GET /v2/prices/:currency_pair/sell : 获取指定货币对的卖出价格。此端点提供交易所提供的最优卖出价格,通常低于现货中间价,并已计入手续费和其他相关费用。与买入价格类似,实际成交价格也受订单簿的影响。

3. 创建和管理交易:

  • POST /v2/accounts/:account_id/buys : 购买指定数量的加密货币。此端点允许用户以特定金额购买指定的加密货币,前提是该账户已启用交易权限。购买请求需要账户 ID、购买金额以及加密货币的币种。该操作通过市价单立即执行购买。
  • 以下 Python 代码片段演示了如何使用 Coinbase API 购买加密货币。 为了安全起见,请将API密钥、API密码和账户 ID存储在安全的地方,例如环境变量中。

    
    import requests
    import time
    import hmac
    import hashlib
    import 
    import os
    
    API_KEY = os.environ.get("COINBASE_API_KEY")
    API_SECRET = os.environ.get("COINBASE_API_SECRET")
    API_URL = "https://api.coinbase.com/v2/"
    
    def generate_signature(timestamp, method, request_path, body):
        """
        生成 Coinbase API 请求所需的签名。
        """
        message = 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 buy_crypto(account_id, amount, currency="BTC"):
        """
        使用 Coinbase API 购买指定数量的加密货币。
    
        参数:
            account_id (str): Coinbase 账户 ID.
            amount (str): 购买金额,例如 "0.01".
            currency (str): 要购买的加密货币,默认为 "BTC".
    
        返回:
            dict: API 响应的 JSON 数据。
        """
        endpoint = f"accounts/{account_id}/buys"
        method = "POST"
        request_path = "/v2/" + endpoint
        timestamp = str(int(time.time()))
        body = .dumps({"amount": amount, "currency": currency})
    
        signature = generate_signature(timestamp, method, request_path, body)
    
        headers = {
            "CB-ACCESS-KEY": API_KEY,
            "CB-ACCESS-SIGN": signature,
            "CB-ACCESS-TIMESTAMP": timestamp,
            "Content-Type": "application/"
        }
    
        url = API_URL + endpoint
        response = requests.post(url, headers=headers, data=body)
        return response.()
    

    代码解释:

    • 导入库: 导入必要的库,如 requests 用于发送 HTTP 请求, time 用于生成时间戳, hmac hashlib 用于生成签名。
    • generate_signature 函数: 此函数使用 API 密钥、API 密码、时间戳、HTTP 方法、请求路径和请求体生成请求签名。签名用于验证请求的真实性。Coinbase API 使用 HMAC-SHA256 算法生成签名。
    • buy_crypto 函数: 此函数构造购买请求并将其发送到 Coinbase API。它需要账户 ID、购买金额和币种作为参数。它首先构造 API 端点和请求体。然后,它生成请求签名并将其添加到请求头中。它发送 POST 请求到 API 并返回响应。
    • 错误处理: 实际应用中需要添加适当的错误处理机制,例如检查 HTTP 状态码并处理 API 返回的错误消息。
    • 安全性: API 密钥和密码应该保密,不能硬编码在代码中。建议使用环境变量或其他安全方法存储密钥。

替换为你的 Account ID

account_id 变量需要替换为你的真实账户ID,该ID用于指定交易操作的目标账户。 获取账户ID后,可用于执行买卖加密货币等操作。

例如,以下代码展示了如何使用 account_id buy_crypto 函数购买价值 0.001 个单位的加密货币:

account_id = "YOUR_ACCOUNT_ID"
buy_result = buy_crypto(account_id,  "0.001")
print(.dumps(buy_result,  indent=4))

上述代码片段中, buy_crypto 函数接受 account_id 和购买数量作为参数。 .dumps 函数用于格式化输出购买结果,使其更易于阅读。请确保已安装 模块。

  • POST /v2/accounts/:account_id/sells : 出售指定数量的加密货币。 该接口允许你将指定数量的加密货币从指定账户出售。 重要提示: 使用此接口前,必须确保已启用账户的交易权限,否则操作将失败。请求体中需要包含出售数量等必要信息。
  • POST /v2/accounts/:account_id/transactions : 创建提现或转账交易。 该接口用于发起加密货币的提现或转账操作。 重要提示: 与出售接口类似,使用此接口前,也必须确保已启用账户的交易权限。 请求体需要包含目标地址、转账金额等详细信息,务必仔细核对,避免资金损失。

4. 获取交易历史:

  • GET /v2/accounts/:account_id/transactions : 此API端点用于检索特定账户的完整交易历史记录。通过提供唯一的 account_id 作为路径参数,您可以访问与该账户相关的每笔交易的详细信息。 这些交易信息包括交易类型(例如买入、卖出、转账、费用支付等),执行时间和交易金额。 返回的数据通常以JSON格式呈现,包含多个交易对象,每个对象都精确描述了一项交易的各个方面,例如交易ID、交易状态、交易货币对、交易手续费等。 利用分页参数(如 limit offset )可以有效地浏览大量的交易记录,而不会一次性加载所有数据,从而提高性能。此功能对于账户活动审计、税务报告生成和交易策略分析至关重要。 示例: GET /v2/accounts/e6e1b373-805d-431f-b6f3-e6e1b373805d/transactions?limit=50&offset=100 将返回账户ID为 'e6e1b373-805d-431f-b6f3-e6e1b373805d' 的第101到150条交易记录。

数据格式

Coinbase API 响应的数据主体采用标准的 JSON (JavaScript Object Notation) 格式。JSON 是一种轻量级的数据交换格式,易于阅读和解析,这使得开发者能够便捷地从 Coinbase API 获取数据并集成到各种应用程序中。为了确保数据交换的准确性和效率,每个 Coinbase API 接口的返回值都遵循预定义的结构。开发者应查阅 Coinbase API 官方文档,详细了解每个接口的返回值结构,以便正确解析和使用数据。

在典型的 Coinbase API 响应中,通常会包含 data 字段。此字段是核心数据容器,用于存放 API 请求返回的实际数据内容,例如账户信息、交易历史、市场价格等。 data 字段的值通常是一个 JSON 对象或 JSON 数组,具体取决于 API 接口的功能和返回数据的类型。

对于需要处理大量数据的 API 接口,Coinbase API 提供了分页功能。分页信息通常包含在 pagination 字段中。 pagination 字段包含用于控制分页查询的参数,例如 next_uri (下一页的 URI)、 previous_uri (上一页的 URI)、 limit (每页返回的数据条数) 和 order (排序方式) 等。开发者可以使用这些参数来遍历所有数据,而无需一次性加载全部数据,从而提高应用程序的性能和响应速度。

错误处理

Coinbase API 通过 JSON 格式返回详细的错误信息,方便开发者进行调试和异常处理。响应中包含一个名为 errors 的字段,该字段是一个数组,每个元素代表一个具体的错误。每个错误对象通常包含错误代码 ( id ) 和相应的错误信息 ( message )。理解并正确处理这些错误信息对于构建健壮的应用程序至关重要。

  • invalid_api_key : 提供的 API Key 无效或已被禁用。请仔细检查 API Key 是否正确,以及是否已在 Coinbase 开发者平台上激活。同时确认 API Key 是否拥有访问所需端点的权限。
  • authentication_error : 身份验证失败。这通常意味着提供的 API Key 或签名不正确。检查请求头中的 API Key、API Secret 和 API Timestamp 是否正确生成和传递。确保使用正确的签名算法,并仔细核对请求参数。
  • rate_limit_exceeded : 超过速率限制。Coinbase API 具有速率限制,以防止滥用和保证服务的稳定性。如果超出限制,将收到此错误。可以通过实施指数退避算法 (Exponential Backoff) 来解决此问题,即在收到错误后等待一段时间再重试,并逐渐增加等待时间。还可以考虑优化 API 调用频率,只在必要时才进行请求。
  • invalid_request : 请求无效。这意味着请求的参数或格式不正确。仔细检查请求体中的参数是否符合 API 文档的要求,包括数据类型、格式和范围。常见的错误包括缺少必填参数、参数值超出范围、或使用了不支持的格式。
  • insufficient_funds : 账户余额不足。当尝试进行交易或提现时,如果账户余额不足以支付费用或交易金额,将会收到此错误。检查账户余额是否足够,并确保有足够的资金来完成操作。

在编写应用程序时,务必对 Coinbase API 返回的错误信息进行全面处理,以便及时发现并解决问题。不仅要检查 HTTP 响应状态码 (例如 400 代表客户端错误,401 代表未授权,429 代表请求过多,500 代表服务器错误),还要解析 errors 字段,以获取更详细的错误信息。针对不同的错误代码,采取相应的处理措施,例如:重新请求、通知用户、或记录错误日志。通过完善的错误处理机制,可以提高应用程序的稳定性和用户体验。

The End

发布于:2025-03-08,除非注明,否则均为链探索原创文章,转载请注明出处。