WorkBuddy配置即代码:桌面智能体运行时入门指南
2026/9/26 6:23:09
全平台对接的核心是 **“统一封装 + 分平台适配”**:通过抽象通用接口(商品、订单、物流、用户),适配不同电商平台的 API 差异(签名方式、请求格式、数据结构),最终提供 “一次集成,全平台调用” 的能力。既降低开发者接入成本,也能作为 API 服务产品对外输出,覆盖电商 ERP、数据分析、比价工具等场景。
| 层级 | 核心职责 | 技术选型 |
|---|---|---|
| 适配层 | 分平台处理签名、请求格式、数据映射 | Python 类继承(抽象基类 + 平台实现) |
| 统一接口层 | 暴露通用方法(如 get_products、create_order) | 装饰器(日志、重试、限流) |
| 业务层 | 封装业务逻辑(数据清洗、跨平台对比) | 自定义服务类 |
| 接入层 | 对外提供 API(REST/SDK)、权限控制 | FastAPI/Flask + JWT |
| 存储层 | 缓存平台 Token、存储接口日志、结构化数据 | Redis + MySQL/MongoDB |
requests(请求)、pyjwt(签名)、redis(缓存)、tenacity(重试)bash
运行
# 安装依赖 pip install requests pyjwt redis tenacity python-dotenvpython
运行
import requests import hashlib import hmac import time import random from dotenv import load_dotenv import os load_dotenv() # 加载.env文件中的配置(APP_KEY、APP_SECRET) class TaobaoAPI: def __init__(self): self.app_key = os.getenv("TAOBAO_APP_KEY") self.app_secret = os.getenv("TAOBAO_APP_SECRET") self.gateway = "https://eco.taobao.com/router/rest" def _sign(self, params): # 签名逻辑:按参数名ASCII排序,拼接后用app_secret加密 sorted_params = sorted(params.items(), key=lambda x: x[0]) sign_str = self.app_secret + "".join([f"{k}{v}" for k, v in sorted_params]) + self.app_secret return hmac.new(sign_str.encode(), digestmod=hashlib.sha256).hexdigest().upper() def get_product(self, num_iid): """查询商品详情(num_iid为商品ID)""" params = { "method": "taobao.item.get", "app_key": self.app_key, "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"), "format": "json", "v": "2.0", "sign_method": "hmac", "num_iid": num_iid, "fields": "title,price,stock,desc" } params["sign"] = self._sign(params) response = requests.get(self.gateway, params=params, timeout=10) return self._parse_response(response.json()) def _parse_response(self, data): """统一数据格式(适配统一接口层)""" if "error_response" in data: raise Exception(f"Taobao API Error: {data['error_response']['msg']}") item = data["item_get_response"]["item"] return { "platform": "taobao", "product_id": item["num_iid"], "title": item["title"], "price": float(item["price"]), "stock": int(item["stock"]), "description": item["desc"], "create_time": item.get("created", "") } # 调用示例 if __name__ == "__main__": taobao = TaobaoAPI() try: product = taobao.get_product("67890123456") # 替换为真实商品ID print(product) except Exception as e: print(f"调用失败:{str(e)}")python
运行
import requests import hashlib import time import json from dotenv import load_dotenv import os load_dotenv() class JDAPI: def __init__(self): self.app_key = os.getenv("JD_APP_KEY") self.app_secret = os.getenv("JD_APP_SECRET") self.access_token = os.getenv("JD_ACCESS_TOKEN") # 需通过授权流程获取 self.gateway = "https://api.jd.com/routerjson" def _sign(self, params): # 签名逻辑:按参数名排序,拼接后MD5加密 sorted_params = sorted(params.items(), key=lambda x: x[0]) sign_str = self.app_secret + "".join([f"{k}{v}" for k, v in sorted_params]) + self.app_secret return hashlib.md5(sign_str.encode()).hexdigest().upper() def search_orders(self, start_date, end_date, page=1, page_size=20): """查询订单列表(按时间范围)""" params = { "method": "jingdong.order.read.searchOrders", "app_key": self.app_key, "access_token": self.access_token, "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"), "v": "1.0", "format": "json", "page": page, "page_size": page_size, "start_date": start_date, "end_date": end_date } params["sign"] = self._sign(params) response = requests.post(self.gateway, data=json.dumps(params), headers={"Content-Type": "application/json"}, timeout=10) return self._parse_response(response.json()) def _parse_response(self, data): if data.get("code") != 0: raise Exception(f"JD API Error: {data.get('msg', '未知错误')}") orders = data["result"]["orders"] return [ { "platform": "jd", "order_id": order["order_id"], "buyer_id": order["buyer_id"], "amount": float(order["order_amount"]), "status": order["order_status"], "create_time": order["create_time"] } for order in orders ] # 调用示例 if __name__ == "__main__": jd = JDAPI() try: orders = jd.search_orders("2024-01-01 00:00:00", "2024-01-02 23:59:59") print(orders) except Exception as e: print(f"调用失败:{str(e)}")python
运行
import requests import hashlib import time import urllib.parse from dotenv import load_dotenv import os load_dotenv() class PddAPI: def __init__(self): self.client_id = os.getenv("PDD_CLIENT_ID") self.client_secret = os.getenv("PDD_CLIENT_SECRET") self.gateway = "https://gw-api.pinduoduo.com/api/router" def _sign(self, params): # 签名逻辑:参数URL编码后排序,拼接secret sorted_params = sorted(params.items(), key=lambda x: x[0]) sign_str = self.client_secret + "".join([f"{k}{urllib.parse.quote(str(v), safe='')}" for k, v in sorted_params]) + self.client_secret return hashlib.md5(sign_str.encode()).hexdigest().upper() def get_goods(self, goods_id): """查询商品详情""" params = { "type": "pdd.goods.get", "client_id": self.client_id, "timestamp": int(time.time()), "goods_id_list": f"[{goods_id}]", "return_goods_details": True } params["sign"] = self._sign(params) response = requests.get(self.gateway, params=params, timeout=10) return self._parse_response(response.json()) def _parse_response(self, data): if data.get("error_response"): raise Exception(f"PDD API Error: {data['error_response']['error_msg']}") goods = data["goods_get_response"]["goods_list"][0] return { "platform": "pdd", "product_id": goods["goods_id"], "title": goods["goods_name"], "price": float(goods["min_group_price"]) / 100, # 拼多多价格单位为分 "stock": goods["goods_stock"], "description": goods.get("goods_desc", ""), "create_time": goods.get("create_time", "") } # 调用示例 if __name__ == "__main__": pdd = PddAPI() try: product = pdd.get_goods("1234567890") # 替换为真实商品ID print(product) except Exception as e: print(f"调用失败:{str(e)}")注:所有平台的完整 API 列表、参数详情请参考官方文档(文末附链接)
将各平台适配层封装为统一接口,对外提供标准化调用方式,方便二次开发或产品化输出:
python
运行
from abc import ABCMeta, abstractmethod from tenacity import retry, stop_after_attempt, wait_exponential import redis # 缓存客户端(用于Token缓存、限流) redis_client = redis.Redis(host="localhost", port=6379, db=0) class BaseEcommerceAPI(metaclass=ABCMeta): """抽象基类:定义通用接口""" @abstractmethod def get_product(self, product_id): """获取商品详情""" pass @abstractmethod def search_orders(self, start_date, end_date, page=1, page_size=20): """查询订单列表""" pass @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10)) def _request(self, *args, **kwargs): """统一请求方法:重试、超时控制""" try: response = requests.request(*args, **kwargs, timeout=10) response.raise_for_status() return response except requests.exceptions.RequestException as e: print(f"请求失败:{str(e)},将重试...") raise def _limit_rate(self, platform): """限流控制:每个平台每秒最多5次请求""" key = f"rate_limit:{platform}" current = redis_client.incr(key) if current == 1: redis_client.expire(key, 1) elif current > 5: raise Exception(f"{platform} API 限流:每秒最多5次请求") # 注册各平台API(工厂模式) class EcommerceAPIFactory: @staticmethod def get_api(platform): if platform == "taobao": return TaobaoAPI() elif platform == "jd": return JDAPI() elif platform == "pdd": return PddAPI() elif platform == "douyin": return DouyinAPI() # 需自行实现DouyinAPI类 else: raise ValueError(f"不支持的平台:{platform}") # 调用示例(统一接口) if __name__ == "__main__": # 获取淘宝商品 taobao_api = EcommerceAPIFactory.get_api("taobao") print(taobao_api.get_product("67890123456")) # 获取拼多多订单 pdd_api = EcommerceAPIFactory.get_api("pdd") print(pdd_api.search_orders("2024-01-01 00:00:00", "2024-01-02 23:59:59"))| 平台 | 合规要点 |
|---|---|
| 淘宝 / 天猫 | 1. 不得爬取未授权数据;2. 遵守 API 调用频率限制(默认 10QPS);3. 数据不得用于商业售卖 |
| 京东 | 1. 接入前需签署《京东开放平台服务协议》;2. 订单数据仅可用于自身业务,不可泄露 |
| 拼多多 | 1. 禁止模拟用户行为调用 API;2. 商品数据需注明来源;3. 日调用量超阈值需申请扩容 |
| 抖音电商 | 1. 仅支持企业主体接入;2. 需通过 “抖店授权” 获取数据;3. 禁止用于竞品分析 |
/api/v1/{platform}/products)| 客户类型 | 核心需求 | 解决方案 |
|---|---|---|
| 电商 ERP 厂商 | 全平台订单同步、库存管理 | 提供订单 / 库存 / 商品统一接口,支持实时回调 |
| 数据分析公司 | 全平台商品价格、销量数据采集 | 提供高并发数据采集接口,支持批量查询 |
| 比价工具开发者 | 多平台商品价格对比 | 提供标准化商品价格接口,支持缓存优化 |
个人能否对接全平台 API?不能,多数平台(如京东、抖音)仅支持企业主体接入,个人仅能调用部分只读接口(如淘宝商品查询)。
如何处理 API 调用频率限制?结合缓存(Redis)+ 限流(令牌桶算法)+ 异步队列(Celery),高峰时段排队处理请求。
平台 API 版本更新怎么办?适配层预留版本字段,新增版本时新建适配类(如TaobaoAPIV2),老版本兼容过渡 3 个月。
数据安全如何保障?传输加密(HTTPS)、存储加密(敏感数据 AES 加密)、权限控制(JWT+IP 白名单)、定期安全审计。
通过以上方案,可快速实现 “全平台电商 API 对接” 的技术落地,并转化为可商业化的 API 服务产品。如需某一平台的深度对接指南(如抖音电商授权流程、京东 Token 刷新机制),可随时告知,将提供更详细的步骤和代码。