递归拉取订单列表的方法

本文介绍了一种使用Python通过递归方式从交易所拉取完整订单列表的方法,展示了如何处理分页数据,确保一次性获取所有订单信息。代码示例详细解释了如何解析订单JSON数据,包括订单ID、类型、价格等关键字段。

拉取交易所订单列表时,常常需要分页拉取,但调用的时候希望一次获得完整的数据,这时采用递归的方式

订单json如下所示

{
    "datas":{
        "totalRow":625,
        "entrustList":[
            {
                "entrustId":"E6615806999819034624",
                "type":1,
                "completeAmount":"0",
                "price":"0.001874",
                "availabelAmount":"1047",
                "sequeueId":6615806999819034624,
                "completeTotalMoney":"0",
                "amount":"1047",
                "createTime":1577331304507,
                "status":0
            },
            {
                "entrustId":"E6615806999282163712",
                "type":1,
                "completeAmount":"0",
                "price":"0.001883",
                "availabelAmount":"1047",
                "sequeueId":6615806999282163712,
                "amount":"1047",
                "createTime":1577331304379,
                "status":0
            }
        ],
        "totalPage":63,
        "pageSize":10,
        "pageNum":2
    },
    "resMsg":{
        "code":"1",
        "message":"success !",
        "enMessage":"None"
    }
}

 

python3代码如下

    #获取未成交订单
    def order_open(self, symbol, **kwargs):
        body = {
            'marketId'  : self.market2id[symbol],
            'pageIndex' : 1,
            'pageSize'  : 100,
        }

        for key, value in kwargs.items():
            body[key] = value

        params = {
            'body'      :body,
            'timestamp' :str(int(time.time() * 1000))
        }
        params['sign'] = self.signature("GET", params)
        url = self._web_url + '/oder_open'
        result = self.http_request(url, method = "GET", params = params)

        dict = {}
        for item in result["datas"]["entrustList"]:
            filter_dict = {}
            filter_dict['price'] = float(item["price"])
            filter_dict['quantity'] = float(item["amount"])
            filter_dict['direction'] = 'BUY' if item["type"] == 1 else "SELL"
            filter_dict['time'] = float(item["createTime"])
            dict[item["entrustId"]] = filter_dict

        if (body['pageIndex'] <= int(result["datas"]["totalRow"] / 100)):
            dict.update(self.order_open(symbol, pageIndex=body['pageIndex'] + 1))
            return dict
        else:
            return dict

递归的核心在于这一段

        if (body['pageIndex'] <= int(result["datas"]["totalRow"] / 100)):
            dict.update(self.order_open(symbol, pageIndex=body['pageIndex'] + 1))
            return dict
        else:
            return dict

 

import requests import json from config import ( LOGIN_URL, LOGIN_PAYLOAD, SYNC_URL, SAVE_URL, CHANNEL_MAP, DEFAULT_CHANNEL_ID, FIXED_SERIES_ID, SKU_LOTTERY_MAP, SALE_NAME ) def find_orders(obj): """递归查找包含 goodsSku 的订单列表""" results = [] if isinstance(obj, dict): if "goodsSku" in obj and "goodsName" in obj: results.append(obj) for v in obj.values(): results.extend(find_orders(v)) elif isinstance(obj, list): for item in obj: results.extend(find_orders(item)) return results # 1️⃣ 登录获 token login_resp = requests.post(LOGIN_URL, json=LOGIN_PAYLOAD) login_data = login_resp.json() token = login_data.get("data", {}).get("token") if not token: raise ValueError("登录失败,没有拿到 token") headers = {"Content-Type": "application/json", "token": token} print("登录成功,token:", token) # 2️⃣ 同步订单 sync_payload = { "productSeriesId": [FIXED_SERIES_ID], "saleMode": 0, "biCheck": True, "channelId": DEFAULT_CHANNEL_ID } sync_resp = requests.post(SYNC_URL, headers=headers, json=sync_payload) resp_data = sync_resp.json() # 3️⃣ 找到所有订单 orders = find_orders(resp_data) if not orders: raise ValueError("没有找到任何包含 goodsSku 的订单") print(f"共找到 {len(orders)} 个订单") # 4️⃣ 只处理匹配的 SKU 并填入天猫抽奖次数 for order in orders: sku = order.get("goodsSku") if sku in SKU_LOTTERY_MAP: order["tmallLotteryNum"] = SKU_LOTTERY_MAP[sku] # 5️⃣ 构造保存接口数据 save_payload = { "saleName": SALE_NAME, # 预采单名称 "channelId": DEFAULT_CHANNEL_ID, "seriesIdS": FIXED_SERIES_ID, # 注意接口要求 seriesIdS "orderList": orders } # 💡 打印最终提交 JSON print("提交保存接口的 JSON:") print(json.dumps(save_payload, indent=2, ensure_ascii=False)) # 6️⃣ 调用保存接口 save_resp = requests.post(SAVE_URL, headers=headers, json=save_payload) print("保存返回:", save_resp.status_code, save_resp.text) 结合一下
最新发布
09-10
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

比特量化

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值