【干货满满】电商平台API接口用python调用脚本

简介: 这是一个支持淘宝、京东、拼多多、亚马逊等主流电商平台的通用 API 调用 Python 脚本框架,适配 doubao 使用。脚本封装了签名验证、请求处理、异常捕获及限流控制等核心功能,提供统一接口调用方式,便于开发者快速集成与扩展。

以下是一个通用的电商平台 API 接口调用 Python 脚本框架,适用于 doubao 的特点,这个脚本支持多种主流电商平台(如淘宝、京东、拼多多等)的 API 调用,并并包含了签名验证、请求处理、异常处理等核心功能。
import requests
import time
import hashlib
import hmac
import json
from urllib.parse import urlencode, quote_plus
from typing import Dict, Optional, Any, List

class ApiException(Exception):
"""API调用异常基类"""
def init(self, code: str, message: str):
self.code = code
self.message = message
super().init(f"{code}: {message}")

class AuthenticationException(ApiException):
"""认证相关异常"""
pass

class RateLimitException(ApiException):
"""接口限流异常"""
def init(self, code: str, message: str, retry_after: int = 0):
super().init(code, message)
self.retry_after = retry_after

class EcommerceApiClient:
"""电商平台API通用客户端"""

def __init__(self, platform: str, app_key: str, app_secret: str, 
             access_token: Optional[str] = None, sandbox: bool = False):
    """
    初始化API客户端
    :param platform: 平台名称,如"taobao", "jd", "pinduoduo", "amazon"
    :param app_key: 应用Key
    :param app_secret: 应用密钥
    :param access_token: 访问令牌,部分平台需要
    :param sandbox: 是否使用沙箱环境
    """
    self.platform = platform.lower()
    self.app_key = app_key
    self.app_secret = app_secret
    self.access_token = access_token
    self.sandbox = sandbox
    self.session = requests.Session()
    self.session.headers.update({
        "Content-Type": "application/x-www-form-urlencoded;charset=utf-8",
        "User-Agent": "EcommerceApiClient/1.0.0"
    })

    # 各平台API配置
    self.api_configs = {
        "taobao": {
            "gateway": "https://eco.taobao.com/router/rest",
            "sandbox_gateway": "https://gw-api.tbsandbox.com/router/rest",
            "sign_method": "md5"
        },
        "jd": {
            "gateway": "https://api.jd.com/routerjson",
            "sandbox_gateway": "https://api.jd.com/routerjson",
            "sign_method": "md5"
        },
        "pinduoduo": {
            "gateway": "https://gw-api.pinduoduo.com/api/router",
            "sandbox_gateway": "https://gw-api.pinduoduo.com/api/router",
            "sign_method": "md5"
        },
        "amazon_sp": {
            "gateway": "https://sellingpartnerapi-na.amazon.com",
            "sandbox_gateway": "https://sandbox.sellingpartnerapi-na.amazon.com",
            "sign_method": "hmac-sha256"
        }
    }

    # 确保平台配置存在
    if self.platform not in self.api_configs:
        raise ValueError(f"不支持的平台: {platform},支持的平台有: {list(self.api_configs.keys())}")

    self.config = self.api_configs[self.platform]
    self.gateway = self.config["sandbox_gateway"] if sandbox else self.config["gateway"]

    # 请求计数器,用于控制频率
    self.request_counter = 0
    self.last_reset_time = time.time()

def _get_sign(self, params: Dict[str, Any]) -> str:
    """
    根据平台规则生成签名
    :param params: 请求参数
    :return: 签名字符串
    """
    if self.platform == "taobao" or self.platform == "jd":
        # 淘宝/京东签名方式: 排序后拼接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 hashlib.md5(sign_str.encode("utf-8")).hexdigest().upper()

    elif self.platform == "pinduoduo":
        # 拼多多签名方式
        sorted_params = sorted(params.items(), key=lambda x: x[0])
        sign_str = self.app_secret
        for k, v in sorted_params:
            sign_str += f"{k}{v}"
        sign_str += self.app_secret
        return hashlib.md5(sign_str.encode("utf-8")).hexdigest().upper()

    elif self.platform == "amazon_sp":
        # 亚马逊SP-API签名较为复杂,这里简化处理
        # 实际使用建议参考官方SDK
        timestamp = time.strftime('%Y%m%dT%H%M%SZ', time.gmtime())
        return hmac.new(
            self.app_secret.encode('utf-8'),
            timestamp.encode('utf-8'),
            hashlib.sha256
        ).hexdigest()

    return ""

def _check_rate_limit(self):
    """检查并控制请求频率"""
    current_time = time.time()
    # 每分钟最多60次请求
    if current_time - self.last_reset_time > 60:
        self.request_counter = 0
        self.last_reset_time = current_time

    self.request_counter += 1
    if self.request_counter > 60:
        raise RateLimitException("RATE_LIMIT", "请求频率超过限制", 60 - (current_time - self.last_reset_time))

def _handle_response(self, response: requests.Response) -> Dict[str, Any]:
    """
    处理API响应
    :param response: 响应对象
    :return: 解析后的响应数据
    """
    try:
        if response.status_code == 429:
            retry_after = int(response.headers.get("Retry-After", 10))
            raise RateLimitException("RATE_LIMIT", "请求过于频繁", retry_after)

        response.raise_for_status()

        # 不同平台返回格式可能不同
        if self.platform in ["taobao", "jd", "pinduoduo"]:
            result = response.json()

            # 处理淘宝API响应
            if self.platform == "taobao":
                error_response = result.get("error_response")
                if error_response:
                    raise ApiException(
                        error_response.get("code", "UNKNOWN_ERROR"),
                        error_response.get("msg", "未知错误")
                    )

            # 处理京东API响应
            elif self.platform == "jd":
                if result.get("code") != 0:
                    raise ApiException(
                        str(result.get("code", "UNKNOWN_ERROR")),
                        result.get("msg", "未知错误")
                    )

            # 处理拼多多API响应
            elif self.platform == "pinduoduo":
                if "error_response" in result:
                    error = result["error_response"]
                    raise ApiException(
                        str(error.get("code", "UNKNOWN_ERROR")),
                        error.get("error_msg", "未知错误")
                    )

            return result

        elif self.platform == "amazon_sp":
            # 亚马逊SP-API响应处理
            if response.headers.get("Content-Type", "").startswith("application/json"):
                return response.json()
            return {"content": response.text}

        return response.json()

    except requests.exceptions.JSONDecodeError:
        raise ApiException("INVALID_RESPONSE", f"无效的响应格式: {response.text}")
    except requests.exceptions.HTTPError as e:
        raise ApiException("HTTP_ERROR", f"HTTP错误: {str(e)}")

def call_api(self, method: str, params: Optional[Dict[str, Any]] = None, 
             http_method: str = "POST") -> Dict[str, Any]:
    """
    通用API调用方法
    :param method: API方法名,如"taobao.item.get"
    :param params: API参数
    :param http_method: HTTP请求方法,GET或POST
    :return: API返回结果
    """
    # 检查频率限制
    self._check_rate_limit()

    # 基础参数
    base_params = {
        "app_key": self.app_key,
        "method": method,
        "timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
        "format": "json",
        "v": "2.0",
        "sign_method": self.config["sign_method"]
    }

    # 添加访问令牌(如果有)
    if self.access_token:
        base_params["access_token"] = self.access_token

    # 合并参数
    request_params = {** base_params, **(params or {})}

    # 生成签名
    request_params["sign"] = self._get_sign(request_params)

    # 构建请求URL和数据
    url = self.gateway
    data = None
    if http_method.upper() == "GET":
        url = f"{url}?{urlencode(request_params, quote_via=quote_plus)}"
    else:
        data = urlencode(request_params, quote_via=quote_plus)

    # 发送请求
    try:
        response = self.session.request(
            method=http_method,
            url=url,
            data=data,
            timeout=30
        )
        return self._handle_response(response)
    except requests.exceptions.RequestException as e:
        raise ApiException("REQUEST_FAILED", f"请求失败: {str(e)}")

使用示例

if name == "main":

# 初始化客户端(以淘宝为例)
taobao_client = EcommerceApiClient(
    platform="taobao",
    app_key="YOUR_TAOBAO_APP_KEY",
    app_secret="YOUR_TAOBAO_APP_SECRET",
    access_token="YOUR_TAOBAO_ACCESS_TOKEN",
    sandbox=True  # 测试环境
)

try:
    # 调用商品搜索API
    search_result = taobao_client.call_api(
        method="taobao.item.search",
        params={
            "q": "手机",
            "page_no": 1,
            "page_size": 20
        }
    )
    print("淘宝商品搜索结果:")
    print(json.dumps(search_result, ensure_ascii=False, indent=2))

    # 调用订单列表API(以拼多多为例)
    pdd_client = EcommerceApiClient(
        platform="pinduoduo",
        app_key="YOUR_PDD_CLIENT_ID",
        app_secret="YOUR_PDD_CLIENT_SECRET",
        access_token="YOUR_PDD_ACCESS_TOKEN"
    )

    order_result = pdd_client.call_api(
        method="pdd.order.list.get",
        params={
            "start_confirm_at": int(time.time()) - 86400 * 7,  # 7天前
            "end_confirm_at": int(time.time()),
            "page": 1,
            "page_size": 10
        }
    )
    print("\n拼多多订单列表结果:")
    print(json.dumps(order_result, ensure_ascii=False, indent=2))

except RateLimitException as e:
    print(f"请求被限流,建议{e.retry_after}秒后重试")
except AuthenticationException as e:
    print(f"认证失败: {e.message}")
except ApiException as e:
    print(f"API调用错误: {e.code} - {e.message}")
except Exception as e:
    print(f"发生未知错误: {str(e)}")

这个电商平台 API 调用脚本具有以下特点:
1. 多平台支持 :内置了淘宝、京东、拼多多和亚马逊 SP-API 的配置,可轻松扩展支持其他平台
2. 完整的签名机制 :根据不同平台的签名规则实现了对应的签名生成方法
3. 异常处理 :定义了多种异常类型,包括认证异常、限流异常等,便于错误处理
4. 频率控制 :内置请求频率控制机制,避免触发平台的 API 调用限制
5. 通用接口 :提供统一的callapi方法,简化不同 API 的调用流程
使用方法:
替换示例中的YOUR
*为实际的 API 密钥和令牌
根据需要调用的 API 方法,传入相应的参数
处理返回结果或捕获可能的异常
不同平台的 API 方法名和参数格式可能有所不同,使用时需要参考各平台的官方文档进行调整。对于更复杂的场景,建议结合平台提供的 SDK 进行开发。

相关文章
|
2月前
|
算法 数据挖掘 BI
拼多多 API 接口:解锁电商世界的无限可能
拼多多API接口是商家高效运营的利器,支持商品信息同步、订单自动化管理、营销活动对接及数据决策分析。通过API,可实现多平台信息互通、提升运营效率30%、降低错误率20%,助力销量增长50%。掌握API,赢在电商竞争起跑线。
329 5
|
2月前
|
机器人 API 开发者
解锁1688电商API:开启电商新世界的神奇钥匙
1688电商API是连接商家与1688平台的高效工具,通过自动化同步商品、订单、库存等数据,显著提升运营效率30%以上。它省时省力、降低出错率,并支持智能补货等功能,助力企业快速拓展业务。技术小白也可轻松接入,是电商进阶的必备利器。
200 3
|
2月前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南
|
2月前
|
JSON API 数据安全/隐私保护
Python采集淘宝拍立淘按图搜索API接口及JSON数据返回全流程指南
通过以上流程,可实现淘宝拍立淘按图搜索的完整调用链路,并获取结构化的JSON商品数据,支撑电商比价、智能推荐等业务场景。
|
3月前
|
缓存 监控 供应链
唯品会自定义 API 自定义操作深度分析及 Python 实现
唯品会开放平台提供丰富API,支持商品查询、订单管理、促销活动等电商全流程操作。基于OAuth 2.0认证机制,具备安全稳定的特点。通过组合调用基础接口,可实现数据聚合、流程自动化、监控预警及跨平台集成,广泛应用于供应链管理、数据分析和智能采购等领域。结合Python实现方案,可高效完成商品搜索、订单分析、库存监控等功能,提升电商运营效率。
|
2月前
|
Cloud Native 算法 API
Python API接口实战指南:从入门到精通
🌟蒋星熠Jaxonic,技术宇宙的星际旅人。深耕API开发,以Python为舟,探索RESTful、GraphQL等接口奥秘。擅长requests、aiohttp实战,专注性能优化与架构设计,用代码连接万物,谱写极客诗篇。
Python API接口实战指南:从入门到精通
|
2月前
|
供应链 监控 数据挖掘
解锁淘宝电商 API:开启无限商业新可能
淘宝电商API如同一把“智能钥匙”,赋能商家实现智能选品、精准营销、高效库存管理与深度数据分析。通过实时数据洞察市场趋势,优化运营决策,提升转化率与用户满意度,助力电商企业降本增效,抢占市场先机。
127 6
|
3月前
|
供应链 数据挖掘 API
揭秘天猫详情 API 接口:开启电商数据新大门
天猫详情API接口是电商数据利器,助力选品、市场调研与销售预测。通过获取商品价格、销量、评价等信息,提升决策效率,赋能企业精准运营,抢占市场先机。
141 0
|
3月前
|
JSON API 数据安全/隐私保护
Python采集淘宝评论API接口及JSON数据返回全流程指南
Python采集淘宝评论API接口及JSON数据返回全流程指南
|
3月前
|
缓存 监控 供应链
亚马逊 MWS API 实战:商品详情精准获取与跨境电商数据整合方案
本文详细解析亚马逊MWS API接口的技术实现,重点解决跨境商品数据获取中的核心问题。文章首先介绍MWS接口体系的特点,包括多站点数据获取、AWS签名认证等关键环节,并对比普通电商接口的差异。随后深入拆解API调用全流程,提供签名工具类、多站点客户端等可复用代码。针对跨境业务场景,文章还给出数据整合工具实现方案,支持缓存、批量处理等功能。最后通过实战示例展示多站点商品对比和批量选品分析的应用,并附常见问题解决方案。该技术方案可直接应用于跨境选品、价格监控等业务场景,帮助开发者高效获取亚马逊商品数据。

热门文章

最新文章

推荐镜像

更多