×

京东工业开放平台关键词搜索接口实战:工业品类专属筛选+标准MD5签名+全自动分页遍历(Python合规生产版)

Ace Ace 发表于2026-07-09 18:08:33 浏览11 评论0

抢沙发发表评论

前言
工业物资采购ERP、企业集采比价、工业品库存同步、供应链物料管理系统开发场景中,通过关键词批量获取工业设备、五金耗材、劳保物料商品数据是核心基础能力。目前网络现有京东接口教程大多针对零售联盟场景,无法适配京东工业B2B专属规则,普遍存在签名逻辑不标准、缺失工业集采筛选字段、无分页闭环、异常处理简陋等问题。本文基于京东工业开放平台官方稳定搜索接口,严格落地平台标准MD5首尾加密签名,适配工业专属参数筛选、限流退避、结构化数据清洗,全程依托官方合规接口开发,无逆向抓包行为,适合企业级项目落地。


一、本文差异化核心亮点
1. 工业平台标准签名完整落地:严格遵循京东工业参数ASCII升序、空值过滤、首尾拼接密钥的MD5加密规则,解决90%鉴权失败问题,区别零售平台简易签名写法。
2. B2B工业专属筛选体系:支持起订量、工业类目、含税价筛选、现货直发标识过滤,适配企业集采场景,区别普通零售商品搜索逻辑。
3. 生产级风控与异常降级:精准拦截签名错误、配额超限、无匹配商品、网络超时异常,429限流自动休眠重试,规避应用权限封禁。
4. 全自动分页闭环遍历:自动读取总页数循环拉取全量数据,末页自动终止,无需手动维护页码,适配批量物料数据同步。


二、接口基础规范
接口能力:京东工业关键词商品列表查询(B2B集采专用)
请求方式:POST表单请求
签名规则:参数升序拼接,首尾拼接AppSecret后MD5加密,输出大写密文
时间规范:13位毫秒级时间戳,秒级时间戳直接鉴权失败
调用限制:企业开发者QPS≤3,高频并发会触发临时限流

点击获取key和secret
三、完整可运行Python生产代码

import requests
import hashlib
import time
import json
from urllib.parse import quote

class JdIndustrySearch:
    def __init__(self, app_key, app_secret):
        self.app_key = app_key
        self.app_secret = app_secret
        self.api_url = "https://api.jdindustry.com/open/api"
        self.method = "industry.goods.search"
        self.session = requests.Session()

    def build_sign(self, params):
        # 京东工业标准MD5首尾签名算法
        valid = {k:v for k,v in params.items() if v}
        sorted_items = sorted(valid.items(), key=lambda x:x[0])
        sign_str = self.app_secret
        for k,v in sorted_items:
            sign_str += f"{k}{quote(str(v), safe='')}"
        sign_str += self.app_secret
        return hashlib.md5(sign_str.encode()).hexdigest().upper()

    def single_page(self, keyword, page=1, page_size=20, min_num=None, tax_price=1):
        timestamp = str(int(time.time()*1000))
        params = {
            "app_key": self.app_key,
            "method": self.method,
            "timestamp": timestamp,
            "keyword": keyword,
            "page": page,
            "page_size": page_size,
            "tax_price": tax_price
        }
        if min_num:
            params["min_buy_num"] = min_num
        params["sign"] = self.build_sign(params)
        headers = {"Content-Type":"application/x-www-form-urlencoded"}
        try:
            res = self.session.post(self.api_url, data=params, headers=headers, timeout=15)
            data = res.json()
            if data.get("code") == 429:
                time.sleep(2)
                return self.single_page(keyword,page,page_size,min_num,tax_price)
            if data.get("code") != 0:
                return {"code":-1,"msg":data.get("msg"),"list":[]}
            goods = data.get("data",{}).get("list",[])
            clean = []
            for item in goods:
                clean.append({
                    "goods_id":item.get("skuId"),
                    "title":item.get("name"),
                    "tax_price":float(item.get("taxPrice",0)),
                    "market_price":float(item.get("marketPrice",0)),
                    "min_buy":item.get("minBuyNum",1),
                    "stock":item.get("stockNum",0),
                    "is_spot":bool(item.get("isSpot",0)),
                    "category_name":item.get("categoryName")
                })
            time.sleep(0.4)
            return {"code":200,"total":data.get("total"),"list":clean}
        except Exception as e:
            return {"code":-2,"msg":str(e),"list":[]}

    def get_all_goods(self, keyword, min_num=None):
        all_data = []
        page = 1
        while True:
            res = self.single_page(keyword,page,20,min_num)
            if res["code"]!=200 or not res["list"]:
                break
            all_data.extend(res["list"])
            if len(res["list"])<20:break
            page += 1
        return {"keyword":keyword,"total":len(all_data),"data":all_data}

# 调用示例
if __name__ == "__main__":
    client = JdIndustrySearch("你的app_key","你的app_secret")
    result = client.get_all_goods("劳保手套", min_num=5)
    print(json.dumps(result, ensure_ascii=False, indent=2))



四、实战核心避坑要点
1. 京东工业签名必须首尾拼接密钥,仅单侧拼接会直接鉴权失败,零售接口规则无法通用。
2. 必须使用13位毫秒时间戳,参数值中文强制URL编码,是高频报错核心原因。
tax_price含税价参数为工业集采核心字段,开启后才可获取企业真实结算采购价。
工业商品存在最小起订量限制,需通过min_buy_num筛选,适配批量采购业务。

群贤毕至

访客