Gemini API 极速上手:十分钟玩转交易接口!
Gemini API 接口接入指南
本文档旨在提供一份清晰、全面的 Gemini API 接口接入指南,帮助开发者快速上手并有效利用 Gemini 平台提供的各项功能。 本指南涵盖了 API 密钥获取、请求方式、数据格式、以及常见 API 接口的使用方法,并提供代码示例以供参考。
1. 准备工作
在使用 Gemini API 之前,为了确保顺利集成和安全使用,你需要完成以下准备工作:
- Gemini 账户: 必须拥有一个有效的 Gemini 账户。这是访问 Gemini API 的基础。如果你尚未拥有账户,请立即访问 Gemini 官方网站 (通常为 gemini.com,请自行查阅最新官方链接) 进行注册。注册过程可能需要进行身份验证 (KYC),请提前准备好相关证件。
-
API 密钥:
创建并妥善保管 API 密钥至关重要。登录你的 Gemini 账户,导航至 API 设置或开发者中心页面,生成一个新的 API 密钥对,包括 API Key (公钥) 和 API Secret (私钥)。务必将 API Secret 视为高度敏感信息,如同你的账户密码。强烈建议采用以下安全措施:
- 安全存储: 不要将 API Secret 存储在公共代码仓库 (如 GitHub) 中,或直接硬编码在应用程序中。 使用环境变量、配置文件或专门的密钥管理系统(如 HashiCorp Vault)来安全存储。
- 权限控制: 部分 Gemini API 提供细粒度的权限控制。创建 API 密钥时,只授予应用程序所需的最低权限,避免不必要的安全风险。
- 定期轮换: 建议定期轮换 API 密钥,以降低密钥泄露带来的潜在影响。
-
了解 API 使用限制:
Gemini API 遵循速率限制和其他使用条款,旨在维护系统的稳定性和公平性。你需要详细了解并严格遵守这些限制,以避免因超出限制而被暂时或永久限制访问。
- 查阅官方文档: 具体的速率限制信息(例如每分钟请求次数、每天请求次数等)以及其他使用条款,都可以在 Gemini API 的官方文档中找到。文档通常会详细说明不同 API 端点的限制情况。
- 错误处理: 在应用程序中实现适当的错误处理机制,以便在达到速率限制时能够优雅地处理错误,并避免不必要的重试请求。
- 优化请求: 优化你的 API 请求,例如批量处理请求,减少不必要的 API 调用,以更有效地利用你的 API 额度。
2. API 密钥管理
API 密钥是访问 Gemini API 的重要凭证,用于验证你的身份并授权你使用 API 的各项功能。因此,必须极其小心地安全存储和管理你的 API 密钥,以防止未经授权的访问和滥用。
- 绝对不要在客户端代码中硬编码 API 密钥: 将 API 密钥直接嵌入到客户端代码(例如 JavaScript 或移动应用程序代码)中是非常危险的,因为任何人都可以通过查看源代码或拦截网络流量来发现你的密钥。一旦密钥泄露,恶意用户就可以冒充你来访问 Gemini API,造成经济损失或其他严重后果。
- 强烈建议使用环境变量或安全的配置文件: 将 API 密钥存储在环境变量中,或者使用加密的配置文件,是一种更为安全的方法。环境变量是操作系统级别的设置,只有授权用户才能访问。配置文件应该存储在服务器端,并设置适当的访问权限。在你的程序中,通过读取环境变量或配置文件来获取 API 密钥,而不是直接硬编码。例如,在 Python 中,可以使用 `os.environ.get("GEMINI_API_KEY")` 来获取名为 `GEMINI_API_KEY` 的环境变量的值。
- 养成定期轮换 API 密钥的好习惯: 定期更换 API 密钥是一种重要的安全措施,可以限制泄露密钥的影响。即使你的密钥意外泄露,通过定期轮换,可以使旧的密钥失效,从而防止恶意用户继续使用它。 Gemini 平台通常会提供密钥轮换的机制,你应该熟悉并定期使用这些机制来更新你的 API 密钥。例如,可以每 90 天或 180 天更换一次密钥。
3. API 请求方式
Gemini API 采用 RESTful 架构风格,通过安全的 HTTPS 协议进行通信,确保数据传输的安全性与完整性。所有与 Gemini API 的交互请求都必须包含
X-GEMINI-APIKEY
HTTP header,其值为你的 Gemini API 密钥。此密钥用于身份验证,是访问 API 的必要凭证。对于需要身份验证和数据完整性校验的请求,还必须包含
X-GEMINI-PAYLOAD
和
X-GEMINI-SIGNATURE
HTTP headers。
X-GEMINI-PAYLOAD
包含经过 Base64 编码的请求负载,而
X-GEMINI-SIGNATURE
则是由你的私钥对负载进行 HMAC-SHA384 加密后的签名,用于验证请求的来源和内容未被篡改。 请妥善保管您的 API 密钥和私钥,防止泄露。
- 请求方法: Gemini API 支持多种标准的 HTTP 请求方法,包括但不限于 GET (用于获取数据)、POST (用于创建或更新资源) 等。选择合适的 HTTP 方法取决于你的操作类型。例如,获取账户余额通常使用 GET 方法,而下单操作则通常使用 POST 方法。
- 数据格式: Gemini API 接口主要使用 JSON (JavaScript Object Notation) 格式进行数据交换。JSON 是一种轻量级的数据交换格式,易于解析和生成,被广泛应用于 Web API 中。 请求体和响应体均采用 JSON 格式。
-
Base URL:
所有对 Gemini API 的请求都应以
https://api.gemini.com/v1
作为基准 URL。 这是 API 的根端点,所有其他 API 路径都基于此 URL 构建。例如,要获取特定交易对的市场行情数据,你需要访问的完整 URL 为https://api.gemini.com/v1/ticker/:symbol
,其中:symbol
需要替换为你感兴趣的交易对代码(如 BTCUSD)。
4. API 签名
某些 Gemini API 接口,尤其是涉及资金操作或账户信息的接口,需要进行签名验证。签名机制用于确保请求的完整性、防止篡改,并验证请求的真实性,防止未经授权的访问。
- 构建 Payload: 将请求参数,包括 API 版本、请求方法、时间戳等,按照 API 文档规定的格式转换为 JSON 字符串。Payload 的结构必须与 Gemini API 的期望完全一致,任何细微的差异都可能导致签名验证失败。
- Base64 编码 Payload: 对 JSON 字符串进行 Base64 编码,将其转换为适合在 HTTP Header 中传输的格式。Base64 编码是一种将二进制数据转换为 ASCII 字符串的常见方法。
- 计算 HMAC-SHA384 签名: 使用你的 API Secret 作为密钥,对 Base64 编码后的 Payload 进行 HMAC-SHA384 加密。HMAC (Hash-based Message Authentication Code) 是一种消息认证码算法,它使用哈希函数(这里是 SHA384)和密钥来生成签名。SHA384 是一种安全哈希算法,可以生成 384 位的哈希值。API Secret 必须妥善保管,泄露会导致安全风险。
-
设置 Header:
将 Base64 编码后的 Payload 设置到
X-GEMINI-PAYLOAD
header 中,将 HMAC-SHA384 签名设置到X-GEMINI-SIGNATURE
header 中。还需要设置X-GEMINI-APIKEY
header,其值为你的 API Key,以及Content-Type: application/
header。
以下是 Python 语言的签名示例:
import hashlib import hmac import base64 import time import
api secret = "YOUR API SECRET" # 替换为你的 API Secret api key = "YOUR API KEY" # 替换为你的 API Key
def generate signature(payload, api secret): encoded payload = base64.b64encode(.dumps(payload).encode()) signature = hmac.new(api secret.encode(), encoded payload, hashlib.sha384).hexdigest() return signature
# 示例用法
payload = { "request": "/v1/order/new", "nonce": int(time.time() * 1000), "symbol": "BTCUSD", "amount": "1", "price": "10000", "side": "buy", "type": "exchange limit" }
signature = generate_signature(payload, api_secret)
headers = { "Content-Type": "application/", "X-GEMINI-APIKEY": api_key, "X-GEMINI-PAYLOAD": base64.b64encode(.dumps(payload).encode()).decode('utf-8'), "X-GEMINI-SIGNATURE": signature }
# 使用 requests 库发送请求 (需要安装 requests: pip install requests)
import requests
url = "https://api.gemini.com/v1/order/new"
response = requests.post(url, headers=headers, =payload)
print(response.status_code)
print(response.())
示例 Payload
Payload 是指在 API 请求中发送的数据,用于告知服务器需要执行的操作和相关参数。在加密货币交易中,Payload 通常包含交易类型、交易对、数量、价格等关键信息,其结构通常采用 JSON 格式以便于解析和处理。
以下是一个示例 Payload,使用 Python 的
.dumps()
方法将其序列化为 JSON 字符串:
payload = .dumps({
"request": "/v1/order/new",
"nonce": 123456789,
"symbol": "btcusd",
"amount": "1",
"price": "10000",
"side": "buy",
"type": "exchange limit"
})
在这个例子中:
-
request
: 指定 API 端点为/v1/order/new
,表示创建一个新的订单。 -
nonce
: 一个随机数,用于防止重放攻击,确保每个请求的唯一性。每次请求都应该生成一个新的 nonce 值。 -
symbol
: 交易对,这里是btcusd
,表示比特币对美元的交易。 -
amount
: 交易数量,这里是1
,表示购买 1 个比特币。 -
price
: 交易价格,这里是10000
,表示以 10000 美元的价格购买比特币。 -
side
: 交易方向,这里是buy
,表示买入。 -
type
: 订单类型,这里是exchange limit
,表示限价交易。
签名 (signature) 是对 Payload 进行加密处理后的结果,用于验证请求的完整性和真实性,防止数据被篡改。签名通常使用 API 密钥 (api_secret) 和 Payload 作为输入,通过特定的哈希算法(例如 HMAC-SHA384)生成。
以下是如何生成签名的示例代码:
signature = generate_signature(payload, api_secret)
generate_signature
函数的具体实现会根据交易所的要求而有所不同,但其核心思想都是使用 API 密钥对 Payload 进行加密。
为了发送 API 请求,需要设置 HTTP 请求头 (headers),包含 API 密钥 (api_key)、Payload 的 Base64 编码和签名。
以下是如何设置请求头的示例代码:
headers = {
"X-GEMINI-APIKEY": api_key,
"X-GEMINI-PAYLOAD": base64.b64encode(payload.encode()).decode(),
"X-GEMINI-SIGNATURE": signature
}
在这个例子中:
-
X-GEMINI-APIKEY
: 包含 API 密钥,用于身份验证。 -
X-GEMINI-PAYLOAD
: 包含 Payload 的 Base64 编码,用于传递请求数据。需要将 Payload 编码为字节串,然后进行 Base64 编码,最后解码为字符串。 -
X-GEMINI-SIGNATURE
: 包含签名,用于验证请求的完整性。
不同的交易所可能需要不同的请求头和签名方式,请务必参考交易所的 API 文档。
使用 requests 库发送 POST 请求
在 Python 中,
requests
库是用于发起 HTTP 请求的事实标准。它允许开发者轻松地与 Web 服务进行交互,发送各种类型的请求,并处理响应。下面展示如何使用
requests
库向 Gemini 加密货币交易所的 API 发送 POST 请求以创建一个新的订单。
你需要导入
requests
模块:
import requests
然后,定义 API 端点 URL。Gemini API 的
/v1/order/new
端点用于创建新的订单。
url = "https://api.gemini.com/v1/order/new"
发送 POST 请求需要设置请求头 (headers) 和请求体 (payload)。请求头通常包含 API 密钥和内容类型等信息,请求体则包含订单的详细信息,如交易对、数量、价格和订单类型。
headers
应该是一个字典,包含Content-Type等信息;
payload
也应该是一个字典,包含交易所要求的各种参数,比如
client_order_id
,
symbol
,
amount
,
price
,
side
, 和
type
。
headers = {
'Content-Type': 'application/',
'X-GEMINI-APIKEY': 'YOUR_API_KEY',
'X-GEMINI-PAYLOAD': 'YOUR_PAYLOAD_BASE64_ENCODED',
'X-GEMINI-SIGNATURE': 'YOUR_PAYLOAD_SIGNATURE'
}
payload = {
'client_order_id': 'your_unique_order_id',
'symbol': 'BTCUSD',
'amount': '0.001',
'price': '30000',
'side': 'buy',
'type': 'exchange limit'
}
注意,上述代码中的
YOUR_API_KEY
、
YOUR_PAYLOAD_BASE64_ENCODED
和
YOUR_PAYLOAD_SIGNATURE
需要替换为你的实际 API 密钥、Base64 编码后的 payload 以及使用你的私钥生成的签名。 交易所会对payload签名进行验证,保证请求的安全性。
接下来,使用
requests.post()
方法发送 POST 请求。将 URL、headers 和 payload 作为参数传递给该方法。 需要将
payload
转换为JSON格式字符串,再传给
data
参数。
response = requests.post(url, headers=headers, data=.dumps(payload))
response
对象包含了服务器返回的响应。可以使用
response.status_code
属性获取 HTTP 状态码,以了解请求是否成功。状态码
200
表示成功,其他状态码则表示出现了错误。
print(response.status_code)
你可以使用
response.text
属性获取响应的原始文本内容,或使用
response.()
方法将响应解析为 JSON 格式。使用
response.()
可以更方便的访问返回的数据。
print(response.())
完整示例代码:
import requests
import
import base64
import hashlib
import hmac
api_key = 'YOUR_API_KEY'
api_secret = 'YOUR_API_SECRET'
url = "https://api.gemini.com/v1/order/new"
payload = {
'request': '/v1/order/new',
'nonce': 123456, # Replace with a unique nonce
'client_order_id': 'your_unique_order_id',
'symbol': 'BTCUSD',
'amount': '0.001',
'price': '30000',
'side': 'buy',
'type': 'exchange limit'
}
payload_ = .dumps(payload)
payload_base64 = base64.b64encode(payload_.encode())
signature = hmac.new(api_secret.encode(), payload_base64, hashlib.sha384).hexdigest()
headers = {
'Content-Type': 'application/',
'X-GEMINI-APIKEY': api_key,
'X-GEMINI-PAYLOAD': payload_base64.decode(),
'X-GEMINI-SIGNATURE': signature
}
response = requests.post(url, headers=headers)
print(response.status_code)
print(response.())
请务必查阅 Gemini API 的官方文档,了解有关请求头、请求体和身份验证的详细信息。 同时,请妥善保管你的 API 密钥和私钥,避免泄露。
5. 常用 API 接口
以下列举了一些常用的 Gemini API 接口及其使用方法,开发者可以利用这些接口获取市场数据、进行交易操作等。
-
获取市场行情 (Ticker):
-
URL:
/v1/ticker/:symbol
- 方法: GET
-
描述: 获取指定交易对的市场行情快照数据,包括最新成交价、最高买价、最低卖价、成交量等关键信息。
:symbol
需要替换成具体的交易对,例如btcusd
,ethusd
。 -
示例:
https://api.gemini.com/v1/ticker/btcusd
-
响应示例:
{ "bid": "9999.00", "ask": "10001.00", "last": "10000.00", "volume": { "BTC": "100", "USD": "1000000", "timestamp": 1678886400000 } }
字段说明:
-
bid
: 最高买价。 -
ask
: 最低卖价。 -
last
: 最新成交价。 -
volume
: 成交量,包含不同币种的成交量和时间戳。 -
volume.BTC
: BTC 成交量。 -
volume.USD
: USD 成交量。 -
volume.timestamp
: 数据更新的时间戳 (Unix 时间戳,毫秒级别)。
-
-
URL:
-
获取交易对信息 (Symbols):
-
URL:
/v1/symbols
- 方法: GET
-
描述: 获取 Gemini 平台支持的所有交易对列表,例如
btcusd
,ethusd
等。这对于动态构建交易界面或验证用户输入非常有用。 -
示例:
https://api.gemini.com/v1/symbols
-
响应示例:
[ "btcusd", "ethusd", "ltcusd" ]
-
URL:
-
下单 (New Order):
-
URL:
/v1/order/new
- 方法: POST
- 描述: 创建一个新的订单。此接口需要进行严格的签名验证,以确保交易的安全性。签名过程涉及使用您的私钥对请求参数进行哈希,并将签名包含在请求头中。请务必参考 Gemini API 文档了解详细的签名方法。
-
请求参数 (JSON):
-
request
:/v1/order/new
(固定值,用于签名验证)。 -
nonce
: 一个单调递增的整数,用于防止重放攻击。每次请求必须使用不同的nonce
值。建议使用高精度的时间戳来生成nonce
。 -
symbol
: 交易对,例如btcusd
。 -
amount
: 数量,指定要买入或卖出的数字货币数量。 -
price
: 价格,指定订单的执行价格。 -
side
:buy
或sell
,表示买入或卖出。 -
type
: 订单类型,例如exchange limit
。exchange limit
表示限价单,只有当市场价格达到或优于指定价格时才会执行。其他订单类型包括市价单 (exchange market
) 等。 -
client_order_id
(可选): 客户端自定义的订单ID,方便客户端跟踪订单状态。
-
-
响应示例:
{ "order_id": "123456789", "symbol": "btcusd", "amount": "1", "price": "10000", "side": "buy", "type": "exchange limit", "timestamp": "1678886400000", "is_live": true, "is_cancelled": false, "executed_amount": "0", "remaining_amount": "1" }
字段说明:
-
order_id
: Gemini 平台生成的订单 ID。 -
is_live
: 订单是否有效。 -
is_cancelled
: 订单是否已被取消。 -
executed_amount
: 已成交的数量。 -
remaining_amount
: 剩余未成交的数量。
-
-
URL:
-
取消订单 (Cancel Order):
-
URL:
/v1/order/cancel
- 方法: POST
- 描述: 取消一个指定的订单。同样需要进行签名验证。成功取消订单后,系统会将订单状态更新为已取消,并释放冻结的资金。
-
请求参数 (JSON):
-
request
:/v1/order/cancel
(固定值,用于签名验证)。 -
nonce
: 一个单调递增的整数,用于防止重放攻击。 -
order_id
: 要取消的订单 ID。
-
-
响应示例:
{ "is_cancelled": true }
字段说明:
-
is_cancelled
: 指示订单是否已成功取消。
-
-
URL:
6. 错误处理
Gemini API 通过返回 HTTP 状态码来指示请求的处理结果。理解并正确处理这些状态码对于构建健壮的应用程序至关重要。以下是一些常见的 HTTP 状态码及其含义,以及处理建议:
-
200 OK
: 请求成功。服务器已成功处理请求,并返回了预期的结果。 -
400 Bad Request
: 请求参数错误。这意味着客户端发送的请求包含无效的参数或格式不正确的数据。检查请求体、查询参数和请求头,确保它们符合 API 的规范。常见原因包括缺少必需参数、参数值超出范围或使用了不支持的数据类型。 -
401 Unauthorized
: 未授权访问,通常表示 API 密钥错误或者缺少签名。客户端需要提供有效的身份验证凭据才能访问受保护的资源。检查 API 密钥是否正确配置,以及请求中是否包含了必要的签名信息。如果使用了 HMAC 签名,请确保签名算法、密钥和数据的一致性。 -
429 Too Many Requests
: 超过速率限制。Gemini API 对每个 API 密钥都有请求速率限制,以防止滥用和保护服务器资源。当请求频率超过限制时,服务器会返回此状态码。解决方案包括实施指数退避策略、使用缓存机制减少请求次数,以及与 Gemini 协商更高的速率限制。 -
500 Internal Server Error
: 服务器内部错误。这表示服务器在处理请求时遇到了意外的错误,导致无法完成请求。这种错误通常是临时的,可能是由于服务器维护、代码错误或资源不足引起的。可以尝试稍后重新发送请求,如果问题仍然存在,请联系 Gemini 支持团队。
除了 HTTP 状态码之外,API 响应的 JSON 数据中还可能包含
result
和
message
字段,用于提供更详细的错误信息。
result
字段通常指示请求的总体结果(例如,"success" 或 "error"),而
message
字段包含更具体的错误描述,有助于诊断和解决问题。例如:
{
"result": "error",
"message": "Invalid API Key"
}
在编写代码时,务必对这些错误进行周全的处理,以保证程序的稳定性和可靠性。强烈建议使用
try-except
块(或其他编程语言中等效的错误处理机制)来捕获潜在的异常。通过捕获异常,您可以采取适当的措施来处理错误,例如记录错误信息、向用户显示友好的错误消息或重试请求。良好的错误处理策略可以防止应用程序崩溃,并提高用户体验。还应考虑对不同类型的错误进行不同的处理,例如,对于 429 错误,可以实施退避策略,而对于 400 错误,则应该检查请求参数。
7. 更多信息
有关 Gemini API 的更多详细信息,请参考 Gemini 官方 API 文档。该文档是理解和使用 Gemini API 的关键资源,它提供了全面的技术规范,覆盖了API的各个方面。
文档中包含了所有 API 接口的详细描述,包括每个接口的功能、用途以及适用场景。对于每个接口,都会详细说明其请求参数,包括参数类型、是否必需、以及取值范围等。
文档还详细描述了 API 的响应格式,明确了响应中包含的各个字段的含义以及数据类型。这有助于开发者正确解析 API 的响应数据,并进行相应的处理。同时,文档还列出了所有可能的错误代码,并对每个错误代码进行了详细的解释,方便开发者诊断和解决问题。
通过仔细阅读 Gemini API 官方文档,开发者可以全面了解 API 的功能和使用方法,从而更好地利用 Gemini API 构建各种创新的加密货币应用。建议开发者在使用 API 前仔细阅读文档,并参考其中的示例代码。