×

干了 8 年电商开发,被京东评论 API 坑到凌晨三点的那些事

Ed Ed 发表于2025-09-03 17:52:35 浏览5 评论0

抢沙发发表评论

在电商开发圈摸爬滚打这些年,对接过的接口没有一百也有八十,但京东评论接口的 “反人类” 程度,至今想起都让我头皮发麻。本以为只是简单拉取用户评论,结果从权限申请到数据解析,每一步都藏着能让你熬夜改 bug 的坑。今天就把这些实战血泪史和能直接复用的代码掏出来,给做评论分析、商家工具的朋友避避雷。

一、初次对接:权限申请卡了我整整一周

第一次对接京东评论接口时,我天真地以为和商品接口一样,注册个开发者账号就能调用 —— 结果连续三天返回403 Forbidden。翻遍京东开放平台文档才发现:评论接口属于 “敏感权限” ,不仅要提供企业营业执照,还得说明具体用途(是商家自用还是第三方工具),甚至要提交 “商家授权证明”(如果是帮商家拉取评论)。

我前后补充了三次材料:第一次缺 “工具功能说明书”,第二次商家授权书没盖公章,第三次因为 “预期调用量写得太模糊” 被打回。等权限终于下来时,项目都快延期了。这里给大家提个醒:申请时一定要写清楚 “调用场景 + 数据用途 + 调用频率”,最好附一张功能原型图,能少走一半弯路。

python实例

    "items": {
        "totalpage": "100",
        "total_results": 500000,
        "page_size": 10,
        "page": "1",
        "item": [
            {
                "rate_id": "24222425553",
                "rate_content": "安踏运动鞋购物体验超预期!上脚轻盈软弹,通勤暴走整天都不累脚。网面透气设计春夏穿也不闷汗,防滑底雨天抓地稳稳的。经典黑色超百搭,",
                "rate_date": "2025-08-14 20:00:28",
                "pics": [
                    "http://img30.360buyimg.com/shaidan/s1080x1080_jfs/t1/310114/15/26746/3955385/689dcfdaF1fee9055/d8812f974efee8a0.jpg.dpg",
                    "http://img30.360buyimg.com/shaidan/s1080x1080_jfs/t1/328017/36/4547/3801940/689dcfdbFeed4dea1/7e2a94fe0e643f3d.jpg.dpg"
                ],
                "display_user_nick": "尧***_",
                "videos": [],
                "auction_sku": "-8黑(推荐)",
                "add_feedback": null,
                "add_feedback_images": []
            },
            {
                "rate_id": "24302369411",
                "rate_content": "1、安踏大品牌值得信耐,\n2、款式好看,用料充足,款式好看,\n3、穿着舒服,脚非常舒适,下次还会来买,点赞👍。",
                "rate_date": "2025-08-24 18:19:09",
                "pics": [
                    "http://img30.360buyimg.com/shaidan/s1080x1080_jfs/t1/340592/15/1082/186147/68aae719F6c2b048e/77cc3644f05fd514.jpg.dpg",
                    "http://img30.360buyimg.com/shaidan/s1080x1080_jfs/t1/287020/22/21938/180800/68aae71aFab07a1d5/3af4150f64f67485.jpg.dpg",
                    "http://img30.360buyimg.com/shaidan/s1080x1080_jfs/t1/327168/28/10238/149039/68aae71bF6f941460/02cb0546e27c74bf.jpg.dpg",
                    "http://img30.360buyimg.com/shaidan/s1080x1080_jfs/t1/336211/17/1060/189552/68aae71cF62289792/3c58fd2f262c0e7f.jpg.dpg"
                ],
                "display_user_nick": "jd_182701ecp",
                "videos": [],
                "auction_sku": "-8黑(推荐)",
                "add_feedback": null,
                "add_feedback_images": []
            },
            {
                "rate_id": "24288441525",
                "rate_content": "买了就直接穿上去旅游了!连续九天都穿着这双鞋子,不管是在草原,沙漠,大峡谷,骑行,爬山,都很轻松!而且很好打理,用湿巾擦擦就干净了!",
                "rate_date": "2025-08-22 15:44:46",
                "pics": [
                    "http://img30.360buyimg.com/shaidan/s1080x1080_jfs/t1/328003/36/9198/2537448/68a81fecFb4e97a28/25dbf5ff906f8457.jpg.dpg",
                    "http://img30.360buyimg.com/shaidan/s1080x1080_jfs/t1/327925/16/9382/85895/68a81fedFa67eb8df/7472457aa0e39e2d.jpg.dpg"
                ],
                "display_user_nick": "KEVINDUAN",
                "videos": [],
                "auction_sku": "-8黑(推荐)",
                "add_feedback": null,
                "add_feedback_images": []
            },
            {
                "rate_id": "24231413637",
                "rate_content": "外观颜值:非常喜欢  舒适度:很轻,穿起来脚没什么压力!  做工细节:整体还是能接受  尺码大小:刚刚好!  抓地效果:一般吧,  透气性:非常好,很喜欢这个透气性格!  这个价格非常满意,很喜欢安踏的设计版型鞋子",
                "rate_date": "2025-08-16 00:02:35",
                "pics": [
                    "http://img30.360buyimg.com/shaidan/s1080x1080_jfs/t1/324995/10/5162/32553/689f5a13Fa090026e/4f348d779e807d27.jpg.dpg",
                    "http://img30.360buyimg.com/shaidan/s1080x1080_jfs/t1/323514/14/5257/151870/689f5a18F27bfb6ef/4f49229fdf662fcb.jpg.dpg"
                ],
                "display_user_nick": "j***X",
                "videos": [],
                "auction_sku": "-8黑(推荐)",
                "add_feedback": null,
                "add_feedback_images": []

二、签名算法:漏了一个参数,调试到凌晨

解决了权限问题,新的坑又来了 —— 签名验证。京东评论接口的签名逻辑和商品接口看似一样,但多了个必传参数 “client_type” (值为 “pc” 或 “app”),如果签名时漏了这个参数,会直接返回10001签名错误,但错误信息里根本不提示 “参数缺失”。

我对着加密后的字符串比对了两小时,甚至怀疑是编码问题,最后在京东开发者论坛的一个沉帖里看到 “评论接口必须传 client_type” 的提醒。最终调试通过的签名函数,每个参数都标了注释:

python

运行

import hashlib
import time
import urllib.parse

def generate_jd_comment_sign(params, app_secret):
    """生成京东评论接口签名(含必填参数client_type)"""
    # 1. 强制添加client_type参数,否则签名失败
    params["client_type"] = "pc"
    # 2. 过滤空值,按参数名ASCII排序(京东要求严格排序)
    sorted_params = sorted([(k, v) for k, v in params.items() if v is not None], key=lambda x: x[0])
    # 3. 参数值URL编码(注意保留~!@#$&*等特殊字符)
    encoded_params = [(k, urllib.parse.quote(str(v), safe='~!@#$&*()_+=')) for k, v in sorted_params]
    # 4. 拼接成key=value&key=value格式
    query_str = "&".join([f"{k}={v}" for k, v in encoded_params])
    # 5. 首尾加app_secret,MD5加密后转大写
    sign_str = f"{app_secret}{query_str}{app_secret}"
    return hashlib.md5(sign_str.encode()).hexdigest().upper()

# 使用示例
params = {
    "method": "jd.union.open.comment.get",
    "app_key": "your_app_key",
    "sku_id": "123456789",  # 商品SKU
    "page": 1,
    "page_size": 20,
    "timestamp": str(int(time.time()))  # 秒级时间戳
}
params["sign"] = generate_jd_comment_sign(params, "your_app_secret")

三、数据解析:主评和追评分开藏,差点漏了一半数据

调用成功后,我以为终于能喘口气 —— 结果运营反馈 “评论数量不对,比京东详情页少了一半”。排查发现:京东评论接口把 “主评” 和 “追评” 分开返回,主评在comments字段,追评在after_comments字段,而且追评需要单独判断 “是否存在”,否则会报 KeyError。

更坑的是,图片评论的 URL 藏在images字段里,是个列表结构,而有些用户会上传 5 张以上图片,需要单独处理。我重写的数据解析函数,专门整合了主评、追评和图片:

python

运行

import requests

def parse_jd_comments(response_data):
    """解析京东评论数据,整合主评、追评和图片"""
    result = []
    # 1. 处理主评
    main_comments = response_data.get("result", {}).get("comments", [])
    for comment in main_comments:
        comment_info = {
            "comment_id": comment.get("id"),
            "user_nick": comment.get("nickname"),  # 脱敏昵称,如“张**”
            "score": int(comment.get("score", 0)),  # 1-5分
            "content": comment.get("content", ""),
            "create_time": comment.get("create_time"),
            "images": [img.get("url") for img in comment.get("images", [])],  # 图片URL列表
            "is_main": True  # 标记为主评
        }
        result.append(comment_info)

    # 2. 处理追评(部分评论没有追评,需判断)
    after_comments = response_data.get("result", {}).get("after_comments", [])
    for after in after_comments:
        after_info = {
            "comment_id": after.get("id"),
            "user_nick": after.get("nickname"),
            "score": int(after.get("score", 0)),
            "content": after.get("content", ""),
            "create_time": after.get("create_time"),
            "images": [img.get("url") for img in after.get("images", [])],
            "is_main": False  # 标记为追评
        }
        result.append(after_info)

    return result

# 调用示例
response = requests.post("https://api.jd.com/routerjson", data=params)
comments = parse_jd_comments(response.json())
print(f"共解析到{len(comments)}条评论(含追评)")

四、限流暴击:每分钟只能调用 10 次,批量采集直接封号

最让我崩溃的一次,是做批量商品评论采集时触发了限流。京东评论接口的限流比商品接口严得多:免费开发者每分钟最多 10 次请求,超过后不仅返回429,还会直接封禁接口 24 小时(商品接口只会临时限制)。

那天我一口气加了 50 个 SKU 的采集任务,结果不到 3 分钟就收到 “接口封禁通知”,导致项目停滞一天。痛定思痛后,我用 “滑动窗口算法” 写了个限流类,严格控制调用频率:

python

运行

import time
from collections import deque

class JDCommentLimiter:
    def __init__(self, max_calls=10, window_seconds=60):
        """京东评论接口限流:max_calls次/窗口秒数"""
        self.max_calls = max_calls
        self.window = window_seconds
        self.call_records = deque()  # 存储每次调用的时间戳

    def can_call(self):
        """判断是否可以发起请求"""
        now = time.time()
        # 移除窗口外的调用记录
        while self.call_records and now - self.call_records[0] > self.window:
            self.call_records.popleft()
        # 判断当前调用次数是否超过限制
        if len(self.call_records) < self.max_calls:
            self.call_records.append(now)
            return True
        return False

# 使用示例
limiter = JDCommentLimiter(max_calls=10, window_seconds=60)
sku_list = ["123456789", "987654321", "1122334455"]  # 待采集的SKU

for sku in sku_list:
    while not limiter.can_call():
        # 未达到调用条件,等待1秒重试
        time.sleep(1)
    # 发起评论请求(此处省略具体调用代码)
    print(f"正在采集SKU {sku} 的评论...")

五、避坑总结:京东评论接口的 5 个 “隐形规则”

  1. 权限申请要 “具体” :用途写 “商家评论分析” 不如写 “为 XX 品牌商家提供评论情感分析、差评关键词提取功能”,通过率翻倍。

  2. 签名必传 “client_type” :无论是 pc 端还是 app 端调用,都要加这个参数,否则签名必错。

  3. 追评需单独解析:不要只取comments字段,一定要处理after_comments,否则会漏数据。

  4. 限流要 “严格遵守” :免费开发者别抱侥幸心理,超过 10 次 / 分钟必封号,建议用限流类控制节奏。

  5. 时间戳是 “秒级” :京东评论接口的timestamp是秒级(10 位),而部分接口是毫秒级(13 位),别搞混。

这些年和京东评论接口打交道,最大的感悟是:它的坑大多不在文档里,而在 “实战细节” 里 —— 比如权限申请的隐性要求、签名的额外参数、追评的特殊结构。


群贤毕至

访客