国内主流电商淘宝+京东+1688api数据接口实操

本文涉及的产品
模型训练 PAI-DLC,100CU*H 3个月
交互式建模 PAI-DSW,每月250计算时 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
简介: 这是一套用于获取淘宝、京东和1688电商平台数据的Python实现方案。通过定义统一的API基类,封装了请求流程与异常处理机制,包括请求超时、频率限制及认证失败等。针对各平台特性,分别实现了签名生成、参数准备与接口调用功能,如商品搜索、详情查询和订单列表获取等。使用前需申请各平台开发者账号以获取AppKey和AppSecret,并根据实际需求调整代码配置与业务逻辑,同时注意控制请求频率避免限流。

提供一个获取淘宝、京东和 1688 电商平台 API 数据的 Python 实现方案。这个方案包含了 API 接口的封装、请求处理、数据解析等功能,并提供了完整的异常处理机制。

`ecommerce_api.py
import requests
import time
import hmac
import hashlib
import json
import base64
from typing import Dict, Any, Optional, List

class APIError(Exception):
"""API请求错误"""
def init(self, code: str, message: str, details: Optional[Dict[str, Any]] = None):
self.code = code
self.message = message
self.details = details
super().init(f"APIError: {code} - {message}")

class RateLimitError(APIError):
"""请求频率限制错误"""
def init(self, retry_after: int, message: str = "请求频率超过限制"):
self.retry_after = retry_after
super().init("RATE_LIMIT_EXCEEDED", message, {"retry_after": retry_after})

class AuthError(APIError):
"""认证失败错误"""
def init(self, message: str = "认证失败"):
super().init("AUTHENTICATION_FAILED", message)

class EcommerceAPI:
"""电商API基类"""
def init(self, app_key: str, app_secret: str, timeout: int = 30):
self.app_key = app_key
self.app_secret = app_secret
self.timeout = timeout
self.session = requests.Session()

def _generate_signature(self, params: Dict[str, Any]) -> str:
    """生成API签名(需要根据具体平台的签名算法实现)"""
    raise NotImplementedError("子类必须实现签名生成方法")

def _prepare_params(self, method: str, params: Dict[str, Any]) -> Dict[str, Any]:
    """准备API请求参数(添加公共参数等)"""
    common_params = {
        "app_key": self.app_key,
        "timestamp": int(time.time() * 1000),
        "format": "json",
        "v": "2.0",
        "method": method
    }
    merged_params = {**common_params, **params}
    merged_params["sign"] = self._generate_signature(merged_params)
    return merged_params

def _send_request(self, url: str, method: str, params: Dict[str, Any]) -> Dict[str, Any]:
    """发送API请求并处理响应"""
    try:
        # 准备请求参数
        prepared_params = self._prepare_params(method, params)

        # 发送请求
        response = self.session.post(url, data=prepared_params, timeout=self.timeout)
        response.raise_for_status()

        # 解析响应
        result = response.json()

        # 检查API返回状态(需要根据具体平台的返回格式调整)
        if "error_response" in result:
            error = result["error_response"]
            error_code = error.get("code", "UNKNOWN_ERROR")
            error_msg = error.get("msg", "未知错误")
            error_sub_code = error.get("sub_code")
            error_sub_msg = error.get("sub_msg")

            if error_code == "isv.access-control-exceed-limit":
                # 处理频率限制错误
                retry_after = int(error_sub_msg.split(" ")[-1]) if error_sub_msg else 60
                raise RateLimitError(retry_after, error_msg)
            elif error_code in ["isv.invalid-parameter:app-key", "isv.invalid-appsecret"]:
                raise AuthError(error_msg)
            else:
                raise APIError(error_code, error_msg, {"sub_code": error_sub_code, "sub_msg": error_sub_msg})

        return result

    except requests.exceptions.Timeout:
        raise APIError("REQUEST_TIMEOUT", "请求超时")
    except requests.exceptions.ConnectionError:
        raise APIError("CONNECTION_ERROR", "连接错误")
    except requests.exceptions.HTTPError as e:
        raise APIError(f"HTTP_ERROR_{e.response.status_code}", f"HTTP错误: {e.response.status_code}")
    except json.JSONDecodeError:
        raise APIError("RESPONSE_PARSE_ERROR", "响应解析错误")
    except RateLimitError:
        raise  # 直接重新抛出频率限制错误
    except Exception as e:
        raise APIError("UNKNOWN_ERROR", f"未知错误: {str(e)}")    ``js

`` alibaba1688_api.py
from .ecommerce_api import EcommerceAPI, APIError, RateLimitError, AuthError
import time
import hashlib
import hmac
import base64
import json

class Alibaba1688API(EcommerceAPI):
"""1688API接口实现"""
BASE_URL = "https://gw.open.1688.com/openapi/param2/1"

def __init__(self, app_key: str, app_secret: str, access_token: Optional[str] = None, timeout: int = 30):
    super().__init__(app_key, app_secret, timeout)
    self.access_token = access_token

def _generate_signature(self, params: Dict[str, Any]) -> str:
    """生成1688API签名"""
    # 1. 按照参数名的字典序升序排列
    sorted_params = sorted(params.items(), key=lambda x: x[0])

    # 2. 拼接参数名和参数值
    string_to_sign = ""
    for key, value in sorted_params:
        string_to_sign += f"{key}{value}"

    # 3. 使用HMAC-SHA1加密
    h = hmac.new(self.app_secret.encode("utf-8"), string_to_sign.encode("utf-8"), hashlib.sha1)
    signature = base64.b64encode(h.digest()).decode()
    return signature

def _prepare_params(self, method: str, params: Dict[str, Any]) -> Dict[str, Any]:
    """准备API请求参数"""
    method_parts = method.split(".")
    namespace = method_parts[0]
    api_name = ".".join(method_parts[1:])

    common_params = {
        "method": method,
        "appKey": self.app_key,
        "timestamp": int(time.time() * 1000),
        "format": "json",
        "v": "1.0",
        "signMethod": "hmac-sha1"
    }

    if self.access_token:
        common_params["access_token"] = self.access_token

    merged_params = {**common_params, **params}
    merged_params["sign"] = self._generate_signature(merged_params)

    return merged_params

def get_item_info(self, product_id: str) -> Dict[str, Any]:
    """获取商品信息"""
    method = "com.alibaba.product.alibaba.product.get"
    params = {
        "productID": product_id,
        "webSite": "1688"
    }
    return self._send_request(f"{self.BASE_URL}/{self.app_key}/{method}", method, params)

def get_item_search(self, keywords: str, page_no: int = 1, page_size: int = 20) -> Dict[str, Any]:
    """搜索商品"""
    method = "com.alibaba.product.alibaba.product.search"
    params = {
        "keywords": keywords,
        "page": page_no,
        "pageSize": page_size,
        "webSite": "1688"
    }
    return self._send_request(f"{self.BASE_URL}/{self.app_key}/{method}", method, params)

def get_order_list(self, startTime: str, endTime: str, page: int = 1, page_size: int = 20) -> Dict[str, Any]:
    """获取订单列表"""
    method = "com.alibaba.trade.alibaba.trade.getSellerOrderList"
    params = {
        "param1": json.dumps({
            "webSite": "1688",
            "createStartTime": startTime,
            "createEndTime": endTime,
            "currentPage": page,
            "pageSize": page_size
        })
    }
    return self._send_request(f"{self.BASE_URL}/{self.app_key}/{method}", method, params)    

jd_api.py
from .ecommerce_api import EcommerceAPI, APIError, RateLimitError, AuthError
import time
import hashlib
import json

class JDApi(EcommerceAPI):
"""京东API接口实现"""
BASE_URL = "https://api.jd.com/routerjson"

def __init__(self, app_key: str, app_secret: str, access_token: Optional[str] = None, timeout: int = 30):
    super().__init__(app_key, app_secret, timeout)
    self.access_token = access_token

def _generate_signature(self, params: Dict[str, Any]) -> str:
    """生成京东API签名"""
    # 1. 按照参数名的字典序升序排列
    sorted_params = sorted(params.items(), key=lambda x: x[0])

    # 2. 拼接参数名和参数值
    string_to_sign = self.app_secret
    for key, value in sorted_params:
        string_to_sign += f"{key}{value}"
    string_to_sign += self.app_secret

    # 3. 使用MD5加密
    signature = hashlib.md5(string_to_sign.encode("utf-8")).hexdigest().upper()
    return signature

def _prepare_params(self, method: str, params: Dict[str, Any]) -> Dict[str, Any]:
    """准备API请求参数"""
    common_params = {
        "app_key": self.app_key,
        "method": method,
        "timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
        "format": "json",
        "v": "2.0"
    }

    if self.access_token:
        common_params["access_token"] = self.access_token

    # 处理JSON类型的参数
    json_params = {}
    for key, value in params.items():
        if isinstance(value, (dict, list)):
            json_params[key] = json.dumps(value, ensure_ascii=False)
        else:
            json_params[key] = value

    merged_params = {**common_params, **json_params}
    merged_params["sign"] = self._generate_signature(merged_params)
    return merged_params

def get_item_info(self, sku_ids: str) -> Dict[str, Any]:
    """获取商品信息"""
    method = "jingdong.ware.productInfo.get"
    params = {
        "skuIds": sku_ids,
        "field": "skuId,wareName,jdPrice,marketPrice,brandName,categoryName,wareStatus,imageList"
    }
    return self._send_request(self.BASE_URL, method, params)

def get_item_search(self, keyword: str, page: int = 1, page_size: int = 20) -> Dict[str, Any]:
    """搜索商品"""
    method = "jingdong.union.open.goods.jingfen.query"
    params = {
        "goodsReq": {
            "keyword": keyword,
            "pageIndex": page,
            "pageSize": page_size,
            "sortName": "price",
            "sort": "asc"
        }
    }
    return self._send_request(self.BASE_URL, method, params)

def get_order_list(self, startTime: str, endTime: str, page: int = 1, pageSize: int = 20) -> Dict[str, Any]:
    """获取订单列表"""
    method = "jingdong.union.open.order.row.query"
    params = {
        "orderReq": {
            "startTime": startTime,
            "endTime": endTime,
            "pageIndex": page,
            "pageSize": pageSize,
            "type": 1,  # 1:下单时间,2:完成时间,3:更新时间
            "childUnionId": ""
        }
    }
    return self._send_request(self.BASE_URL, method, params)    

main.py
from taobao_api import TaobaoAPI
from jd_api import JDApi
from alibaba1688_api import Alibaba1688API
import time

def main():

# 配置信息(请替换为你自己的AppKey和AppSecret)
taobao_config = {
    "app_key": "YOUR_TAOBAO_APP_KEY",
    "app_secret": "YOUR_TAOBAO_APP_SECRET",
    "session_key": "YOUR_TAOBAO_SESSION_KEY"  # 可选,需要授权的API需要此参数
}

jd_config = {
    "app_key": "YOUR_JD_APP_KEY",
    "app_secret": "YOUR_JD_APP_SECRET",
    "access_token": "YOUR_JD_ACCESS_TOKEN"  # 可选,需要授权的API需要此参数
}

alibaba1688_config = {
    "app_key": "YOUR_1688_APP_KEY",
    "app_secret": "YOUR_1688_APP_SECRET",
    "access_token": "YOUR_1688_ACCESS_TOKEN"  # 可选,需要授权的API需要此参数
}

# 初始化API客户端
taobao_api = TaobaoAPI(**taobao_config)
jd_api = JDApi(**jd_config)
alibaba_api = Alibaba1688API(**alibaba1688_config)

# 示例:搜索商品
search_keyword = "手机"

try:
    print("===== 淘宝商品搜索 =====")
    tb_result = taobao_api.get_item_search(q=search_keyword, page_no=1, page_size=5)
    print(json.dumps(tb_result, ensure_ascii=False, indent=2))

    # 控制请求频率,避免触发限流
    time.sleep(1)

    print("\n===== 京东商品搜索 =====")
    jd_result = jd_api.get_item_search(keyword=search_keyword, page=1, page_size=5)
    print(json.dumps(jd_result, ensure_ascii=False, indent=2))

    time.sleep(1)

    print("\n===== 1688商品搜索 =====")
    alibaba_result = alibaba_api.get_item_search(keywords=search_keyword, page_no=1, page_size=5)
    print(json.dumps(alibaba_result, ensure_ascii=False, indent=2))

except RateLimitError as e:
    print(f"请求频率限制错误: 需要等待 {e.retry_after} 秒后重试")
except AuthError as e:
    print(f"认证失败: {e.message}")
except APIError as e:
    print(f"API请求错误: {e.code} - {e.message}")
except Exception as e:
    print(f"未知错误: {str(e)}")

if name == "main":
main()

taobao_api.py
from .ecommerce_api import EcommerceAPI, APIError, RateLimitError, AuthError
import urllib.parse

class TaobaoAPI(EcommerceAPI):
"""淘宝API接口实现"""
BASE_URL = "https://eco.taobao.com/router/rest"

def __init__(self, app_key: str, app_secret: str, session_key: Optional[str] = None, timeout: int = 30):
    super().__init__(app_key, app_secret, timeout)
    self.session_key = session_key

def _generate_signature(self, params: Dict[str, Any]) -> str:
    """生成淘宝API签名"""
    # 1. 按照参数名的字典序升序排列
    sorted_params = sorted(params.items(), key=lambda x: x[0])

    # 2. 拼接参数名和参数值
    string_to_sign = self.app_secret
    for key, value in sorted_params:
        string_to_sign += f"{key}{value}"
    string_to_sign += self.app_secret

    # 3. 使用MD5加密并转换为大写
    signature = hashlib.md5(string_to_sign.encode("utf-8")).hexdigest().upper()
    return signature

def _prepare_params(self, method: str, params: Dict[str, Any]) -> Dict[str, Any]:
    """准备API请求参数"""
    common_params = super()._prepare_params(method, params)
    if self.session_key:
        common_params["session"] = self.session_key
    return common_params

def get_item_info(self, num_iid: str) -> Dict[str, Any]:
    """获取商品信息"""
    method = "taobao.item.get"
    params = {
        "fields": "num_iid,title,price,pic_url,detail_url,seller_cids,props_name,item_img,skus",
        "num_iid": num_iid
    }
    return self._send_request(self.BASE_URL, method, params)

def get_item_search(self, q: str, page_no: int = 1, page_size: int = 20) -> Dict[str, Any]:
    """搜索商品"""
    method = "taobao.tbk.dg.material.optional"
    params = {
        "q": q,
        "page_no": page_no,
        "page_size": page_size,
        "adzone_id": "YOUR_ADZONE_ID",  # 需要替换为自己的广告位ID
        "platform": 1  # 1:PC,2:无线
    }
    return self._send_request(self.BASE_URL, method, params)

def get_order_list(self, start_time: str, end_time: str, page_no: int = 1, page_size: int = 20) -> Dict[str, Any]:
    """获取订单列表"""
    method = "taobao.tbk.order.details.get"
    params = {
        "start_time": start_time,
        "end_time": end_time,
        "page_no": page_no,
        "page_size": page_size,
        "query_type": 1,  # 1:按照订单创建时间查询
        "tk_status": 12  # 12:订单结算,13:订单付款,14:订单失效,15:订单成功
    }
    return self._send_request(self.BASE_URL, method, params)   

以上代码实现了淘宝、京东和 1688 三个电商平台的 API 接口封装,包含了以下功能:
统一的 API 基类,定义了基本的请求流程和错误处理机制
各平台独立的 API 实现,处理特定的认证和参数格式
常用 API 接口的封装,如商品搜索、商品详情、订单查询等
完整的异常处理机制,包括请求超时、频率限制、认证失败等
使用时,你需要先在各平台申请开发者账号并获取 AppKey 和 AppSecret,然后替换示例代码中的配置信息。注意,部分 API 需要额外的授权才能访问,你需要按照各平台的文档完成授权流程。
实际应用中,你可能需要根据具体业务需求调整参数和处理返回结果。此外,为了避免触发 API 调用频率限制,建议在请求之间添加适当的延迟。

相关文章
|
20天前
|
人工智能 供应链 安全
未来电商趋势:API技术在智能供应链中的应用
随着电商蓬勃发展,供应链管理正借助API技术实现智能化升级。本文解析API作为电商生态“粘合剂”的作用,探讨其在库存管理、物流协同和风险预测中的关键应用,以及对AI融合、区块链安全和实时生态的推动。API不仅提升效率与用户体验,更重塑电商未来格局,成为企业竞争的核心优势。拥抱API集成,将是应对市场复杂性的关键策略。
51 5
|
23天前
|
机器学习/深度学习 人工智能 搜索推荐
AI与电商API的融合:开启智能推荐与精准营销新时代
人工智能(AI)与电商API的深度融合,正推动电商行业迈入智能推荐与精准营销的新时代。通过智能推荐系统、个性化服务、业务流程自动化等应用,AI助力电商平台提升运营效率、优化用户体验,并驱动商业模式创新。然而,数据安全、模型偏差和技术迭代等挑战亟待解决。未来,随着算法优化、自动化深化及跨平台支持加强,AI与电商API将为行业带来更多智能化、个性化的解决方案,开启电商发展的新篇章。
|
21天前
|
JSON API 数据格式
淘宝商品评论API接口,json数据示例参考
淘宝开放平台提供了多种API接口来获取商品评论数据,其中taobao.item.reviews.get是一个常用的接口,用于获取指定商品的评论信息。以下是关于该接口的详细介绍和使用方法:
|
23天前
|
前端开发 搜索推荐 NoSQL
提升用户体验:电商API如何优化购物车与支付流程
本文探讨电商购物车与支付流程优化,通过API技术提升用户体验。一是购物车原子化操作,如ETag版本控制解决冲突、局部更新减少传输;二是支付流程聚合与降级,包括JWT单次验证、动态支付选项及备用渠道切换;三是实时库存保护,利用分布式锁防止超卖。案例显示,优化后购物车冲突减少92%,支付耗时降至2.1秒,移动端转化率提升18%。API作为体验引擎,未来将与前端深度协同,推动更优购物闭环。
51 1
|
23天前
|
存储 供应链 API
区块链技术在电商API中的应用:保障数据安全与交易透明
区块链技术在电商API中的应用,为数据安全与交易透明提供了新方案。通过数据加密、分布式存储、智能合约管理、商品溯源及实时结算等功能,有效提升电商数据安全性与交易可信度。然而,技术成熟度、隐私保护和监管合规等挑战仍需克服。未来,随着物联网、大数据等技术融合及政策支持,区块链将在电商领域发挥更大潜力,推动行业智能化发展。
|
20天前
|
缓存 安全 API
RESTful与GraphQL:电商API接口设计的技术细节与适用场景
本文对比了RESTful与GraphQL这两种主流电商API接口设计方案。RESTful通过资源与HTTP方法定义操作,简单直观但可能引发过度或欠获取数据问题;GraphQL允许客户端精确指定所需字段,提高灵活性和传输效率,但面临深度查询攻击等安全挑战。从性能、灵活性、安全性及适用场景多维度分析,RESTful适合资源导向场景,GraphQL则适用于复杂数据需求。实际开发中需根据业务特点选择合适方案,或结合两者优势,以优化用户体验与系统性能。
|
20天前
|
安全 测试技术 API
电商API接口开发:基础架构搭建全攻略
本文详细解析了电商API接口从零搭建基础架构的全流程。首先通过需求分析明确业务功能与接口规范,选定数据格式(如JSON)及通信方式(如RESTful)。接着在架构设计阶段选择合适的技术栈、数据库方案,并引入API网关实现统一管理。开发实现部分涵盖认证授权、数据访问、日志记录与异常处理等核心功能。安全防护则强调数据加密、传输安全及速率限制策略。测试优化阶段包括单元测试、集成测试、性能与安全测试,确保接口稳定性。最后通过工具生成清晰的API文档并实施版本控制,为开发者提供便利。整体流程系统化、模块化,助力打造高效、安全的电商API接口。
|
20天前
|
缓存 负载均衡 监控
微服务架构下的电商API接口设计:策略、方法与实战案例
本文探讨了微服务架构下的电商API接口设计,旨在打造高效、灵活与可扩展的电商系统。通过服务拆分(如商品、订单、支付等模块)和标准化设计(RESTful或GraphQL风格),确保接口一致性与易用性。同时,采用缓存策略、负载均衡及限流技术优化性能,并借助Prometheus等工具实现监控与日志管理。微服务架构的优势在于支持敏捷开发、高并发处理和独立部署,满足电商业务快速迭代需求。未来,电商API设计将向智能化与安全化方向发展。
|
20天前
|
缓存 负载均衡 网络协议
电商API接口性能优化技术揭秘:缓存策略与负载均衡详解
电商API接口性能优化是提升系统稳定性和用户体验的关键。本文聚焦缓存策略与负载均衡两大核心,详解其在电商业务中的实践。缓存策略涵盖本地、分布式及CDN缓存,通过全量或部分缓存设计和一致性维护,减少后端压力;负载均衡则利用反向代理、DNS轮询等技术,结合动态调整与冗余部署,提高吞吐量与可用性。文中引用大型及跨境电商平台案例,展示优化效果,强调持续监控与迭代的重要性,为电商企业提供了切实可行的性能优化路径。
|
23天前
|
存储 监控 安全
电商API安全指南:保护数据与防止欺诈的最佳实践
在电商领域,API安全至关重要。本文从基础到实践,全面解析电商API安全策略:通过强认证、数据加密、输入验证及访问控制保护敏感数据;借助速率限制、欺诈检测与行为分析防范恶意行为。同时,强调将安全融入开发生命周期,并提供应急计划。遵循最佳实践,可有效降低风险,增强用户信任,助力业务稳健发展。
61 4

热门文章

最新文章