0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

小红书商品详情签名算法Python

邓林 来源:jf_63013664 作者:jf_63013664 2025-08-25 16:10 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在电商开发的战场上摸爬滚打多年,每一次对接新平台的 API 都是一场硬仗。要说最让人印象深刻的,小红书商品详情 API 接口的对接经历绝对能排上前三。从申请权限时的层层关卡,到数据抓取时的各种 “幺蛾子”,今天就掰开了揉碎了,把这段实战经历和能用得上的代码技巧全分享出来!

刚开始接触小红书商品详情 API,天真地以为和其他平台差不多,按文档操作就能轻松拿到数据。现实却给我泼了一盆冷水 —— 小红书的开发者平台审核堪称 “魔鬼级别”,不仅要详细说明应用用途、使用场景,还得提供完整的业务规划。光是提交申请材料就反复修改了四五次,等了整整一周才收到通过通知。好不容易拿到了client_id和client_secret,签名算法又成了拦路虎。小红书采用的HMAC-SHA256加密方式,对参数顺序、编码格式要求极为严格,稍有差错就返回401 Unauthorized。那段时间对着文档和官方示例代码反复研究,终于啃出了签名生成函数:

python

运行

import hashlib
import hmac
import time
import urllib.parse


def generate_signature(params, client_secret):
    sorted_params = sorted(params.items(), key=lambda x: x[0])
    query_str = ""
    for k, v in sorted_params:
        if isinstance(v, list):
            v = ",".join(map(str, v))
        query_str += f"{k}{v}"
    sign_str = f"{client_secret}{query_str}{client_secret}"
    return hmac.new(
        client_secret.encode('utf-8'),
        sign_str.encode('utf-8'),
        hashlib.sha256
    ).hexdigest().upper()


# 使用示例
api_params = {
    "method": "xhs.product.detail.get",
    "client_id": "your_client_id",
    "product_id": "123456789",
    "timestamp": str(int(time.time()))
}
signed_params = generate_signature(api_params, "your_client_secret")
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

python返回结果

Result Object:
---------------------------------------
{
	"item": {
		"num_iid": "685d0fe3c16548001691655c",
		"title": "奶白釉面包猫卡通可爱陶瓷餐具碗碟家用一二人食碗盘饭盘子釉下彩 · 4.75寸新佩碗/奶白釉面包猫 无规格",
		"desc_short": "",
		"price": 11,
		"total_price": "",
		"suggestive_price": "",
		"orginal_price": 11,
		"nick": "喵植杂货铺的店",
		"num": 200,
		"min_num": 0,
		"detail_url": "https://www.xiaohongshu.com/goods-detail/685d0fe3c16548001691655c",
		"pic_url": "//mall-i4.xhscdn.com/material_space/f6fbc3bd-443b-4f75-8909-fb5484dd3573?imageView2/2/w/1080/format/webp/q/80",
		"brand": null,
		"brandId": "",
		"rootCatId": "",
		"cid": "",
		"desc": "

< img src="https://file1.elecfans.com//web3/M00/2B/7B/wKgZO2isG4WAMPzMAAEm5rCqx28321.jpg" >

< img src="https://file1.elecfans.com/web3/M00/2B/69/wKgZPGisGuaAPYbFAAACCUoruo8524.jpg" >

< img src="https://file1.elecfans.com//web3/M00/2B/7B/wKgZO2isG4WAKsBJAAEJtD_LhPA492.jpg" >

< img src="https://file1.elecfans.com//web3/M00/2B/7B/wKgZO2isG4WAEq4yAAEqphMFR0Q944.jpg" >

< img src="https://file1.elecfans.com//web3/M00/2B/7B/wKgZO2isG4WAZN9bAADD0K_mB48577.jpg" >

< img src="https://file1.elecfans.com/web3/M00/2B/7B/wKgZO2isGumAehmpAAFIujkshVM029.jpg" >

< img src="https://file1.elecfans.com/web3/M00/2B/69/wKgZPGisGuqAKQqbAACbKgy43JM420.jpg" >

< img src="https://file1.elecfans.com//web3/M00/2B/7B/wKgZO2isG4WAWdgEAADVfIZYMts530.jpg" >

< img src="https://file1.elecfans.com/web3/M00/2B/7B/wKgZO2isGuuALxojAAClLj4Tf1g651.jpg" >

< img src="https://file1.elecfans.com//web3/M00/2B/7B/wKgZO2isG4WAEgOlAAEa0DFkQl4588.jpg" >

< img src="https://file1.elecfans.com/web3/M00/2B/69/wKgZPGisGu6AXfL6AACdkVCaOuU203.jpg" >

< img src="https://file1.elecfans.com//web3/M00/2B/7B/wKgZO2isG4WAVIU6AADNCMR78Sc685.jpg" >

< img src="https://file1.elecfans.com/web3/M00/2B/69/wKgZPGisGu-APiIQAAEfXSap07E396.jpg" >

< img src="https://file1.elecfans.com//web3/M00/2B/7B/wKgZO2isG4WAMQ4qAACZ4hi2ARc880.jpg" >

< img src="https://file1.elecfans.com//web3/M00/2B/7B/wKgZO2isG4WARxjNAACkHCZWawE467.jpg" >

< img src="https://file1.elecfans.com/web3/M00/2B/7B/wKgZO2isGvKAZtJNAACpbgm7md0264.jpg" >

< img src="https://file1.elecfans.com/web3/M00/2B/7B/wKgZO2isGvKAOUCTAAE8zK31p84679.jpg" >

< img src="https://file1.elecfans.com/web3/M00/2B/69/wKgZPGisGvOAHp1fAACEGOjiWWg891.jpg" >

< img src="https://file1.elecfans.com/web3/M00/2B/7B/wKgZO2isGvSAIRjQAAC_Af5YwY4776.jpg" >

< img src="https://file1.elecfans.com/web3/M00/2B/69/wKgZPGisGvWARpd5AADPgSo_rHk381.jpg" >

< img src="https://file1.elecfans.com/web3/M00/2B/7B/wKgZO2isGvaAa8WPAACys93Q9ts329.jpg" >

< img src="https://file1.elecfans.com/web3/M00/2B/7B/wKgZO2isGvaAEiWaAACm4wmnEvM461.jpg" >

< img src="https://file1.elecfans.com/web3/M00/2B/69/wKgZPGisGvqAfptCAAACtxMMXYw160.png" style="display:none" / >", "desc_img": [ "https://file1.elecfans.com//web3/M00/2B/7B/wKgZO2isG4WAMPzMAAEm5rCqx28321.jpg", "https://file1.elecfans.com/web3/M00/2B/69/wKgZPGisGuaAPYbFAAACCUoruo8524.jpg", "https://file1.elecfans.com//web3/M00/2B/7B/wKgZO2isG4WAKsBJAAEJtD_LhPA492.jpg", "https://file1.elecfans.com//web3/M00/2B/7B/wKgZO2isG4WAEq4yAAEqphMFR0Q944.jpg", "https://file1.elecfans.com//web3/M00/2B/7B/wKgZO2isG4WAZN9bAADD0K_mB48577.jpg", "https://file1.elecfans.com/web3/M00/2B/7B/wKgZO2isGumAehmpAAFIujkshVM029.jpg", "https://file1.elecfans.com/web3/M00/2B/69/wKgZPGisGuqAKQqbAACbKgy43JM420.jpg", "https://file1.elecfans.com//web3/M00/2B/7B/wKgZO2isG4WAWdgEAADVfIZYMts530.jpg", "https://file1.elecfans.com/web3/M00/2B/7B/wKgZO2isGuuALxojAAClLj4Tf1g651.jpg", "https://file1.elecfans.com//web3/M00/2B/7B/wKgZO2isG4WAEgOlAAEa0DFkQl4588.jpg", "https://file1.elecfans.com/web3/M00/2B/69/wKgZPGisGu6AXfL6AACdkVCaOuU203.jpg", "https://file1.elecfans.com//web3/M00/2B/7B/wKgZO2isG4WAVIU6AADNCMR78Sc685.jpg", "https://file1.elecfans.com/web3/M00/2B/69/wKgZPGisGu-APiIQAAEfXSap07E396.jpg", "https://file1.elecfans.com//web3/M00/2B/7B/wKgZO2isG4WAMQ4qAACZ4hi2ARc880.jpg", "https://file1.elecfans.com//web3/M00/2B/7B/wKgZO2isG4WARxjNAACkHCZWawE467.jpg", "https://file1.elecfans.com/web3/M00/2B/7B/wKgZO2isGvKAZtJNAACpbgm7md0264.jpg", "https://file1.elecfans.com/web3/M00/2B/7B/wKgZO2isGvKAOUCTAAE8zK31p84679.jpg", "https://file1.elecfans.com/web3/M00/2B/69/wKgZPGisGvOAHp1fAACEGOjiWWg891.jpg", "https://file1.elecfans.com/web3/M00/2B/7B/wKgZO2isGvSAIRjQAAC_Af5YwY4776.jpg", "https://file1.elecfans.com/web3/M00/2B/69/wKgZPGisGvWARpd5AADPgSo_rHk381.jpg", "https://file1.elecfans.com/web3/M00/2B/7B/wKgZO2isGvaAa8WPAACys93Q9ts329.jpg", "https://file1.elecfans.com/web3/M00/2B/7B/wKgZO2isGvaAEiWaAACm4wmnEvM461.jpg" ], poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

解决了签名问题,新的挑战又接踵而至。小红书对 API 调用频率限制严格,而且不同接口的限流规则还不一样。为了避免触发封禁,我用 Python 的asyncio库结合队列实现了异步请求和限流控制。比如设置每秒最多发起 10 次请求,超出部分自动排队:

python

运行

import asyncio
import ​​​​​​​aiohttp


class RateLimiter:
    def __init__(self, rate_limit):
        self.semaphore = asyncio.Semaphore(rate_limit)

    async def limit(self):
        await self.semaphore.acquire()
        try:
            yield
        finally:
            self.semaphore.release()


async def fetch_product_detail(session, product_id, signed_params):
    async with RateLimiter(10).limit():
        url = "https://open.xiaohongshu.com/api/rest"
        params = {**signed_params, "product_id": product_id}
        async with session.get(url, params=params) as response:
            return await response.json()


async def main(product_ids, signed_params):
    async with aiohttp.ClientSession() as session:
        tasks = [fetch_product_detail(session, pid, signed_params) for pid in product_ids]
        results = await asyncio.gather(*tasks)
        return results


# 示例调用
product_ids = ["123456789", "987654321"]
signed_params = {...}  # 已签名参数
asyncio.run(main(product_ids, signed_params))

拿到数据后,才发现小红书商品详情的结构远比想象中复杂。商品信息、用户评价、关联笔记、促销活动等数据嵌套多层,光是解析 JSON 就要费不少功夫。而且小红书会不定期调整接口返回字段,有次突然发现原本正常的 “商品规格” 字段消失了,害得我紧急排查了半天。后来学聪明了,写了个通用的数据解析函数,还加了字段缺失的容错处理:

python

运行

def parse_product_data(raw_data):
    try:
        return {
            "product_name": raw_data.get("product_info", {}).get("name", ""),
            "price": raw_data.get("product_info", {}).get("price", 0),
            "sales_count": raw_data.get("product_info", {}).get("sales_count", 0),
            "user_rating": raw_data.get("evaluation_info", {}).get("score", 0),
            "main_image": raw_data.get("product_info", {}).get("main_image", "")
        }
    except KeyError as e:
        print(f"字段缺失: {e}")
        return {}


# 示例调用
raw_response = {...}  # API返回数据
parsed_data = parse_product_data(raw_response)
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

在开发一个小红书商品比价工具时,需要实时监控商品价格变动。最开始我采用轮询的方式定时调用 API,结果不仅浪费资源,还容易触发限流。后来改用​​​​​​​Webhook订阅的方式,当商品信息更新时,小红书主动推送通知,大大提高了效率。虽然接入 Webhook 的过程也不轻松,要处理签名验证、消息加密、重复消息过滤等问题,但最终实现的效果堪称丝滑。

python

运行

# 处理Webhook消息示例
import hmac
import hashlib
from flask import Flask, request, abort

app = Flask(__name__)
SECRET_KEY = "your_webhook_secret"


@app.route('/webhook', methods=['POST'])
def handle_webhook():
    signature = request.headers.get('X-Xhs-Signature')
    if not signature:
        abort(401)

    data = request.data
    local_signature = hmac.new(
        SECRET_KEY.encode('utf-8'),
        data,
        hashlib.sha256
    ).hexdigest()

    if signature != local_signature:
        abort(401)

    # 处理接收到的商品更新数据
    webhook_data = request.json
    # 业务逻辑处理...
    return "OK", 200


if __name__ == '__main__':
    app.run(debug=True)
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

这些年在小红书 API 开发上踩过的坑,都成了宝贵的经验财富。每一次攻克难题,都像是解锁了新技能。

​审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4762

    浏览量

    97249
  • API
    API
    +关注

    关注

    2

    文章

    2188

    浏览量

    66318
  • python
    +关注

    关注

    57

    文章

    4860

    浏览量

    89651
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    1688商品详情API完整指南

    一、摘要 1688商品详情API是阿里巴巴旗下B2B平台提供的重要数据接口,主要用于获取商品的详细信息。该接口支持获取商品ID、商品标题、
    的头像 发表于 11-25 10:18 221次阅读

    京东商品详情价格监控API完整教程

    一、摘要 京东商品详情API是京东开放平台提供的标准化接口,开发者可通过商品ID、SKU等参数获取商品的详细信息,包括价格、库存、评价、规格参数等核心数据。 二、接口概述 请求方式:P
    的头像 发表于 11-24 15:56 900次阅读

    京东商品详情 ID(即 SKU ID)获取商品详细信息参数

    ​ 利用京东商品详情 ID(即 SKU ID)获取商品详细信息,可通过京东开放平台官方 API 或非官方接口(逆向解析)实现。以下是两种方式的示例展示,包含代码实现与数据解析: 一、核心概念:京东
    的头像 发表于 11-11 10:47 355次阅读
    京东<b class='flag-5'>商品</b><b class='flag-5'>详情</b> ID(即 SKU ID)获取<b class='flag-5'>商品</b>详细信息参数

    亚马逊获取商品详情API接口指南

    ​  在电商开发中,获取商品详情是核心需求之一。亚马逊提供了一套强大的API接口,允许开发者高效提取商品信息,如标题、价格、描述和库存状态。本文将逐步介绍如何通过Amazon Product
    的头像 发表于 11-05 14:45 227次阅读
    亚马逊获取<b class='flag-5'>商品</b><b class='flag-5'>详情</b>API接口指南

    淘宝商品详情API接口技术解析与实战应用

    出发,系统解析淘宝商品详情API接口的调用机制、数据结构及典型应用场景,并附上基于Python的完整调用示例,助力开发者高效集成商品数据服务。 关键词 淘宝开放平台;
    的头像 发表于 11-04 09:50 143次阅读

    当当接口开发避坑指南:3 大痛点 + 签名模板,0 失败接入商品详情接口

    本文详解当当商品详情接口的接入难点与实战方案,涵盖认证签名、参数优先级、数据解析等核心问题,提供Python代码示例与缓存优化策略,助力开发者快速稳定调用接口,避开90%常见坑。
    的头像 发表于 10-23 13:31 115次阅读

    搜索商品ID获取商品详情接口

    ​  在电商平台或库存管理系统中,通过商品ID快速搜索并获取商品详情是一项核心功能。该接口允许用户或应用程序输入唯一的商品标识符(ID),返回结构化数据如名称、价格、库存等。本文将逐步
    的头像 发表于 10-20 15:46 412次阅读
    搜索<b class='flag-5'>商品</b>ID获取<b class='flag-5'>商品</b><b class='flag-5'>详情</b>接口

    淘宝商品详情接口(item_get)企业级全解析:参数配置、签名机制与 Python 代码实战

    本文详解淘宝开放平台taobao.item_get接口对接全流程,涵盖参数配置、MD5签名生成、Python企业级代码实现及高频问题排查,提供可落地的实战方案,助你高效稳定获取商品数据。
    的头像 发表于 09-26 09:13 491次阅读
    淘宝<b class='flag-5'>商品</b><b class='flag-5'>详情</b>接口(item_get)企业级全解析:参数配置、<b class='flag-5'>签名</b>机制与 <b class='flag-5'>Python</b> 代码实战

    爱回收商品详情接口全方位对接指南:从认证机制到数据提取最佳实践(附 Python 代码 + 成色数据处理)

    本文详解爱回收二手数码商品详情接口对接,涵盖认证、签名生成、成色映射、估价缓存等核心环节,提供可复用代码与避坑指南,解决签名失败、数据延迟等常见问题。
    的头像 发表于 09-25 10:33 558次阅读

    当当网商品详情接口全方位对接指南:从认证机制到数据提取最佳实践

    本文详解当当网商品详情接口的全流程技术对接方案,涵盖OAuth 2.0认证、签名生成、Python实战代码及企业级优化策略,助开发者高效构建比价系统、导购应用等,实现数据合规稳定获取。
    的头像 发表于 09-25 09:23 387次阅读

    VVIC 平台商品详情接口高效调用方案:从签名验证到数据解析全流程

    本文详解VVIC平台商品详情接口调用全流程,涵盖参数配置、签名生成、异常处理与数据解析,提供可复用的Python代码及避坑指南,助力开发者高效实现安全、稳定的数据对接。
    的头像 发表于 09-23 10:28 417次阅读

    淘宝商品详情 API 实战:5 大策略提升店铺转化率(附签名优化代码 + 避坑指南)

    ”“差评失控” 等转化率杀手。本文结合我对接 300 + 淘宝店铺的实战经验,拆解 API 如何落地到动态定价、库存预警等 5 大场景,代码做了签名优化和错误处理,新手也能直接复用,避开 90% 的调用坑。 一、淘宝商品详情 A
    的头像 发表于 09-15 10:53 749次阅读

    小红书:通过商品标签API自动生成内容标签,优化社区推荐算法

    ​  小红书作为领先的社交电商平台,用户生成内容(UGC)是其核心驱动力。随着商品数量和用户互动激增,传统推荐算法面临效率瓶颈。本文探讨小红书如何利用
    的头像 发表于 09-10 16:46 731次阅读
    <b class='flag-5'>小红</b>书:通过<b class='flag-5'>商品</b>标签API自动生成内容标签,优化社区推荐<b class='flag-5'>算法</b>

    借助小红书电商 API,小红书店铺商品搜索曝光率提升

    在竞争激烈的小红书电商生态中,商品搜索曝光率直接决定了店铺的流量与转化。通过合理运用 小红书开放平台提供的电商 API ,商家可系统性优化商品展示策略,实现曝光量级跃升。以下是关键实施
    的头像 发表于 08-28 15:41 508次阅读

    利用小红书电商 API 接口,实现小红书店铺商品推荐个性化

    ​ 在当今电商竞争激烈的环境下,个性化商品推荐已成为提升用户体验和转化率的关键策略。小红书(Xiaohongshu)作为领先的社交电商平台,提供了强大的电商 API 接口,允许开发者访问用户数
    的头像 发表于 08-27 15:31 743次阅读
    利用<b class='flag-5'>小红</b>书电商 API 接口,实现<b class='flag-5'>小红</b>书店铺<b class='flag-5'>商品</b>推荐个性化