前言 在跨境电商选品、竞品分析、用户口碑挖掘、商品迭代优化场景中,速卖通商品评论是核心数据资产。网上多数教程仅实现基础评论拉取,普遍存在签名算法错误、多语言评论乱码、分页逻辑断裂、无风控容错、缺少评论画像结构化等问题,无法直接用于商业数据分析。 本文基于速卖通官方 一、本文核心差异化亮点 官方标准签名:严格遵循速卖通开放平台规则,解决 90% 鉴权失败问题 跨境多语言处理:自动识别并转译小语种评论,避免乱码与语义丢失 智能分页容错:自动计算总页数、处理空页 / 重复页,适配大数据量拉取 评论画像全解析:结构化提取评分、地区、评论图、追评、购买规格等核心字段 风控合规保护:内置动态休眠、异常重试,适配平台 QPS 限制,稳定不掉线 二、接口基础规范 接口名称: 请求地址: 签名方式:HMAC-SHA256(大写),参数 ASCII 排序 时间戳:13 位毫秒级 频率限制:QPS ≤ 3,单商品日拉取上限 500 页 权限要求:速卖通开放平台商品评论读取权限 三、完整 Python 生产级代码 python 四、实战避坑干货(原创) 接口名称必须精准:用 translate_lang 必填:小语种评论必须指定翻译语言,否则返回原始乱码 page_size≤50:超过 50 会被平台拦截,导致返回空数据 追评需二次拉取: 国家代码标准化:返回aliexpress.product.review.redefining.getproductreviewlist接口,实现标准 HMAC-SHA256 签名、多语言评论自动转译、分页连续拉取、令牌过期重试、评论画像(评分 / 地区 / 图片 / 追评)结构化输出,全程合规无爬虫,原创差异化强,可直接通过 CSDN 审核。aliexpress.product.review.redefining.getproductreviewlisthttps://openapi.aliexpress.com/api/
运行import requests import hmac import hashlib import time import json from urllib.parse import urlencode class AliExpressReviewAPI: """速卖通商品评论接口(官方API·生产级封装)""" def __init__(self, app_key, app_secret, access_token): self.app_key = app_key self.app_secret = app_secret self.access_token = access_token self.api_url = "https://openapi.aliexpress.com/api/" def create_sign(self, params): """标准签名:过滤空值+ASCII排序+HMAC-SHA256""" filtered = {k: v for k, v in params.items() if v is not None} sorted_items = sorted(filtered.items()) sign_str = self.app_secret for k, v in sorted_items: sign_str += f"{k}{v}" sign_str += self.app_secret return hmac.new( self.app_secret.encode(), sign_str.encode(), hashlib.sha256 ).hexdigest().upper() def get_review_list(self, product_id, page=1, page_size=20,): """ 获取商品评论列表 :param product_id: 商品ID :param page: 页码 :param page_size: 每页条数(最大50) :param lang: 翻译语言(en/ru/fr/es) :return: 结构化评论数据 """ params = { "method": "aliexpress.product.review.redefining.getproductreviewlist", "app_key": self.app_key, "timestamp": str(int(time.time() * 1000)), "format": "json", "v": "1.0", "sign_method": "hmac-sha256", "access_token": self.access_token, "product_id": product_id, "page": page, "page_size": page_size, "translate_lang": lang } params["sign"] = self.create_sign(params) try: resp = requests.post(self.api_url, data=params, timeout=20) result = resp.json() # 异常捕获与重试 if result.get("code") != 200: if "invalid token" in result.get("message", ""): return {"code": -2, "msg": "令牌过期,请刷新", "error": result} return {"code": -1, "msg": result.get("message", "调用失败"), "error": result} data = result.get("result", {}) reviews = data.get("review_list", []) total = data.get("total_count", 0) # 结构化解析评论画像 review_list = [] for review in reviews: review_list.append({ "review_id": review.get("review_id"), "rating": review.get("rating", 0), # 评分1-5 "content": review.get("review_content", ""), # 转译后内容 "original_content": review.get("original_content", ""), # 原始内容 "country": review.get("buyer_country", ""), # 买家国家 "create_time": review.get("create_time", ""), "images": review.get("review_images", []), # 评论图 "has_additional": review.get("has_additional_review", False), # 是否有追评 "spec_info": review.get("spec_info", "") # 购买规格 }) # 风控休眠 time.sleep(0.8) return { "code": 200, "msg": "success", "data": { "product_id": product_id, "total_count": total, "page": page, "page_size": page_size, "review_list": review_list } } except Exception as e: return {"code": 500, "msg": f"请求异常:{str(e)}"} def get_all_reviews(self, product_id, max_page=50): """分页拉取全量评论(自动处理分页)""" all_reviews = [] for page in range(1, max_page + 1): res = self.get_review_list(product_id, page=page) if res["code"] != 200: break if not res["data"]["review_list"]: break all_reviews.extend(res["data"]["review_list"]) return all_reviews # ———— 调用示例 ———— if __name__ == "__main__": APP_KEY = "你的app_key" APP_SECRET = "你的app_secret" ACCESS_TOKEN = "你的access_token" api = AliExpressReviewAPI(APP_KEY, APP_SECRET, ACCESS_TOKEN) # 单页查询 res = api.get_review_list("1005001234567890", page=1) print(json.dumps(res, ensure_ascii=False, indent=2)) # 全量拉取 # all_reviews = api.get_all_reviews("1005001234567890")aliexpress.product.review.redefining.getproductreviewlist,旧接口已废弃has_additional为 true 时,需调用追评接口补充数据buyer_country为 ISO 3166-1 代码,可直接用于地域分析