Python调用CoinAPI时time_start参数格式错误求助
问题排查与修复
核心问题:URL参数拼接错误
你的代码构造URL时,time_start与limit参数之间缺少&分隔符,导致两个参数被合并成一个错误字符串。原URL代码中time_start={time_start}后直接接limit={limit},最终生成的time_start值变成2022-11-20T17:00:00limit=100000000,完全不符合API要求的时间格式,因此返回400错误。
修复步骤
- 修正URL参数分隔:在
time_start={time_start}后添加&,正确分隔参数:
url = 'https://rest.coinapi.io/v1/orderbooks/{symbol_id}/history?time_start={time_start}&limit={limit}&limit_levels={limit_levels}'
- 规范时间格式:CoinAPI要求时间遵循ISO 8601格式,建议在时间末尾加
Z表示UTC时区(若你的时间为UTC),示例:
time_start = '2022-11-20T17:00:00Z' time_end = '2022-11-21T05:00:00Z'
如果是本地时区,需添加偏移量,比如东八区写成2022-11-20T17:00:00+08:00。
- 优化参数传递(更安全):避免手动拼接URL,用
requests.get的params参数自动处理编码和分隔,减少出错概率:
params = { 'time_start': time_start, 'limit': limit, 'limit_levels': limit_levels } url = f'https://rest.coinapi.io/v1/orderbooks/{symbol_id}/history' response = requests.get(url, headers=headers, params=params)
修复后完整代码
import requests import json symbol_id = 'COINBASE_SPOT_BTC_USDT' time_start = '2022-11-20T17:00:00Z' time_end = '2022-11-21T05:00:00Z' limit_levels = 100000000 limit = 100000000 headers = {'X-CoinAPI-Key': 'XXXXXXXXXXXXXXXXXXXXXXX'} params = { 'time_start': time_start, 'limit': limit, 'limit_levels': limit_levels } url = f'https://rest.coinapi.io/v1/orderbooks/{symbol_id}/history' response = requests.get(url, headers=headers, params=params) print(response) # 先判断状态码再处理响应,避免解析错误数据 if response.status_code == 200: with open('coinbase_ob_history.json', 'w') as coinbase_ob: json.dump(response.json(), coinbase_ob, indent=4) else: print(f"请求失败:{response.json()}")
额外建议
- 调用API后优先检查响应状态码,再进行JSON解析,避免异常;
- 不要设置过大的
limit和limit_levels值,可能触发API速率限制或导致数据量过载,建议参考文档设置合理数值。
内容的提问来源于stack exchange,提问作者J K
相关产品推荐
相关产品推荐

