Coinbase API 操作
Coinbase 是一家著名的加密货币交易所,其 API 为开发者提供了广泛的功能,可以用于自动化交易、获取市场数据、集成支付等等。 本文将介绍 Coinbase API 的一些关键操作和使用方法。
身份验证
使用 Coinbase API 的首要步骤是确保安全可靠的身份验证。Coinbase 为开发者提供了多种身份验证机制,以满足不同应用场景的需求,主要包括 API 密钥和 OAuth2 两种方式。
API 密钥: API 密钥是一种简单直接的身份验证方法,适用于对安全性要求不高的应用。通过 Coinbase 开发者平台生成 API 密钥后,在 API 请求的头部中包含 `CB-ACCESS-KEY`、`CB-ACCESS-SIGN` 和 `CB-ACCESS-TIMESTAMP` 等字段即可完成身份验证。`CB-ACCESS-KEY` 是 API 密钥本身,`CB-ACCESS-SIGN` 是使用您的 Secret Key 和请求参数生成的 HMAC SHA256 签名,`CB-ACCESS-TIMESTAMP` 是请求的时间戳。 这种方式简单易用,但需要妥善保管 Secret Key,避免泄露。
OAuth2: OAuth2 是一种更安全、更灵活的身份验证授权框架,尤其适用于需要代表用户访问 Coinbase 账户的应用。使用 OAuth2 需要用户授权您的应用访问其 Coinbase 账户。授权后,您的应用可以获得一个访问令牌(Access Token),使用该令牌可以代表用户调用 Coinbase API。 OAuth2 的优点在于用户可以控制应用对账户的访问权限,并且可以随时撤销授权。Coinbase 的 OAuth2 流程遵循行业标准,包括授权码模式(Authorization Code Grant)和隐式授权模式(Implicit Grant),开发者可以根据应用类型选择合适的授权模式。
选择合适的身份验证方式取决于您的应用的安全需求和用户体验。对于简单的脚本或内部工具,API 密钥可能足够;对于需要代表用户访问账户的复杂应用,OAuth2 是更好的选择。
API 密钥
API 密钥是访问 Coinbase API 的一种简便身份验证方式,尤其适合个人项目、小型应用程序以及快速原型开发。您可以在 Coinbase 网站的开发者控制台中创建 API 密钥,并根据您的应用程序需求配置相应的权限范围(scopes)。这些权限控制着密钥可以访问哪些数据和执行哪些操作,例如读取账户信息、发起交易等。创建 API 密钥时,请务必审慎选择所需的权限,遵循最小权限原则,以降低安全风险。
使用 API 密钥进行身份验证时,需要在每个 API 请求的 HTTP
Authorization
头部和自定义的 Coinbase 头部中包含必要的身份验证信息。这些信息包括 API 密钥本身、使用 API 密钥对应的密钥(Secret)生成的数字签名、时间戳以及在创建密钥时设置的口令(Passphrase)。
请求头部的格式如下:
Authorization: Bearer
CB-ACCESS-SIGN:
CB-ACCESS-TIMESTAMP:
CB-ACCESS-PASSPHRASE:
各部分的详细说明:
-
Authorization: Bearer
:标准的 HTTP 授权头部,其中 -
CB-ACCESS-SIGN:
:使用API Secret
对请求的关键信息进行 HMAC-SHA256 加密后的签名。此签名用于验证请求的完整性和真实性,防止篡改。签名的生成过程涉及时间戳、HTTP 方法(如 GET、POST 等)、请求路径以及请求体(如果存在)。 -
CB-ACCESS-TIMESTAMP:
:表示请求发送时的 Unix 时间戳,精确到秒。时间戳用于防止重放攻击,即攻击者截获并重新发送之前的有效请求。Coinbase API 会验证时间戳的有效性,如果时间戳与服务器时间相差过大,请求将被拒绝。 -
CB-ACCESS-PASSPHRASE:
:在 Coinbase 开发者控制台中创建 API 密钥时设置的口令。此口令也用于验证请求的合法性。请务必妥善保管此口令,避免泄露。
以下是一个使用 Python 语言进行身份验证的示例,展示了如何计算 HMAC 签名并将必要的头部添加到 API 请求中:
import hmac
import hashlib
import time
import requests
import
api_key = "YOUR_API_KEY"
api_secret = "YOUR_API_SECRET"
api_passphrase = "YOUR_API_PASSPHRASE"
base_url = "https://api.coinbase.com/v2"
def coinbase_request(method, path, body=None):
timestamp = str(int(time.time()))
message = timestamp + method + path + (.dumps(body) if body else '')
signature = hmac.new(api_secret.encode('utf-8'), message.encode('utf-8'), hashlib.sha256).hexdigest()
headers = {
'Content-Type': 'application/',
'CB-ACCESS-KEY': api_key,
'CB-ACCESS-SIGN': signature,
'CB-ACCESS-TIMESTAMP': timestamp,
'CB-ACCESS-PASSPHRASE': api_passphrase
}
url = base_url + path
try:
if method == 'GET':
response = requests.get(url, headers=headers)
elif method == 'POST':
response = requests.post(url, headers=headers, data=.dumps(body))
elif method == 'PUT':
response = requests.put(url, headers=headers, data=.dumps(body))
elif method == 'DELETE':
response = requests.delete(url, headers=headers, data=.dumps(body))
else:
raise ValueError("Invalid method")
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
代码示例说明:
-
导入必要的库:
hmac
用于生成 HMAC 签名,hashlib
提供 SHA256 哈希算法,time
用于获取当前时间戳,requests
用于发送 HTTP 请求, - 定义 API 密钥、密钥和口令: 将您的 API 密钥、密钥和口令分别赋值给相应的变量。请务必替换为您的实际凭据。
-
定义
coinbase_request
函数: 此函数封装了发送 Coinbase API 请求的逻辑。它接受 HTTP 方法(如 GET、POST 等)、请求路径和请求体作为参数。 -
生成时间戳:
使用
time.time()
获取当前 Unix 时间戳,并将其转换为字符串。 - 构建签名消息: 将时间戳、HTTP 方法、请求路径和请求体(如果存在)连接成一个字符串,用于生成 HMAC 签名。
-
计算 HMAC 签名:
使用
hmac.new()
函数和 API 密钥对应的密钥对签名消息进行 HMAC-SHA256 加密,生成数字签名。 -
构建 HTTP 头部:
创建一个包含
Content-Type
、CB-ACCESS-KEY
、CB-ACCESS-SIGN
、CB-ACCESS-TIMESTAMP
和CB-ACCESS-PASSPHRASE
的字典,作为 HTTP 请求的头部。 -
发送 HTTP 请求:
使用
requests
库发送 HTTP 请求。根据 HTTP 方法的不同,选择相应的请求方法(如get
、post
等),并将 URL、头部和请求体作为参数传递给请求方法。 -
处理响应:
检查响应状态码。如果状态码表示请求成功(2xx),则将响应体解析为 JSON 格式并返回。如果状态码表示请求失败(4xx 或 5xx),则抛出
HTTPError
异常。 -
处理异常:
使用
try...except
块捕获可能发生的requests.exceptions.RequestException
异常,例如网络连接错误或服务器错误。如果发生异常,则打印错误信息并返回None
。
获取账户列表
要从Coinbase获取您的账户列表,您需要向Coinbase API发送一个GET请求到
/accounts
端点。 您可以使用
coinbase_request
函数来处理API请求的认证和发送。
以下代码演示了如何使用Python和
coinbase_request
函数来获取账户列表:
accounts = coinbase_request('GET', '/accounts')
if accounts:
print(accounts)
上述代码首先调用
coinbase_request
函数,传入
'GET'
作为请求方法,
'/accounts'
作为API端点。
coinbase_request
函数负责处理API认证(例如,通过API密钥或OAuth),并发送HTTP请求。请求成功后,API会返回一个包含账户信息的JSON响应。该JSON响应会被解析成Python字典或列表,并赋值给变量
accounts
。
if accounts:
语句检查
accounts
变量是否包含有效数据。如果API请求成功并且返回了账户信息,
accounts
将不会是空值,代码会继续执行
print(accounts)
语句,将账户信息打印到控制台。账户信息通常包括账户ID、账户余额、账户类型(如'wallet'或'fiat')以及其他相关数据。如果请求失败,
accounts
可能是
None
或者一个错误信息,此时不会执行打印操作。
在使用此代码之前,请确保您已经配置了Coinbase API密钥,并且
coinbase_request
函数已经正确实现,包括处理认证、发送请求和处理响应等逻辑。
OAuth 2.0 (开放授权 2.0)
OAuth 2.0 是一种行业标准的授权框架,专为第三方应用程序提供安全、受控的访问权限,无需共享用户的 Coinbase 账户凭据(如用户名和密码)。 它采用基于令牌的授权模型,降低了敏感数据泄露的风险,提升了安全性。使用 OAuth 2.0,用户可以精细化地控制哪些数据和权限授予第三方应用访问其 Coinbase 账户的权限,并随时撤销授权。
Coinbase 利用 OAuth 2.0 协议允许第三方应用安全地集成其平台。要开始使用 Coinbase 的 OAuth 2.0 流程,开发者需要首先注册其应用,并从 Coinbase Developer 平台获取唯一的
Client ID
(客户端 ID) 和
Client Secret
(客户端密钥)。
Client ID
用于标识您的应用程序,而
Client Secret
则用作验证客户端身份的密钥,务必妥善保管,切勿泄露。 注册后,您的应用需要将用户重定向至 Coinbase 专门的授权页面。在这个页面,用户可以审查应用请求的权限,并选择授予或拒绝授权。 如果用户授予授权,Coinbase 会将用户重定向回您预先配置的应用回调 URL,并在 URL 中附加一个临时的
authorization code
(授权码)。
获得
authorization code
后,您的应用程序必须立即使用该授权码向 Coinbase 的令牌端点发起请求,以交换
access token
(访问令牌) 和
refresh token
(刷新令牌)。
access token
是一种短期凭据,用于对后续的 Coinbase API 请求进行身份验证,它代表用户授予的特定权限。
refresh token
则用于在
access token
过期后获取新的
access token
,无需用户再次进行授权流程。
refresh token
的存在保证了应用程序可以持续访问用户数据,而无需频繁地中断用户体验。
access token
是访问 Coinbase API 的关键。 每次向 Coinbase API 发起请求时,都必须在请求头中包含有效的
access token
, 以证明您已获得用户的授权。由于
access token
具有时效性,因此开发者需要实现逻辑来处理
access token
过期的情况。 当
access token
过期时,使用
refresh token
向 Coinbase 的令牌端点发起请求,即可获取新的
access token
。 开发者应妥善存储
refresh token
,并采取适当的安全措施以防止其被未经授权的访问。
获取市场数据
Coinbase API 提供了一系列强大的接口,可以访问各种加密货币市场数据,为开发者和交易者提供了宝贵的信息资源。这些数据可以用于构建交易机器人、分析市场趋势、进行风险评估等多种用途。
- 价格行情 : 您可以轻松获取指定加密货币的实时现货价格。此数据是动态更新的,反映了当前市场供需关系。除了价格本身,还可以获取价格变动方向,以便更好地理解市场动态。API 允许按不同法币计价查询,例如 BTC-USD (比特币兑美元) 或 ETH-EUR (以太坊兑欧元)。
- 历史数据 : 通过历史数据接口,您可以检索特定加密货币在过去一段时间内的价格数据。 这包括每日、每小时,甚至更细粒度的时间段的价格信息。 这些历史数据对于进行技术分析、回测交易策略、以及识别长期趋势至关重要。 您还可以获取交易量,帮助判断市场活跃度。
- 交易对信息 : Coinbase API 不仅提供价格数据,还提供有关特定交易对的全面信息。 这包括 24 小时交易量、最高价、最低价、开盘价和收盘价。 这些统计数据能够帮助您评估交易对的流动性、波动性和整体市场表现。 您还可以获取交易对的状态信息,例如是否可交易、是否处于维护模式等。
- 订单簿 : 订单簿是市场深度的直观反映,它显示了当前市场上买入和卖出的订单列表,按照价格排序。 通过 Coinbase API,您可以访问特定交易对的订单簿数据,了解市场上的买卖力量分布情况。 这些信息对于高频交易者和套利者尤为重要,他们需要快速了解市场深度和流动性。 API 可以返回不同深度的订单簿,例如前 10 档买卖盘、前 50 档买卖盘等。
以下 Python 代码示例演示了如何使用
requests
库通过 Coinbase API 获取比特币 (BTC) 兑美元 (USD) 的实时价格行情:
import requests
url = "https://api.coinbase.com/v2/prices/BTC-USD/spot"
response = requests.get(url)
if response.status_code == 200:
data = response.()
print(f"比特币价格: {data['data']['amount']} USD")
else:
print(f"请求失败: {response.status_code}")
交易操作
Coinbase API 允许你进行交易操作,涉及与加密货币交易相关的各种功能:
- 下单 : 提交买单或卖单,指定交易对(例如BTC-USD)、数量和价格。订单类型包括市价单(立即执行,以当前市场价格)和限价单(仅在达到指定价格时执行)。
- 取消订单 : 撤销任何尚未完全成交的挂单。可以根据订单ID取消单个订单,也可以一次性取消所有未成交的订单。
- 获取订单信息 : 查询特定订单的详细信息,包括订单状态(例如,未决、已成交、已取消)、订单类型、订单数量和成交价格。
- 获取历史交易记录 : 检索账户的交易历史记录,包括交易时间、交易对、交易类型(买入或卖出)、成交数量、成交价格以及交易费用。可以通过指定时间范围和交易对来过滤交易记录。
下单示例:
此示例展示如何使用Python和Coinbase API进行身份验证和下单。
import hmac
import hashlib
import time
import requests
import
api_key = "YOUR_API_KEY"
api_secret = "YOUR_API_SECRET"
api_passphrase = "YOUR_API_PASSPHRASE"
base_url = "https://api.coinbase.com/v2"
def coinbase_request(method, path, body=None):
timestamp = str(int(time.time()))
message = timestamp + method + path + (.dumps(body) if body else '')
signature = hmac.new(api_secret.encode('utf-8'), message.encode('utf-8'), hashlib.sha256).hexdigest()
headers = {
'Content-Type': 'application/',
'CB-ACCESS-KEY': api_key,
'CB-ACCESS-SIGN': signature,
'CB-ACCESS-TIMESTAMP': timestamp,
'CB-ACCESS-PASSPHRASE': api_passphrase
}
url = base_url + path
try:
if method == 'GET':
response = requests.get(url, headers=headers)
elif method == 'POST':
response = requests.post(url, headers=headers, =body)
elif method == 'PUT':
response = requests.put(url, headers=headers, =body)
elif method == 'DELETE':
response = requests.delete(url, headers=headers, =body)
else:
raise ValueError("Invalid method")
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
# 下单示例
order_data = {
"type": "market",
"side": "buy",
"product_id": "BTC-USD",
"size": "0.001" # 买入0.001 BTC
}
path = "/orders"
response = coinbase_request('POST', path, order_data)
if response:
print(f"Order placed successfully: {response}")
else:
print("Order placement failed.")
注意事项:
-
请务必替换
YOUR_API_KEY
、YOUR_API_SECRET
和YOUR_API_PASSPHRASE
为您真实的API密钥、密钥和密码。 -
product_id
指定交易的货币对。 -
size
指定交易的加密货币数量。 - 务必妥善保管您的API密钥和密码,防止泄露。
- 在真实环境中交易前,请先在Coinbase提供的沙盒环境中进行测试。
- 订单参数,例如类型(market/limit),买卖方向(buy/sell)等,请参考Coinbase API官方文档。
下一个市价买单
account_id = "YOUR_ACCOUNT_ID"
# 获取你的 Coinbase 账户 ID。你可以在 Coinbase Pro 界面或通过 API 查询得到。
下单参数定义:
order_params = {
"type": "market",
"side": "buy",
"funds": "10", # 花费的金额,这里是花费 10 美元购买 BTC。注意:这是以美元计价的。
"product_id": "BTC-USD"
}
-
type: "market"
指定订单类型为市价单,表示以当前市场最优价格立即成交。 -
side: "buy"
表示买入操作。 -
funds: "10"
指定用于购买的资金量。 在此示例中,表示使用 10 美元购买指定交易对的加密货币。 -
product_id: "BTC-USD"
指定交易对。 例如,"BTC-USD" 表示用美元购买比特币。 其他常见的交易对包括 ETH-USD、LTC-USD 等。 请确保选择 Coinbase Pro 支持的有效交易对。
发送订单请求:
order = coinbase_request('POST', f'/accounts/{account_id}/orders', order_params)
-
此代码使用
coinbase_request
函数向 Coinbase Pro API 发送 POST 请求,以创建一个新的市价单。 -
'POST'
方法指定这是一个创建新资源的请求。 -
f'/accounts/{account_id}/orders'
是 API 端点,用于在指定的账户下创建订单。account_id
变量替换为你的实际账户 ID。 -
order_params
包含订单的详细信息,如订单类型、买卖方向、资金量和交易对。
检查订单是否成功:
if order:
print(order)
-
此代码检查
order
变量是否包含有效值。如果订单成功创建,order
变量将包含来自 Coinbase Pro API 的订单信息。 -
print(order)
将订单信息打印到控制台,以便你可以查看订单的详细信息,例如订单 ID、创建时间、状态等。 你可以使用这些信息来跟踪订单的执行情况。 -
如果订单创建失败,
order
变量可能为None
或包含错误信息。 你应该检查 API 响应以确定失败的原因,例如资金不足、无效的交易对等。
其他操作
除了获取实时市场数据和执行交易操作外,Coinbase API 还提供了广泛的其他功能,允许开发者构建更全面、更复杂的加密货币应用:
- 管理账户 : 通过 API,您可以创建新的加密货币账户,查看现有账户的详细信息(如余额、交易历史等),并修改账户设置(如账户名称、关联邮箱等)。这对于构建自动化账户管理系统至关重要。
- 支付 : 创建支付请求,允许用户通过 Coinbase 账户进行加密货币支付。API 支持指定支付金额、币种,并生成支付链接或二维码,方便用户进行支付。此功能可用于集成到电商平台或在线服务中,实现加密货币支付功能。
- 提现 : 将加密货币从 Coinbase 账户提现到外部钱包地址。您可以通过 API 指定提现金额、币种和目标地址,方便地自动化提现流程。为了安全起见,提现通常需要用户授权或进行额外的安全验证。
- 获取钱包地址 : 获取指定账户的特定加密货币的钱包地址。这对于接收加密货币至关重要。API 允许您获取指定币种的收款地址,方便用户将加密货币转入您的 Coinbase 账户。您可以将此地址用于各种场景,例如在线收款、接收捐赠等。
错误处理
在使用 Coinbase API 进行交易和数据访问时,开发者可能会遇到各种错误。Coinbase API 通过返回 HTTP 状态码和 JSON 格式的错误信息,提供详细的错误反馈,允许开发者进行精细化的错误处理。理解并正确处理这些错误对于构建健壮且可靠的应用至关重要。
常见的 HTTP 状态码和对应错误描述包括:
- 400 Bad Request : 请求参数无效或缺失,通常表明客户端发送的请求格式不符合 API 的规范。例如,参数类型错误、缺少必要的参数、参数值超出允许范围等。仔细检查请求体和 URL 参数,确保数据类型和格式符合 API 文档的要求。
- 401 Unauthorized : 身份验证失败,表示 API 密钥或 OAuth 令牌无效或已过期。请确保 API 密钥配置正确,并且 OAuth 令牌具有访问相应资源的权限。如果使用 OAuth,请确保定期刷新令牌。
- 403 Forbidden : 权限不足,表明当前账户或 API 密钥没有访问所请求资源的权限。核实账户权限设置,确保已授权执行所需操作。某些 API 端点可能需要特定的权限才能访问。
- 404 Not Found : 请求的资源不存在,例如访问不存在的账户 ID 或交易 ID。确认请求的 URL 地址是否正确,并且所请求的资源确实存在。检查 ID 是否拼写错误。
- 429 Too Many Requests : 请求频率过高,触发了速率限制。Coinbase API 对请求频率有限制,超过限制的请求将被拒绝。实施重试机制,使用指数退避算法逐渐增加重试间隔,避免在短时间内再次触发速率限制。考虑使用缓存机制减少对 API 的直接调用。
在处理 Coinbase API 返回的错误时,建议采取以下措施:
- 记录错误信息 : 将 HTTP 状态码、错误信息以及请求的详细信息记录到日志中,方便后续的调试和问题排查。记录时间戳、请求的 URL、请求参数以及服务器返回的完整错误响应。
- 参数校验 : 仔细检查请求参数,确保数据类型、格式和取值范围符合 API 的规范。实施客户端和服务端双重校验,提高数据的可靠性。
- API 密钥验证 : 确保使用的 API 密钥有效且未过期。定期轮换 API 密钥,提高安全性。
- 权限检查 : 验证账户是否拥有足够的权限来执行所请求的操作。根据 API 文档,配置正确的权限。
- 速率限制处理 : 当收到 429 错误时,实施重试机制,并使用指数退避算法。避免在短时间内发送大量请求。考虑使用消息队列或其他异步处理方式来平滑请求流量。
- 用户通知 : 当出现错误时,向用户提供清晰友好的错误提示,引导用户采取正确的操作。避免向用户暴露敏感的 API 信息。
Coinbase API 提供了强大的功能,可以用于构建各种加密货币应用。 在使用 Coinbase API 时,你需要注意身份验证、错误处理和安全问题。 强烈建议仔细阅读 Coinbase API 的官方文档,了解更多详细信息。