×

快手 item_search - 根据关键词获取商品列表接口对接全攻略:从入门到精通

万邦科技Lex 万邦科技Lex 发表于2025-12-15 09:42:56 浏览24 评论0

抢沙发发表评论

                     注册账号免费测试快手API数据接口

快手电商作为主流的内容电商平台,item_search 接口是通过关键词批量获取快手商品列表的核心工具,支持按关键词、价格区间、销量、佣金比例、店铺类型等多维度筛选,返回商品标题、价格、佣金、销量、店铺信息等关键数据。该接口广泛应用于快手小店选品、电商数据分析、分销推广系统搭建等场景。

本攻略从接口认知、前置准备、分步骤对接、调试优化到合规上线,提供结构化的全流程指导,兼顾入门易用性与生产级稳定性,帮助开发者高效完成对接。

一、接口核心认知:功能与适配场景

1. 接口定位与核心价值

  • 核心功能:输入搜索关键词(支持多关键词组合),筛选快手电商平台的商品列表,支持价格区间、销量排序、佣金比例筛选、店铺类型(旗舰店 / 专卖店 / 普通店)过滤等,返回分页商品数据,可联动 item_get 接口获取商品详情(如规格参数、售后政策)。

  • 快手平台特性

    • 数据覆盖:收录快手小店、快手好物联盟的公开商品,新商品收录延迟 10-30 分钟;

    • 筛选能力:支持精确 / 模糊匹配、价格区间(price_min/price_max)、销量 / 佣金 / 价格排序、佣金比例区间(commission_rate_min/commission_rate_max)、店铺资质筛选;

    • 分销属性:部分商品返回佣金比例、推广链接、达人带货数据,适配分销推广场景;

    • 权限要求:需通过快手开放平台或合规第三方服务商获取接口权限,个人开发者需实名认证,企业开发者需完成资质认证。

  • 典型应用场景

    1. 选品工具开发:为快手达人 / 商家提供关键词选品功能,筛选高销量、高佣金商品;

    2. 电商数据分析:按行业关键词(如 “家居好物”“美妆护肤”)采集商品数据,分析品类趋势、价格带分布;

    3. 分销推广系统:获取商品推广链接和佣金信息,搭建快手分销平台,自动同步商品动态;

    4. 竞品监测:输入竞品关键词,分析竞品商品的定价、销量、佣金策略。

2. 核心参数与返回字段

(1)请求参数(必填 + 可选,按优先级排序)

参数名称类型是否必填说明应用示例
app_keystring接口调用密钥,由快手开放平台 / 服务商分配2025xxxxxxxxx
app_secretstring签名密钥,用于请求合法性校验(不可泄露)5a6fxxxxxxxxx
keywordstring搜索关键词,支持多关键词空格分隔(AND 逻辑)家居清洁 神器
price_minfloat商品最低价格(单位:元),默认无下限9.9
price_maxfloat商品最高价格(单位:元),默认无上限99.9
sortstring排序方式,默认 relevance(相关度)sales(销量倒序)、price_asc(价格升序)、commission_rate_desc(佣金比例倒序)
commission_rate_minint最低佣金比例(单位:%),仅好物联盟商品生效10(筛选佣金≥10% 的商品)
commission_rate_maxint最高佣金比例(单位:%)50
shop_typestring店铺类型筛选,默认 allflagship(旗舰店)、specialty(专卖店)、ordinary(普通店)
page_noint页码,默认 1,最大支持 100 页15
page_sizeint每页商品数,默认 20,最大 502050
timestamplong请求时间戳(毫秒级,有效期 5 分钟)1735689600000
signstring签名值(按快手规则生成,核心校验项)32 位 MD5 大写串
注意事项
  1. 价格区间:price_min 和 price_max 可单独设置(仅限制下限 / 上限),也可同时设置(区间筛选);

  2. 佣金筛选:仅对加入快手好物联盟的商品生效,普通小店商品无佣金字段;

  3. 排序优先级:sort 设为 sales 时,优先展示近 30 天销量高的商品。

(2)返回核心字段(按业务场景分类)

字段分类核心字段说明
商品基础信息item_id快手商品唯一标识(用于调用 item_get 接口)

title商品标题(含营销关键词,如 “买一送一”)

cover_url商品主图 URL(高清)

price商品售价(元,到手价)

original_price商品原价(元,对比价)

sales近 30 天销量

sku_count商品规格数量(如颜色、尺寸选项数)
分销相关字段commission_rate佣金比例(%),仅好物联盟商品有值

commission单件佣金(元,price * commission_rate / 100

promotion_link商品推广链接(分销专用)
店铺信息shop_id店铺 ID

shop_name店铺名称

shop_type店铺类型(旗舰店 / 专卖店 / 普通店)

shop_score店铺评分(满分 5 分)
其他字段create_time商品上架时间

status商品状态(on_sale 在售 /off_sale 下架)

location商品发货地

3. 接口限制与注意事项

  • 调用频率限制

    账号类型调用频率适用场景
    个人开发者10 次 / 分钟小型选品工具、个人数据分析
    企业开发者50 次 / 分钟分销平台、电商数据分析系统
  • 数据缓存规则:搜索结果缓存 30 分钟,热门关键词缓存缩短至 10 分钟,企业用户可申请 refresh=1 强制刷新(需额外权限);

  • 内容限制:已下架商品、违规商品、未公开商品不会返回;部分商品因隐私设置,不返回店铺信息。

二、对接前准备:3 步搞定前置条件

1. 获取接口权限(两种接入方式)

快手 item_search 接口无公开免费接入渠道,需通过官方开放平台合规第三方服务商获取权限,两种方式对比如下:
接入方式操作步骤优缺点
快手开放平台(官方)1. 登录 快手开放平台;2. 注册账号并完成认证(个人 / 企业);3. 创建应用,选择 “电商 API” 类目;4. 申请 item_search 接口权限,等待审核;5. 审核通过后,在应用详情页获取 app_key 和 app_secret优点:数据权威、字段完整、合规性高;缺点:审核严格(企业需提供营业执照)、周期长(3-5 个工作日)
第三方合规服务商1. 选择口碑较好的服务商(如聚合数据、APISpace);2. 注册账号并完成实名认证;3. 购买快手电商接口套餐;4. 在服务商后台获取 app_key 和 app_secret优点:接入快(10 分钟搞定)、无需复杂资质、提供调试工具;缺点:部分高级字段(如推广链接)需付费升级
合规提示:禁止使用非法爬虫接口,违反快手平台规则和《反不正当竞争法》,存在法律风险。

2. 技术环境准备

(1)支持语言与协议

  • 协议:HTTPS(强制,确保数据传输安全);

  • 开发语言:支持 Python、Java、PHP、Go 等所有主流语言,推荐 Python(数据处理高效,适配批量请求场景)。

(2)必备工具与依赖

工具类型推荐工具用途
调试工具Postman快速验证接口可用性,排除代码逻辑干扰

在线 MD5 工具校验签名生成正确性
开发依赖requests(Python)发送 HTTP 请求

hmac(Python)生成接口签名

pandas(Python)批量整理商品数据,导出 Excel
辅助工具Redis缓存搜索结果,减少重复请求

logging(Python)记录接口调用日志,便于问题排查

3. 业务需求梳理

  1. 关键词策略:明确核心关键词(如 “厨房好物”)和扩展关键词(如 “厨房收纳 神器”),避免过于宽泛导致结果冗余;

  2. 筛选条件定义

    • 选品场景:设置 sort=sales(销量优先)+ commission_rate_min=15(高佣金);

    • 低价商品采集:设置 price_max=19.9 + sort=price_asc(价格升序);

  3. 字段筛选:仅保留业务必需字段(如选品需 title/price/sales/commission_rate),减少数据传输量。

三、实操步骤:接口对接全流程(Python 示例)

步骤 1:理解签名生成规则(关键!快手官方规则)

快手接口签名采用 MD5 加密,核心逻辑是参数排序 + 拼接密钥 + MD5 加密,具体步骤如下:
  1. 剔除请求参数中的 sign 字段;

  2. 将剩余参数按 参数名 ASCII 升序排序;

  3. 拼接成 key1=value1&key2=value2&... 的字符串;

  4. 在字符串末尾拼接 &app_secret=你的app_secret

  5. 对拼接后的字符串进行 MD5 加密,生成 32 位大写字符串,即为 sign

签名示例

假设参数:app_key=2025xxxx&keyword=家居清洁&timestamp=1735689600000&app_secret=5a6fxxxx
  1. 排序后参数:app_keykeywordtimestamp

  2. 拼接字符串:app_key=2025xxxx&keyword=家居清洁×tamp=1735689600000&app_secret=5a6fxxxx

  3. MD5 加密后得到 signE8F2C4D6A1B397508421FEDCBA654321

步骤 2:完整代码实现(Python)

(1)依赖安装

bash
运行
pip install requests pandas

(2)核心代码(含签名生成、接口调用、数据保存)

import requests
import hashlib
import time
import json
import pandas as pd
from urllib.parse import urlencode
import logging

# 日志配置(记录接口调用日志,便于排查问题)
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s",
    handlers=[logging.FileHandler("kuaishou_item_search.log"), logging.StreamHandler()]
)

# 接口配置(替换为自己的 app_key、app_secret、API 地址)
CONFIG = {
    "app_key": "你的app_key",
    "app_secret": "你的app_secret",
    "api_url": "https://open.kuaishou.com/api/open/item_search",  # 官方/服务商接口地址
    "save_path": "快手商品列表.xlsx"
}

def generate_sign(params: dict, app_secret: str) -> str:
    """生成快手接口签名(MD5 32位大写)"""
    # 1. 剔除 sign 字段(如果存在)
    params.pop("sign", None)
    # 2. 按参数名 ASCII 升序排序
    sorted_params = sorted(params.items(), key=lambda x: x[0])
    # 3. 拼接参数字符串
    param_str = urlencode(sorted_params, encoding="utf-8") + f"&app_secret={app_secret}"
    # 4. MD5 加密并转大写
    md5 = hashlib.md5()
    md5.update(param_str.encode("utf-8"))
    return md5.hexdigest().upper()

def kuaishou_item_search(
    keyword: str,
    price_min: float = None,
    price_max: float = None,
    sort: str = "relevance",
    commission_rate_min: int = None,
    shop_type: str = "all",
    page_no: int = 1,
    page_size: int = 20
) -> dict:
    """
    调用快手 item_search 接口,获取商品列表
    :param keyword: 搜索关键词
    :param price_min: 最低价格
    :param price_max: 最高价格
    :param sort: 排序方式
    :param commission_rate_min: 最低佣金比例
    :param shop_type: 店铺类型
    :param page_no: 页码
    :param page_size: 每页条数
    :return: 标准化后的商品数据
    """
    # 1. 构建基础参数
    params = {
        "app_key": CONFIG["app_key"],
        "keyword": keyword,
        "sort": sort,
        "shop_type": shop_type,
        "page_no": page_no,
        "page_size": page_size,
        "timestamp": int(time.time() * 1000)
    }
    # 2. 补充可选参数
    if price_min is not None:
        params["price_min"] = price_min
    if price_max is not None:
        params["price_max"] = price_max
    if commission_rate_min is not None:
        params["commission_rate_min"] = commission_rate_min
    # 3. 生成签名
    params["sign"] = generate_sign(params, CONFIG["app_secret"])

    try:
        # 4. 发送 POST 请求(快手接口推荐 POST)
        response = requests.post(
            url=CONFIG["api_url"],
            data=json.dumps(params),
            headers={"Content-Type": "application/json"},
            timeout=15,
            verify=True
        )
        response.raise_for_status()  # 抛出 HTTP 错误(如 401/403)
        result = response.json()

        # 5. 解析响应结果(以快手官方返回格式为例)
        if result.get("code") == 0:
            raw_data = result.get("data", {})
            item_list = raw_data.get("item_list", [])
            total = raw_data.get("total", 0)  # 商品总数
            page_total = raw_data.get("page_total", 1)  # 总页码

            # 标准化商品数据
            standard_items = []
            for item in item_list:
                standard_items.append({
                    "关键词": keyword,
                    "商品ID": item.get("item_id", ""),
                    "商品标题": item.get("title", ""),
                    "主图链接": item.get("cover_url", ""),
                    "售价(元)": item.get("price", 0),
                    "原价(元)": item.get("original_price", 0),
                    "近30天销量": item.get("sales", 0),
                    "佣金比例(%)": item.get("commission_rate", 0),
                    "单件佣金(元)": round(item.get("price", 0) * item.get("commission_rate", 0) / 100, 2),
                    "店铺名称": item.get("shop_name", ""),
                    "店铺类型": item.get("shop_type", ""),
                    "店铺评分": item.get("shop_score", 0),
                    "商品状态": item.get("status", ""),
                    "发货地": item.get("location", ""),
                    "推广链接": item.get("promotion_link", ""),
                    "请求时间": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
                })

            return {
                "success": True,
                "data": standard_items,
                "total": total,
                "page_no": page_no,
                "page_total": page_total
            }
        else:
            error_msg = result.get("msg", "接口调用失败")
            logging.error(f"接口返回错误:{error_msg}(code={result.get('code')})")
            return {"success": False, "error_msg": error_msg}
    except requests.exceptions.RequestException as e:
        logging.error(f"网络请求异常:{str(e)}")
        return {"success": False, "error_msg": f"网络异常:{str(e)}"}
    except Exception as e:
        logging.error(f"数据解析异常:{str(e)}")
        return {"success": False, "error_msg": f"解析异常:{str(e)}"}

def batch_get_items(
    keyword: str,
    max_page: int = 5,
    **kwargs
) -> list:
    """批量获取多页商品列表(控制频率,避免超限)"""
    all_items = []
    page_no = 1
    while True:
        logging.info(f"正在获取关键词「{keyword}」第 {page_no} 页商品")
        result = kuaishou_item_search(keyword=keyword, page_no=page_no,** kwargs)
        if not result["success"]:
            logging.error(f"第 {page_no} 页获取失败:{result['error_msg']}")
            break
        page_items = result["data"]
        if not page_items:
            logging.info(f"第 {page_no} 页无商品,批量获取结束")
            break
        all_items.extend(page_items)
        logging.info(f"第 {page_no} 页获取成功,新增 {len(page_items)} 条商品(累计 {len(all_items)} 条)")
        # 终止条件:达到最大页码或总页码
        if page_no >= max_page or page_no >= result["page_total"]:
            break
        page_no += 1
        # 控制调用频率(个人用户间隔 6 秒,企业用户间隔 1 秒)
        time.sleep(6)
    return all_items

def save_to_excel(items: list, save_path: str = CONFIG["save_path"]):
    """将商品列表保存为 Excel 文件"""
    if not items:
        logging.warning("无商品数据可保存")
        return
    df = pd.DataFrame(items)
    # 去重(按商品ID)
    df = df.drop_duplicates(subset=["商品ID"])
    # 增量保存(避免覆盖历史数据)
    try:
        history_df = pd.read_excel(save_path, engine="openpyxl")
        df = pd.concat([history_df, df], ignore_index=True).drop_duplicates(subset=["商品ID"])
    except FileNotFoundError:
        pass
    df.to_excel(save_path, index=False, engine="openpyxl")
    logging.info(f"商品数据已保存至:{save_path}(共 {len(df)} 条)")

# 调用示例
if __name__ == "__main__":
    # 单页获取:搜索“家居清洁 神器”,筛选价格 9.9-99.9 元,销量优先
    single_page_result = kuaishou_item_search(
        keyword="家居清洁 神器",
        price_min=9.9,
        price_max=99.9,
        sort="sales",
        page_size=20
    )
    if single_page_result["success"]:
        print(f"单页获取 {len(single_page_result['data'])} 条商品")
        print("第一条商品信息:", single_page_result["data"][0])

    # 批量获取:获取前 5 页商品,保存到 Excel
    # batch_items = batch_get_items(
    #     keyword="家居清洁 神器",
    #     price_min=9.9,
    #     price_max=99.9,
    #     sort="sales",
    #     max_page=5
    # )
    # save_to_excel(batch_items)

四、调试与问题排查:快速定位异常

1. 优先用 Postman 调试(排除代码干扰)

  1. 构造请求:新建 POST 请求,填写接口 URL,请求头设置 Content-Type: application/json

  2. 填写参数:在请求体中输入 app_keykeywordtimestamp 等必填项,补充筛选参数;

  3. 生成签名:用在线 MD5 工具手动计算 sign,填入参数;

  4. 发送请求:查看响应结果,验证接口是否正常。

2. 高频问题排查表

问题现象常见原因解决方案
签名错误(401)1. 参数排序错误;2. app_secret 不匹配;3. 时间戳过期;4. 中文关键词未 URL 编码1. 按 ASCII 升序排序参数;2. 核对 app_secret 是否与开放平台一致;3. 校准本地时间(误差≤5 分钟);4. 确保代码中使用 urlencode 处理中文
权限不足(403)1. 未申请 item_search 接口权限;2. 账号类型不匹配(如个人账号使用企业字段);3. 调用频率超限1. 在开放平台确认接口已开通;2. 升级账号类型或移除企业专属参数;3. 降低调用频率,增加请求间隔
参数错误(400)1. sort 取值非法(如填 sale 而非 sales);2. 价格 / 佣金比例为非数字;3. page_size 超过 501. 核对 sort 取值(参考参数表);2. 确保价格、佣金为数字类型;3. page_size 设为 ≤50
无商品返回1. 关键词过于精准 / 无匹配商品;2. 筛选条件过于严格;3. 商品未被接口收录1. 放宽关键词(如 “清洁神器” 改为 “家居清洁”);2. 降低价格下限、提高佣金上限;3. 在快手小店搜索关键词,确认是否有商品
字段缺失(如无佣金)1. 商品未加入好物联盟;2. 账号无分销权限1. 仅筛选 commission_rate_min 时,确保商品是好物联盟商品;2. 申请快手好物联盟推广权限

五、进阶优化:生产级稳定性提升

1. 性能优化

  • 异步并发请求:批量获取多关键词 / 多页码时,使用 aiohttp 异步请求,控制并发数≤5(避免频率超限);

  • 缓存策略:用 Redis 缓存关键词 + 筛选条件的组合结果,缓存有效期 30 分钟,减少重复请求;

  • 分页智能停止:获取第 1 页后,根据 page_total 计算总页码,仅请求有效页码,避免无效请求。

2. 数据质量优化

  • 商品去重:按 item_id 去重,避免同一商品多次入库;

  • 异常值过滤:过滤价格为 0、销量为负的异常商品;

  • 字段标准化:统一价格、佣金的小数位数(如保留 2 位小数)。

3. 合规与安全

  • 密钥管理:生产环境中,将 app_key 和 app_secret 存储在环境变量或配置中心(如 Nacos),禁止硬编码;

  • 数据合规:获取的商品数据仅用于合规业务,禁止商业化售卖;分销需遵守快手好物联盟规则;

  • 日志审计:详细记录每次接口调用的参数、响应、错误信息,便于合规审计和问题追溯。

六、扩展场景:接口联动与功能升级

  1. 联动 item_get 接口:通过 item_search 获取 item_id 后,调用 item_get 获取商品规格、详情页、售后政策等信息;

  2. 选品评分模型:结合 销量佣金比例店铺评分 构建选品评分公式,自动筛选优质商品;

  3. 实时监控:使用 APScheduler 定时调用接口,监控关键词商品的价格、销量变化,触发调价 / 选品告警。


群贤毕至

访客