python 我改写的火币api

import requests
import traceback
import logging
import hmac
import json
import hashlib
import base64
import datetime

from urllib import parse


class HuobiApi(object):
    def __init__(self):
        self.host = 'https://api.huobi.pro'
        self.timeout = 10
        self.ACCESS_KEY = '你自己的'
        self.SECRET_KEY = '你自己的'
        self.main_account_id = '你自己的'

    def create_signature(self, method, url, builder):
        try:
            ret = {
                "code": 0,
                "message": ""
            }

            timestamp = self.utc_now()
            builder.put_url("AccessKeyId", self.ACCESS_KEY)
            builder.put_url("SignatureVersion", "2")
            builder.put_url("SignatureMethod", "HmacSHA256")
            builder.put_url("Timestamp", timestamp)
            # builder.put_url("order-id", self.main_account_id)

            host = parse.urlparse(url=url).hostname
            path = parse.urlparse(url=url).path
            print(f'path - {path}')

            # 对参数进行排序:
            keys = sorted(builder.param_map.keys())
            # 加入&
            qs0 = '&'.join(
                ['%s=%s' % (key, parse.quote(builder.param_map[key], safe=''))
                 for key
                 in keys])
            print(f'qs0 -> {qs0}')
            # 请求方法,域名,路径,参数 后加入`\n`
            payload0 = '%s\n%s\n%s\n%s' % (method, host, path, qs0)
            print(f'\n\n\n{payload0}\n\n\n')
            dig = hmac.new(self.SECRET_KEY.encode('utf-8'),
                           msg=payload0.encode('utf-8'),
                           digestmod=hashlib.sha256).digest()
            # 进行base64编码
            s = base64.b64encode(dig).decode()
            builder.put_url("Signature", s)
            print(f'ret -> {ret}')
            return ret
        except:
            print(traceback.format_exc())

    def depth(self, symbol, depth=5, type='step0'):
        try:
            url = f'https://api.huobi.pro/market/depth?depth={depth}&symbol={symbol}&type={type}'
            res = self.call(method='GET', url=url, header={})
            return res
        except Exception:
            print(traceback.format_exc())

    def create_order(self, symbol, type, amount, price):
        try:
            method, req_url = 'POST', '/v1/order/orders/place'
            header = {"Content-Type": "application/json"}
            post_body = {'account-id': self.main_account_id, 'amount': amount,
                         'price': price, 'symbol': symbol,
                         'type': type, 'source': 'api'}
            # 17388210005
            builder = UrlParamsBuilder()
            print(f'初始时的builder - {builder}')

            self.create_signature(method=method,
                                  url='https://api.huobi.pro/v1/order/orders/place',
                                  builder=builder)

            # sign后
            url = 'https://api.huobi.pro/v1/order/orders/place' + builder.build_url()

            res = self.call(method=method, url=url, header=header,
                            post_body=post_body)
            print(f'res - {res}')
            return res
        except Exception:
            print(traceback.format_exc())

    def order_detail(self, order_id):
        try:
            method = 'GET'
            host_path = f'https://api.huobi.pro/v1/order/orders/{order_id}'
            builder = UrlParamsBuilder()
            self.create_signature(method=method, url=host_path, builder=builder)

            url = host_path + builder.build_url()
            res = self.call(method=method, url=url, header={})
            return res
        except Exception:
            print(traceback.format_exc())

    def cancel_order(self, order_id):
        try:
            header = {"Content-Type": "application/json"}
            builder = UrlParamsBuilder()
            host_path = f'https://api.huobi.pro/v1/order/orders/{order_id}/submitcancel'
            self.create_signature(method='POST',
                                  url=host_path,
                                  builder=builder)

            url = host_path + builder.build_url()
            print(f'url -> {url}')
            res = self.call(method='POST', url=url, header=header, post_body={})
            print(f'res - {res}')
            return res
        except Exception:
            print(traceback.format_exc())

    def call(self, method, url, header, post_body=None):
        try:
            if method == "GET":
                # print("call_sync url : " , request.host + request.url)
                response = requests.get(url=url,
                                        headers=header, timeout=self.timeout)
                # print("receive data : " + response.text)
                if response.status_code == 200 and response.content:
                    return response.json()
                else:
                    return {'code': 1, 'message': ''}

            elif method == "POST":
                print(url)
                print(json.dumps(post_body))
                print(header)
                response = requests.post(url,
                                         data=json.dumps(post_body),
                                         headers=header, timeout=self.timeout)
                if response.status_code == 200 and response.content:
                    return response.json()
                else:
                    return {'code': 1, 'message': ''}
        except:
            print(traceback.format_exc())

    def utc_now(self):
        return datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S')


class UrlParamsBuilder(object):
    def __init__(self):
        self.param_map = dict()
        self.post_map = dict()

    def put_url(self, name, value):
        if value is not None:
            if isinstance(value, list):
                self.param_map[name] = value
            else:
                self.param_map[name] = str(value)

    def put_post(self, name, value):
        if value is not None:
            if isinstance(value, list):
                self.post_map[name] = value
            else:
                self.post_map[name] = str(value)

    def build_url(self):
        if len(self.param_map) == 0:
            return ""
        print(f'self.param_map -> {self.param_map}')
        encoded_param = parse.urlencode(self.param_map)
        return "?" + encoded_param

    def build_url_to_json(self):
        return json.dumps(self.param_map)


if __name__ == '__main__':
    __test_case = HuobiApi()
    # res = __test_case.create_order("eoseth", 'buy-limit', amount='11',
    #                                price='0.01162')
    # res = __test_case.cancel_order(order_id='82538811013')
    # res = __test_case.depth('btcusdt')
    res = __test_case.order_detail('82538811013')
    print(res)
    # {'status': 'ok', 'data': '82538811013'}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容