火币网API接口对接Demo 语言:Python

全屏阅读
  • 基本信息
  1. 火币网API接口对接Demo(吐槽:火币网的api说明真的是太不直观了,故此放私家Demo出来方便一下同用Python的兄弟,其他语言的兄弟也可以参考一下签名逻辑,都通用的)

  2. 语言Python

#!/usr/local/python3/bin/python3
# -*- coding:utf-8 -*-
 
# 最下面有入口方法调用例子
# 最下面有入口方法调用例子
# 最下面有入口方法调用例子
 
import requests,datetime,hmac,hashlib,base64,urllib,json,decimal
from urllib import parse
from config_module.get_config import get_config_file
from log_module import log_print
from wechat_module.send_to_wechat import send_to_wechat
 
# 获取配置文件对象
#cf = get_config_file()
 
# 获取request请求相关参数
request_timeout = 5
request_retry_count = 5
 
# 获取交易对信息
huobi_symbol = 'ethusdt'
# 获取下单类型信息
huobi_buy_deal_type = 'buy-market'
huobi_sell_deal_type = 'sell-market'
# 获取交易量
huobi_deal_amount = '1'
 
# 获取access_key,等验证信息
huobi_access_key = 'XXXXXXXXXXXXXXXXXXXXXXXX'
huobi_secret_key = 'YYYYYYYYYYYYYYYYYYYYYYYY'
huobi_sub_account_id = 'xxxxxxx'
huobi_api_domain = 'huobi_api_domain'
huobi_api_SignatureMethod = 'HmacSHA256'
huobi_api_SignatureVersion = '2'
 
 
# 设置请求Headers
headers={
    'Content-Type': 'application/json',
}
 
# 对请求参数进行签名,返回含签名的完整请求URL 例子:https://api.huobi.pro/v1/order/orders/place?AccessKeyId=XXXXXXX-XXXXXXXX-XXXXXXX-XXXXXXXX&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2019-08-17T06%3A33%3A25&Signature=gMVL3yC/IUOYdo2KWJoAoHb%2BSVaX85cKyaI4%2BlbtgX4%3D
def api_signature(method,param,url_path):
    # 创建时间戳
    timestamp = datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S')
    #print('timestam: %s' % (timestamp))
 
    # 对时间戳进行URL编码
    timestamp_url_encode = parse.quote(timestamp)
 
    # 定义每个接口都必须的默认的请求参数
    default_param = {
        'AccessKeyId' : huobi_access_key,
        'SignatureMethod' : huobi_api_SignatureMethod,
        'SignatureVersion' : huobi_api_SignatureVersion,
        'Timestamp' : timestamp_url_encode,
    }
 
    # GET请求需要对所有请求参数进行签名,POST则不用
    if method == 'GET':
        default_param.update(param)
 
    # 对字典的排序,按key已ascii码排序
    sorted_param = dict(sorted(default_param.items(), key=lambda d: d[0], reverse=False))
    #print(sorted_param)
 
    # 拼接URL请求参数
    # 定义拼接在URL后面的请求参数
    url_param = ''
    # 循环param字典拼接请求参数
    #print(len(sorted_param))
    # 初始化循环次数,如果循环次数等于字典长度就不在后面加连接符 &
    a = 0
    for param_key,param_value in sorted_param.items():
        # 每次循环 循环次数自增1
        a+=1
        # url参数拼接
        url_param = url_param + '%s=%s' % (param_key,param_value)
        # 如果循环次数少于字典长度则在后面加连接符&
        if a < len(sorted_param):
            url_param = url_param + '&'
    #print(url_param)
 
 
    # 拼接需要进行签名计算的字符串
    need_secret_string = '%s\n%s\n%s\n%s' % (method,huobi_api_domain,url_path,url_param)
    #print('need_secret_string: %s' % need_secret_string)
 
    # 生成签名加密字符串
    # 调整字符串编码
    need_secret_string_encode = need_secret_string.encode(encoding='UTF8')
    huobi_secret_key_encode = huobi_secret_key.encode(encoding='UTF8')
    # 进行加密计算 并 签名
    secret_string = hmac.new(huobi_secret_key_encode,need_secret_string_encode,digestmod=hashlib.sha256).digest()
    # 签名
    signature = base64.b64encode(secret_string)
    signature = signature.decode()
    signature = parse.quote(signature)
    #print(signature)
 
    # 把签名字符串拼接到请求url
    url_param = url_param + '&Signature=%s' % (signature)
    #print(url_param)
 
    # 拼接出最终完整url
    url = 'https://%s%s?%s' % (huobi_api_domain,url_path,url_param)
    #print(url)
    return url
 
 
# 获取火币最新行情 返回json格式(字典格式)
def get_api_ticker():
    # 循环10次,尝试次数为10次
    flag = True
    a = 0
    while(flag):
        # 每次循环+1 到10次时退出死循环
        a+=1
        if a == request_retry_count: flag = False
        try:
            url = 'https://api.huobi.pro/market/detail/merged?symbol=%s' % (huobi_symbol)
            r = requests.get(url,timeout=request_timeout)
            log_print.info('get ticker success %s ' % r.text)
            # 判断是否发送成功,如不成功则抛出异常
            request_dict = r.json()
            request_status = request_dict['status']
            if request_status != 'ok': raise Exception('get huobi api error')
            # 消息成功发送,停止死循环
            flag = False
            return request_dict
        except Exception as e:
            log_print.exception(e)
            #send_to_wechat(e)
 
 
# 以GET或POST请求API(签名验证的形式)返回结果的字典格式
def request_api(method,url_path,param):
 
    # 把请求参数进行签名,获得含有签名的完整请求URL
    url = api_signature(method,param,url_path)
 
    # 请求循环10次,尝试次数为10次
    flag = True
    a = 0
    while(flag):
        # 每次循环+1 到10次时退出死循环
        a+=1
        if a == request_retry_count: flag = False
        try:
            if method == 'GET':
                r = requests.get(url,timeout=request_timeout)
            if method == 'POST':
                r = requests.post(url, data=json.dumps(param), headers=headers, timeout=request_timeout)
            log_print.info('request api success, result: %s ' % r.text)
            # 判断是否发送成功,如不成功则抛出异常
            request_dict = r.json()
            request_status = request_dict['status']
            if request_status != 'ok': raise Exception('request huobi api error')
            # 消息成功发送,停止死循环
            flag = False
            return request_dict
        except Exception as e:
            log_print.exception(e)
            #send_to_wechat(e)
 
 
# 获取账号信息
def get_api_user_info():
    log_print.info('request_api: get_api_user_info(获取账号信息)')
 
    # 请求请求方式
    method = 'GET'
 
    # 接口url_path
    url_path = '/v1/account/accounts'
 
    # 定义接口请求参数
    param = {}
 
    # 请求接口
    result_dict = request_api(method,url_path,param)
    #print(result_dict)
 
    # 返回结果
    return result_dict
 
 
# 获取账号余额
def get_api_user_balance():
    log_print.info('request_api: get_api_user_balance(获取账余额)')
 
    # 请求请求方式
    method = 'GET'
 
    # 接口请求URL
    url_path = '/v1/account/accounts/%s/balance' % (huobi_sub_account_id)
    # 定义请求参数
    param = {
        'account-id': huobi_sub_account_id,
    }
 
    # 请求接口
    result_dict = request_api(method,url_path,param)
    #print(result_dict)
 
    # 返回结果
    return result_dict
 
 
# 获取订单详情
def get_api_order_info(order_id):
    log_print.info('request_api: get_api_order_info(获取订单详情)')
 
    # 请求请求方式
    method = 'GET'
 
    # 接口请求URL
    url_path = '/v1/order/orders/%s' % (order_id)
    # 定义请求参数
    param = {
        'order-id': order_id,
    }
 
    # 请求接口
    result_dict = request_api(method,url_path,param)
    #print(result_dict)
 
    # 返回结果
    return result_dict
 
 
# 获取订单成交明细(有成交价)
def get_api_order_deal_detail(order_id):
    log_print.info('request_api: get_api_order_deal_detail(获取订单成交明细)')
 
    # 请求请求方式
    method = 'GET'
 
    # 接口请求URL
    url_path = '/v1/order/orders/%s/matchresults' % (order_id)
    # 定义请求参数
    param = {
        'order-id': order_id,
    }
 
    # 请求接口
    result_dict = request_api(method,url_path,param)
    #print(result_dict)
 
    # 返回结果
    return result_dict
 
# 下单请求
def post_api_order_place(deal_type,deal_amount):
    log_print.info('request_api: post_api_order_place(下单)')
 
    # 请求请求方式
    method = 'POST'
 
    # 接口请求URL
    url_path = '/v1/order/orders/place'
 
    param = {
        'account-id' : huobi_sub_account_id,
        'symbol' : huobi_symbol,
        'type' : deal_type,
        'amount' : deal_amount,
        #'price' : 100.00,
        'source' : 'api',
    }
 
    # 请求接口
    result_dict = request_api(method,url_path,param)
    #print(result_dict)
 
    # 返回结果
    return result_dict
 
# 撤销订单
def post_api_order_cancel(order_id):
    log_print.info('request_api: post_api_order_cancel(撤销订单)')
 
    # 请求请求方式
    method = 'POST'
 
    # 接口请求URL
    url_path = '/v1/order/orders/%s/submitcancel' % (order_id)
 
    param = {
        'order-id' : order_id,
    }
 
    # 请求接口
    result_dict = request_api(method,url_path,param)
    #print(result_dict)
 
    # 返回结果
    return result_dict
 
# 获取账户某币种的数量 返回字符串类型
def get_api_user_coin_balance(coin_type):
    # 初始化币种数量变量
    coin_balance = None
 
    # 获取用户所有币种的数量
    user_balance = get_api_user_balance()
    user_coin_balance_list = user_balance['data']['list']
    # 循环所有币种 找到要的币种 并获得数量
    for user_coin_balance in user_coin_balance_list:
        if user_coin_balance['currency'] == coin_type and user_coin_balance['type'] == 'trade':
            coin_balance = user_coin_balance['balance']
 
    return coin_balance
 
 
# 方法调用例子
#get_api_ticker()
#get_api_user_info()
#get_api_user_balance()
#get_api_order_info(45118400565)
#get_api_order_deal_detail(44988853101)
#post_api_order_place(huobi_sell_deal_type,'0.0050')
#post_api_order_cancel(44801145100)
————————————————
版权声明:本文为CSDN博主「YongHua_Zhu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/uu564237933/article/details/100037850

顶一下
(0)
100%
订阅 回复
踩一下
(0)
100%
» 郑重声明:本文由mpxq168发布,所有内容仅代表个人观点。版权归恒富网mpxq168共有,欢迎转载, 但未经作者同意必须保留此段声明,并给出文章连接,否则保留追究法律责任的权利! 如果本文侵犯了您的权益,请留言。

目前有 0 条留言 其中:访客:0 条, 博主:0 条

给我留言

您必须 [ 登录 ] 才能发表留言!