深度分析阿里妈妈API接口,用Python脚本实现

简介: 阿里妈妈是阿里巴巴旗下营销平台,提供淘宝联盟、直通车等服务,支持推广位管理、商品查询等API功能。本文详解其API调用方法,重点实现商品推广信息(佣金、优惠券)获取,并提供Python实现方案。

阿里妈妈(Alimama)是阿里巴巴集团旗下的营销服务平台,核心业务包括淘宝联盟、直通车、钻展等,其开放平台提供了丰富的 API 接口,支持推广位管理、商品查询、订单跟踪、佣金结算等功能。以下基于官方 API 进行深度分析,重点实现商品推广信息(含佣金、优惠券)的获取,并提供 Python 调用方案。

一、阿里妈妈 API 核心特性分析

1. 接口体系与功能域

阿里妈妈 API(以淘宝联盟为例)按业务分为以下核心域:

  • 商品推广:商品详情查询、高佣商品推荐;
  • 推广管理:推广位创建、渠道管理;
  • 订单跟踪:订单列表查询、订单明细;
  • 优惠券:优惠券领取、商品优惠券查询。
    获取商品推广信息(含佣金、到手价、优惠券)需组合调用商品详情接口优惠券接口

    2. 认证与请求规范

  • 认证机制:采用appkey + appsecret + 签名认证,部分接口需用户授权(session):
    • appkey/appsecret:开发者在阿里妈妈开放平台注册应用后获取;
    • sign:通过参数加密生成的签名(核心安全机制);
    • session:用户授权令牌(部分接口需用户登录态)。
  • 请求格式:支持 GET/POST,参数需 URL 编码,响应为 JSON/XML 格式(默认 JSON);
  • 网关地址:统一为。

    3. 签名生成规则(核心)

  1. 收集所有请求参数(含公共参数和业务参数);
  2. 按参数名 ASCII 码升序排序;
  3. 拼接为key=valuekey=value格式(无分隔符);
  4. 首尾拼接appsecret,形成appsecret + 拼接字符串 + appsecret
  5. 对字符串进行 MD5 加密,转换为大写即为签名(sign)。

    二、Python 脚本实现:阿里妈妈 API 调用框架

    以下实现基于淘宝联盟 API,支持商品详情查询(含佣金、优惠券)、推广链接生成,包含签名生成、接口调用及响应解析。
    import requests
    import json
    import time
    import hashlib
    import logging
    from typing import Dict, List, Optional, Tuple
    from requests.exceptions import RequestException

配置日志

logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s"
)

class AlimamaAPI:
def init(self, appkey: str, appsecret: str, session: str = ""):
"""
初始化阿里妈妈API客户端
:param appkey: 应用appkey(从阿里妈妈开放平台获取)
:param appsecret: 应用appsecret(密钥)
:param session: 用户授权session(可选,部分接口需要)
"""
self.appkey = appkey
self.appsecret = appsecret
self.session = session
self.base_url = "https://eco.taobao.com/router/rest"
self.session = requests.Session()

def _generate_sign(self, params: Dict) -> str:
    """生成签名(阿里妈妈API签名规则)"""
    # 1. 按参数名ASCII升序排序
    sorted_params = sorted(params.items(), key=lambda x: x[0])
    # 2. 拼接为keyvaluekeyvalue格式
    sign_str = "".join([f"{k}{v}" for k, v in sorted_params])
    # 3. 首尾拼接appsecret并MD5加密
    sign_str = self.appsecret + sign_str + self.appsecret
    return hashlib.md5(sign_str.encode("utf-8")).hexdigest().upper()

def _get_timestamp(self) -> str:
    """生成时间戳(格式:yyyy-MM-dd HH:mm:ss)"""
    return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

def call_api(self, method: str, biz_params: Dict) -> Optional[Dict]:
    """
    通用API调用方法
    :param method: 接口方法名(如taobao.tbk.item.info.get)
    :param biz_params: 业务参数
    :return: 接口响应数据(业务部分)
    """
    # 1. 公共参数
    public_params = {
        "app_key": self.appkey,
        "method": method,
        "timestamp": self._get_timestamp(),
        "format": "json",
        "v": "2.0",
        "sign_method": "md5"
    }
    # 2. 加入用户session(如需要)
    if self.session:
        public_params["session"] = self.session
    # 3. 合并业务参数
    all_params = {**public_params,** biz_params}
    # 4. 生成签名
    sign = self._generate_sign(all_params)
    all_params["sign"] = sign

    # 5. 发送请求
    try:
        response = self.session.get(
            self.base_url,
            params=all_params,
            timeout=10
        )
        response.raise_for_status()
        result = response.json()

        # 6. 处理错误响应
        if "error_response" in result:
            error = result["error_response"]
            logging.error(f"API错误:{error['msg']}(错误码:{error['code']})")
            return None

        # 7. 提取业务响应(格式:{method}_response)
        response_key = method.replace(".", "_") + "_response"
        if response_key not in result:
            logging.error(f"响应格式错误,缺少{response_key}字段")
            return None

        return result[response_key]

    except RequestException as e:
        logging.error(f"请求异常:{str(e)},接口:{method}")
        return None
    except json.JSONDecodeError:
        logging.error(f"响应解析失败:{response.text[:200]}...,接口:{method}")
        return None

def get_item_info(self, num_iids: str) -> Optional[List[Dict]]:
    """
    获取商品基础信息(含价格、佣金比例)
    :param num_iids: 商品数字ID列表(逗号分隔,如"123456,789012")
    :return: 商品信息列表
    """
    method = "taobao.tbk.item.info.get"
    params = {
        "num_iids": num_iids,
        "fields": "num_iid,title,pict_url,price,zk_final_price,provcity,"
                  "seller_id,volume,nick,commission_rate,commission"
    }
    response = self.call_api(method, params)
    if not response or "results" not in response:
        return None

    # 解析商品列表
    items = response["results"].get("n_tbk_item", [])
    return [
        {
            "num_iid": item.get("num_iid"),
            "title": item.get("title"),
            "pict_url": item.get("pict_url"),
            "price": float(item.get("price", 0)),  # 原价
            "final_price": float(item.get("zk_final_price", 0)),  # 优惠后价格
            "commission_rate": float(item.get("commission_rate", 0)) / 100,  # 佣金比例(%)
            "commission": float(item.get("commission", 0)),  # 佣金金额
            "sales": item.get("volume"),  # 销量
            "seller": item.get("nick")  # 卖家昵称
        } for item in items
    ]

def get_item_coupon(self, num_iid: str) -> Optional[Dict]:
    """
    获取商品优惠券信息
    :param num_iid: 商品数字ID
    :return: 优惠券信息(无则返回None)
    """
    method = "taobao.tbk.item.coupon.get"
    params = {"num_iid": num_iid}
    response = self.call_api(method, params)
    if not response or "coupons" not in response:
        return None

    coupons = response["coupons"].get("coupon", [])
    if not coupons:
        return None

    # 取第一个有效的优惠券
    coupon = coupons[0]
    return {
        "coupon_id": coupon.get("coupon_id"),
        "total_count": coupon.get("total_count"),  # 总数量
        "remain_count": coupon.get("remain_count"),  # 剩余数量
        "discount": float(coupon.get("discount", 0)),  # 优惠金额
        "min_fee": float(coupon.get("min_fee", 0)),  # 使用门槛
        "start_time": coupon.get("start_time"),
        "end_time": coupon.get("end_time"),
        "coupon_url": coupon.get("coupon_click_url")  # 领取链接
    }

def generate_promotion_link(self, num_iid: str, adzone_id: str) -> Optional[Dict]:
    """
    生成商品推广链接(含优惠券)
    :param num_iid: 商品数字ID
    :param adzone_id: 推广位ID(需提前创建)
    :return: 推广链接信息
    """
    method = "taobao.tbk.promotion.link.generate"
    params = {
        "material_id": num_iid,  # 商品ID
        "adzone_id": adzone_id,
        "material_type": "item"  # 类型为商品
    }
    response = self.call_api(method, params)
    if not response or "result_list" not in response:
        return None

    result = response["result_list"].get("map_data", [{}])[0]
    return {
        "click_url": result.get("click_url"),  # 推广链接
        "coupon_click_url": result.get("coupon_click_url"),  # 带优惠券的推广链接
        "short_url": result.get("short_url")  # 短链接
    }

def get_item_promotion_info(self, num_iid: str, adzone_id: str = "") -> Optional[Dict]:
    """
    获取商品完整推广信息(基础信息+优惠券+推广链接)
    :param num_iid: 商品数字ID
    :param adzone_id: 推广位ID(可选,用于生成推广链接)
    :return: 完整推广信息
    """
    # 1. 获取商品基础信息
    item_info = self.get_item_info(num_iid)
    if not item_info or len(item_info) == 0:
        return None
    item = item_info[0]

    # 2. 获取优惠券信息
    coupon = self.get_item_coupon(num_iid)

    # 3. 生成推广链接(如有推广位ID)
    promotion_link = None
    if adzone_id:
        promotion_link = self.generate_promotion_link(num_iid, adzone_id)

    # 4. 计算最终推广价(优惠后价格-优惠券,如有)
    final_promotion_price = item["final_price"]
    if coupon and final_promotion_price >= coupon["min_fee"]:
        final_promotion_price -= coupon["discount"]

    return {
        "item": item,
        "coupon": coupon,
        "promotion_link": promotion_link,
        "final_promotion_price": round(final_promotion_price, 2),  # 最终推广价
        "estimated_commission": round(final_promotion_price * item["commission_rate"], 2)  # 预估佣金
    }

示例调用

if name == "main":

# 替换为实际参数(从阿里妈妈开放平台获取)
APPKEY = "your_appkey"
APPSECRET = "your_appsecret"
SESSION = "your_session"  # 可选,部分接口需要
ADZONE_ID = "your_adzone_id"  # 推广位ID(需提前创建)

# 初始化客户端
alimama = AlimamaAPI(
    appkey=APPKEY,
    appsecret=APPSECRET,
    session=SESSION
)

# 示例商品ID(淘宝商品数字ID)
ITEM_ID = "6543217890"

# 获取商品完整推广信息
promotion_info = alimama.get_item_promotion_info(ITEM_ID, ADZONE_ID)

if promotion_info:
    item = promotion_info["item"]
    print(f"商品标题:{item['title']}")
    print(f"原价:{item['price']}元 | 优惠后价格:{item['final_price']}元")
    print(f"佣金比例:{item['commission_rate'] * 100}% | 预估佣金:{promotion_info['estimated_commission']}元")

    coupon = promotion_info["coupon"]
    if coupon:
        print(f"优惠券:满{coupon['min_fee']}元减{coupon['discount']}元(剩余{coupon['remain_count']}/{coupon['total_count']})")
        print(f"优惠券有效期:{coupon['start_time']} 至 {coupon['end_time']}")

    print(f"最终推广价:{promotion_info['final_promotion_price']}元")

    link = promotion_info["promotion_link"]
    if link:
        print(f"推广链接:{link['click_url']}")
        if link["coupon_click_url"]:
            print(f"带券推广链接:{link['coupon_click_url']}")

三、关键技术点解析

1. 核心接口解析

  • taobao.tbk.item.info.get:获取商品基础信息,包括原价(price)、优惠后价格(zk_final_price)、佣金比例(commission_rate)等,是计算推广收益的基础;
  • taobao.tbk.item.coupon.get:查询商品可用优惠券,返回优惠金额(discount)、使用门槛(min_fee)等,用于计算最终到手价;
  • taobao.tbk.promotion.link.generate:生成带推广位的商品链接,用于跟踪推广效果和佣金归属,需传入adzone_id(推广位 ID)。

    2. 价格与佣金计算逻辑

  • 最终推广价 = 优惠后价格(zk_final_price) - 优惠券金额(discount,需满足使用门槛min_fee);
  • 预估佣金 = 最终推广价 × 佣金比例(commission_rate,需转换为小数,如 15% → 0.15)。

    3. 推广位管理

    adzone_id(推广位 ID)是跟踪推广效果的关键,需通过接口创建,关联到具体渠道(site_id),创建后可在阿里妈妈后台查看推广数据。

    四、使用注意事项

  1. 权限申请
    • 需在注册开发者,创建应用并绑定淘宝联盟账号;
    • 部分高权限接口(如高佣商品查询)需通过平台审核,个人开发者需完成实名认证。
  2. 限流控制
    • 普通接口 QPS 限制为 10,超过会返回429 Too Many Requests
    • 建议添加请求间隔(如 1 秒 / 次),批量查询时使用多线程控制频率。
  3. 参数规范
    • num_iid(商品 ID)需从淘宝商品详情页 URL 提取;
    • 时间戳需与阿里妈妈服务器时间同步(误差≤10 分钟),否则签名验证失败。
  4. 合规性
    • 推广链接需明确标注 “广告” 或 “推广”,遵守《电子商务法》;
    • 禁止通过 API 获取数据用于不正当竞争或侵权用途。
      该实现基于官方 API,适用于电商导购平台、推广工具等场景,通过扩展可支持批量商品查询、订单跟踪等功能。实际使用需参考调整参数和接口逻辑。
相关文章
|
8天前
|
缓存 API 网络架构
淘宝item_search_similar - 搜索相似的商品API接口,用python返回数据
淘宝联盟开放平台中,可通过“物料优选接口”(taobao.tbk.dg.optimus.material)实现“搜索相似商品”功能。该接口支持根据商品 ID 获取相似推荐商品,并返回商品信息、价格、优惠等数据,适用于商品推荐、比价等场景。本文提供基于 Python 的实现示例,包含接口调用、数据解析及结果展示。使用时需配置淘宝联盟的 appkey、appsecret 和 adzone_id,并注意接口调用频率限制和使用规范。
|
8天前
|
JSON API 数据安全/隐私保护
深度分析淘宝卖家订单详情API接口,用json返回数据
淘宝卖家订单详情API(taobao.trade.fullinfo.get)是淘宝开放平台提供的重要接口,用于获取单个订单的完整信息,包括订单状态、买家信息、商品明细、支付与物流信息等,支撑订单管理、ERP对接及售后处理。需通过appkey、appsecret和session认证,并遵守调用频率与数据权限限制。本文详解其使用方法并附Python调用示例。
|
10天前
|
数据采集 JSON 监控
巧用快手电商 API,精准分析快手商品销售趋势
快手电商API助力商家精准分析销售趋势,通过实时数据获取、趋势识别与模型构建,优化营销策略,提升市场竞争力。
41 1
|
12天前
|
数据采集 存储 JSON
地区电影市场分析:用Python爬虫抓取猫眼/灯塔专业版各地区票房
地区电影市场分析:用Python爬虫抓取猫眼/灯塔专业版各地区票房
|
10天前
|
API Python
Python采集淘宝店铺所有商品API接口指南
淘宝没有公开的官方API供采集店铺商品数据,但可以通过以下几种方法获取商品信息。需要注意的是,淘宝有严格的反爬机制,直接采集可能违反其服务条款。
|
11天前
|
数据采集 数据可视化 API
驱动业务决策:基于Python的App用户行为分析与可视化方案
驱动业务决策:基于Python的App用户行为分析与可视化方案
|
11天前
|
API 数据安全/隐私保护 开发者
深度分析苏宁API接口,用Python脚本实现
深度分析苏宁API接口,用Python脚本实现
|
11天前
|
搜索推荐 数据挖掘 API
【干货满满】阿里妈妈API接口和淘宝联盟的接口有哪些区别
阿里妈妈API覆盖全链路营销,包含广告投放、数据分析及淘宝客推广,适用于品牌商家与营销工具;淘宝联盟API则专注淘宝客业务,提供商品查询、链接生成与佣金结算等功能,适合推广者使用。两者在功能、权限及应用场景上各有侧重。
|
13天前
|
监控 算法 API
电商API接口对接实录:淘宝优惠券接口对接处理促销监控系统
在电商开发中,淘宝详情页的“券后价计算”是极易出错的环节。本文作者结合实战经验,分享了因忽略满减券门槛、有效期、适用范围等导致的踩坑经历,并提供了完整的解决方案,包括淘宝API签名生成、券后价计算逻辑、常见坑点及优化建议,助力开发者精准实现券后价功能,避免业务损失。
|
10天前
|
JSON API 数据格式
淘宝/天猫图片搜索API接口,json返回数据。
淘宝/天猫平台虽未开放直接的图片搜索API,但可通过阿里妈妈淘宝联盟或天猫开放平台接口实现类似功能。本文提供基于淘宝联盟的图片关联商品搜索Curl示例及JSON响应说明,适用于已获权限的开发者。如需更高精度搜索,可选用阿里云视觉智能API。

热门文章

最新文章

推荐镜像

更多