<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>万邦api博客</title><link>https://www.apiproxylog.com/</link><description>Good Luck To You!</description><item><title>唯品会 VOP 联盟关键词商品搜索接口实战：HMAC-MD5 标准签名 + 特卖多维度筛选 + 自动分页（Python 合规生产版）</title><link>https://www.apiproxylog.com/?id=180</link><description>&lt;p&gt;&lt;span id=&quot;content&quot;&gt;&lt;p data-first-child=&quot;&quot; data-pid=&quot;OkQAqKUr&quot;&gt;前言&lt;/p&gt;&lt;p data-pid=&quot;9pVry5-B&quot;&gt;CPS
 导购分销、特卖货源 ERP、品牌价格监控业务中，唯品会关键词搜索是货源拉取核心入口。网上现有教程普遍存在多处短板：混淆 VOP 
开放平台与第三方中转接口、签名逻辑缺失空值过滤、缺少特卖专属折扣 / 佣金筛选、无全量分页闭环、未区分限流 / 签名失效 / 
无商品多级异常，且多数仅实现极简单页调用，无法适配企业批量同步场景。本文基于唯品会官方联盟稳定接口&lt;code&gt;UnionGoodsV2Service.query&lt;/code&gt;，封装&lt;strong&gt;标准 HMAC-MD5 签名、关键词长度参数校验、折扣 / 佣金多维度筛选、自动分页遍历、429 限流指数退避、特卖商品结构化清洗&lt;/strong&gt;，全程仅使用官方合规 API，无爬虫逆向。&lt;/p&gt;&lt;p data-pid=&quot;3gome-X8&quot;&gt;一、本文差异化核心亮点&lt;/p&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;原生 VOP 联盟标准签名完整实现&lt;/strong&gt;：严格遵循官方 HMAC-MD5 加密规则，过滤空参数、毫秒时间戳校验，解决 90% 签名 401 报错，区别网上简易拼接写法。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;唯品会特卖专属筛选体系&lt;/strong&gt;：内置佣金比例、折扣力度、价格区间、虚拟商品过滤，贴合 CPS 分销业务，普通电商教程无该维度参数。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;入参前置合法性校验&lt;/strong&gt;：关键词长度、分页条数、页码范围拦截非法入参，提前规避无效请求消耗接口配额。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;全自动分页闭环&lt;/strong&gt;：读取总商品数循环遍历所有页面，空页自动终止，无需外部手动维护页码循环。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;分级风控保护&lt;/strong&gt;：捕获 429 超限、签名错误、无匹配商品、服务器异常四类错误，自动延长休眠规避应用限流封禁。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p data-pid=&quot;_FIv5F3F&quot;&gt;二、接口基础规范&lt;/p&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;接口服务名：&lt;code&gt;UnionGoodsV2Service.query&lt;/code&gt;（联盟关键词搜索 V2 稳定版）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;请求网关：&lt;code&gt;https://api.vip.com/router&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;请求方式：POST 表单提交参数&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;签名规则：所有参数 ASCII 升序、过滤空值，HMAC-MD5 加密输出大写哈希&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;公共必填参数：appKey、service、method、timestamp（13 位毫秒）、version、sign、format&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;调用限制：普通 ISV QPS≤2，单页 pageSize 上限 50，超限锁定应用 1 小时&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;权限要求：唯品会 VOP 开放平台企业认证，开通联盟商品搜索权限&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;figure data-size=&quot;normal&quot;&gt;&lt;div class=&quot;RichText-ConditionalImagePortal&quot;&gt;&lt;img src=&quot;https://pic3.zhimg.com/80/v2-5ed7d1d85ff6435f73ed5865347b8df6_720w.webp&quot; data-caption=&quot;&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1169&quot; data-rawheight=&quot;718&quot; data-original-token=&quot;v2-b9023026869c7d7fa64333720b8db205&quot; class=&quot;origin_image zh-lightbox-thumb lazy&quot; width=&quot;1169&quot; data-original=&quot;https://pic3.zhimg.com/v2-5ed7d1d85ff6435f73ed5865347b8df6_r.jpg&quot; data-actualsrc=&quot;https://pic3.zhimg.com/v2-5ed7d1d85ff6435f73ed5865347b8df6_1440w.jpg&quot; height=&quot;718&quot; data-lazy-status=&quot;ok&quot;/&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p data-pid=&quot;hsIM-niU&quot;&gt;&lt;a href=&quot;https://o0b.cn/iiiace&quot; target=&quot;_blank&quot;&gt;点击获取key和secret&lt;/a&gt;&lt;/p&gt;&lt;p data-pid=&quot;R0x5cIAd&quot;&gt;三、完整可运行 Python 生产代码&lt;/p&gt;&lt;p data-pid=&quot;Ph0NUI_D&quot;&gt;python&lt;br/&gt;&lt;br/&gt;运行&lt;br/&gt;&lt;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;import&amp;nbsp;requests
import&amp;nbsp;hmac
import&amp;nbsp;hashlib
import&amp;nbsp;time
import&amp;nbsp;json
from&amp;nbsp;typing&amp;nbsp;import&amp;nbsp;Dict,&amp;nbsp;Optional

class&amp;nbsp;VipUnionSearchClient:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;app_key:&amp;nbsp;str,&amp;nbsp;app_secret:&amp;nbsp;str):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_key&amp;nbsp;=&amp;nbsp;app_key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_secret&amp;nbsp;=&amp;nbsp;app_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.gateway&amp;nbsp;=&amp;nbsp;&amp;quot;https://api.vip.com/router&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.session&amp;nbsp;=&amp;nbsp;requests.Session()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.service&amp;nbsp;=&amp;nbsp;&amp;quot;com.vip.adp.api.open.service.UnionGoodsV2Service&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.method&amp;nbsp;=&amp;nbsp;&amp;quot;query&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.version&amp;nbsp;=&amp;nbsp;&amp;quot;2.0.0&amp;quot;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;generate_sign(self,&amp;nbsp;params:&amp;nbsp;Dict)&amp;nbsp;-&amp;gt;&amp;nbsp;str:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;唯品会官方HMAC-MD5标准签名生成&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;过滤空参数，避免签名串错乱
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;valid_params&amp;nbsp;=&amp;nbsp;{k:&amp;nbsp;v&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;params.items()&amp;nbsp;if&amp;nbsp;v&amp;nbsp;is&amp;nbsp;not&amp;nbsp;None&amp;nbsp;and&amp;nbsp;str(v).strip()&amp;nbsp;!=&amp;nbsp;&amp;quot;&amp;quot;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sorted_kv&amp;nbsp;=&amp;nbsp;sorted(valid_params.items(),&amp;nbsp;key=lambda&amp;nbsp;x:&amp;nbsp;x[0])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_raw&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;sorted_kv:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_raw&amp;nbsp;+=&amp;nbsp;f&amp;quot;{k}{v}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;HMAC-MD5加密，输出大写
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_obj&amp;nbsp;=&amp;nbsp;hmac.new(self.app_secret.encode(&amp;quot;utf-8&amp;quot;),&amp;nbsp;sign_raw.encode(&amp;quot;utf-8&amp;quot;),&amp;nbsp;hashlib.md5)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;sign_obj.hexdigest().upper()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;single_page_query(self,&amp;nbsp;keyword:&amp;nbsp;str,&amp;nbsp;page:&amp;nbsp;int&amp;nbsp;=&amp;nbsp;1,&amp;nbsp;page_size:&amp;nbsp;int&amp;nbsp;=&amp;nbsp;30,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;min_commission:&amp;nbsp;Optional[int]&amp;nbsp;=&amp;nbsp;None,&amp;nbsp;min_discount:&amp;nbsp;Optional[int]&amp;nbsp;=&amp;nbsp;None,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;min_price:&amp;nbsp;Optional[int]&amp;nbsp;=&amp;nbsp;None,&amp;nbsp;max_price:&amp;nbsp;Optional[int]&amp;nbsp;=&amp;nbsp;None,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;virtual_filter:&amp;nbsp;int&amp;nbsp;=&amp;nbsp;0,&amp;nbsp;sort_field:&amp;nbsp;str&amp;nbsp;=&amp;nbsp;&amp;quot;SALES&amp;quot;,&amp;nbsp;sort_order:&amp;nbsp;int&amp;nbsp;=&amp;nbsp;1)&amp;nbsp;-&amp;gt;&amp;nbsp;Dict:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;单页关键词搜索，支持分销多维度筛选&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;前置参数合法性校验（原创优化点）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;(2&amp;nbsp;&amp;lt;=&amp;nbsp;len(keyword)&amp;nbsp;&amp;lt;=&amp;nbsp;50):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;-1,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;&amp;quot;关键词长度需2-50字符&amp;quot;,&amp;nbsp;&amp;quot;list&amp;quot;:&amp;nbsp;[]}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;page&amp;nbsp;&amp;lt;&amp;nbsp;1&amp;nbsp;or&amp;nbsp;not&amp;nbsp;(10&amp;nbsp;&amp;lt;=&amp;nbsp;page_size&amp;nbsp;&amp;lt;=&amp;nbsp;50):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;-1,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;&amp;quot;页码≥1，每页条数10-50&amp;quot;,&amp;nbsp;&amp;quot;list&amp;quot;:&amp;nbsp;[]}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;timestamp&amp;nbsp;=&amp;nbsp;str(int(time.time()&amp;nbsp;*&amp;nbsp;1000))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;系统公共参数
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_params&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;appKey&amp;quot;:&amp;nbsp;self.app_key,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;service&amp;quot;:&amp;nbsp;self.service,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;method&amp;quot;:&amp;nbsp;self.method,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;version&amp;quot;:&amp;nbsp;self.version,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;timestamp&amp;quot;:&amp;nbsp;timestamp,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;format&amp;quot;:&amp;nbsp;&amp;quot;json&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;keyword&amp;quot;:&amp;nbsp;keyword,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page&amp;quot;:&amp;nbsp;page,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;pageSize&amp;quot;:&amp;nbsp;page_size,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;fieldName&amp;quot;:&amp;nbsp;sort_field,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;order&amp;quot;:&amp;nbsp;sort_order,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;virtualFilter&amp;quot;:&amp;nbsp;virtual_filter
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;分销业务筛选参数
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;min_commission:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_params[&amp;quot;minCommissionRate&amp;quot;]&amp;nbsp;=&amp;nbsp;min_commission
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;min_discount:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_params[&amp;quot;minDiscount&amp;quot;]&amp;nbsp;=&amp;nbsp;min_discount
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;min_price:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_params[&amp;quot;minPrice&amp;quot;]&amp;nbsp;=&amp;nbsp;min_price
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;max_price:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_params[&amp;quot;maxPrice&amp;quot;]&amp;nbsp;=&amp;nbsp;max_price

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_params[&amp;quot;sign&amp;quot;]&amp;nbsp;=&amp;nbsp;self.generate_sign(base_params)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;headers&amp;nbsp;=&amp;nbsp;{&amp;quot;Content-Type&amp;quot;:&amp;nbsp;&amp;quot;application/x-www-form-urlencoded;charset=utf-8&amp;quot;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;self.session.post(self.gateway,&amp;nbsp;data=base_params,&amp;nbsp;headers=headers,&amp;nbsp;timeout=15)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw&amp;nbsp;=&amp;nbsp;resp.json()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;限流429指数退避重试
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;raw.get(&amp;quot;code&amp;quot;)&amp;nbsp;==&amp;nbsp;429:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(2)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;self.single_page_query(keyword,&amp;nbsp;page,&amp;nbsp;page_size,&amp;nbsp;min_commission,&amp;nbsp;min_discount,&amp;nbsp;min_price,&amp;nbsp;max_price,&amp;nbsp;virtual_filter,&amp;nbsp;sort_field,&amp;nbsp;sort_order)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;raw.get(&amp;quot;code&amp;quot;)&amp;nbsp;!=&amp;nbsp;0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;-1,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;raw.get(&amp;quot;msg&amp;quot;,&amp;nbsp;&amp;quot;接口调用失败&amp;quot;),&amp;nbsp;&amp;quot;list&amp;quot;:&amp;nbsp;[]}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data_body&amp;nbsp;=&amp;nbsp;raw.get(&amp;quot;data&amp;quot;,&amp;nbsp;{})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goods_raw&amp;nbsp;=&amp;nbsp;data_body.get(&amp;quot;goodsList&amp;quot;,&amp;nbsp;[])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goods_clean&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;特卖分销商品结构化清洗
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;item&amp;nbsp;in&amp;nbsp;goods_raw:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goods_clean.append({
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;goods_id&amp;quot;:&amp;nbsp;item.get(&amp;quot;goodsId&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;title&amp;quot;:&amp;nbsp;item.get(&amp;quot;goodsName&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;brand_name&amp;quot;:&amp;nbsp;item.get(&amp;quot;brandName&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sale_price&amp;quot;:&amp;nbsp;item.get(&amp;quot;salePrice&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;market_price&amp;quot;:&amp;nbsp;item.get(&amp;quot;marketPrice&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;discount&amp;quot;:&amp;nbsp;item.get(&amp;quot;discount&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;commission_rate&amp;quot;:&amp;nbsp;item.get(&amp;quot;commissionRate&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sales_volume&amp;quot;:&amp;nbsp;item.get(&amp;quot;sales&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;main_img&amp;quot;:&amp;nbsp;item.get(&amp;quot;mainImage&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;is_virtual&amp;quot;:&amp;nbsp;item.get(&amp;quot;isVirtual&amp;quot;,&amp;nbsp;0),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;weight&amp;quot;:&amp;nbsp;item.get(&amp;quot;weight&amp;quot;,&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(0.6)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;code&amp;quot;:&amp;nbsp;200,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;total&amp;quot;:&amp;nbsp;data_body.get(&amp;quot;total&amp;quot;,&amp;nbsp;0),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;total_page&amp;quot;:&amp;nbsp;data_body.get(&amp;quot;totalPage&amp;quot;,&amp;nbsp;0),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;current_page&amp;quot;:&amp;nbsp;page,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;goods_list&amp;quot;:&amp;nbsp;goods_clean
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;Exception&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;-2,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;f&amp;quot;网络异常:{str(e)}&amp;quot;,&amp;nbsp;&amp;quot;list&amp;quot;:&amp;nbsp;[]}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_all_search_goods(self,&amp;nbsp;keyword:&amp;nbsp;str,&amp;nbsp;min_commission=None,&amp;nbsp;min_discount=None,&amp;nbsp;min_price=None,&amp;nbsp;max_price=None):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;一键拉取关键词全部商品，自动循环分页&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_goods&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;curr_page&amp;nbsp;=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page_res&amp;nbsp;=&amp;nbsp;self.single_page_query(keyword,&amp;nbsp;curr_page,&amp;nbsp;30,&amp;nbsp;min_commission,&amp;nbsp;min_discount,&amp;nbsp;min_price,&amp;nbsp;max_price)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;page_res[&amp;quot;code&amp;quot;]&amp;nbsp;!=&amp;nbsp;200&amp;nbsp;or&amp;nbsp;len(page_res[&amp;quot;goods_list&amp;quot;])&amp;nbsp;==&amp;nbsp;0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_goods.extend(page_res[&amp;quot;goods_list&amp;quot;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;curr_page&amp;nbsp;&amp;gt;=&amp;nbsp;page_res[&amp;quot;total_page&amp;quot;]:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;curr_page&amp;nbsp;+=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;keyword&amp;quot;:&amp;nbsp;keyword,&amp;nbsp;&amp;quot;total_matched&amp;quot;:&amp;nbsp;len(all_goods),&amp;nbsp;&amp;quot;goods_all&amp;quot;:&amp;nbsp;all_goods}

#&amp;nbsp;调用示例
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client&amp;nbsp;=&amp;nbsp;VipUnionSearchClient(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_key=&amp;quot;VOP后台申请AppKey&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_secret=&amp;quot;VOP后台AppSecret密钥&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;搜索连衣裙，佣金≥10%，折扣≤5折，售价99-399，按销量降序
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;client.get_all_search_goods(keyword=&amp;quot;连衣裙&amp;quot;,&amp;nbsp;min_commission=10,&amp;nbsp;min_discount=5,&amp;nbsp;min_price=99,&amp;nbsp;max_price=399)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(json.dumps(result,&amp;nbsp;ensure_ascii=False,&amp;nbsp;indent=2))&lt;/pre&gt;&lt;/div&gt;&lt;p data-pid=&quot;dkB632lW&quot;&gt;四、实战原创避坑要点&lt;/p&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;时间戳必须 13 位毫秒&lt;/strong&gt;，秒级时间戳直接判定签名无效，绝大多数简易教程未做强制规范。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;签名使用 HMAC-MD5 而非普通 MD5，直接拼接 Secret 会持续鉴权失败。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;virtual_filter 虚拟商品过滤：1 过滤虚拟商品，分销场景避免充值、卡券类无实物货源。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;排序字段固定枚举：SALES 销量、PRICE 价格、DISCOUNT 折扣、COMMISSION_RATE 佣金，自定义字段返回空数据。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;QPS 严格控制 2 次 / 秒，高频批量采集会直接限制应用接口 1 小时不可调用。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Fri, 26 Jun 2026 17:20:24 +0800</pubDate></item><item><title>义乌购关键词商品搜索接口实战：双签名兼容 + 批发多维度筛选 + 分页限流防护（Python 合规生产版）</title><link>https://www.apiproxylog.com/?id=179</link><description>&lt;p&gt;&lt;span id=&quot;content&quot;&gt;&lt;p data-first-child=&quot;&quot; data-pid=&quot;I5M0mLlB&quot;&gt;前言&lt;/p&gt;&lt;p data-pid=&quot;HhCuTkcj&quot;&gt;小商品
 ERP 选品、跨境货源铺货、线下档口价格巡检场景下，关键词批量搜索是货源采集首要入口。网上现有义乌购接口教程普遍存在明显缺陷：仅实现单一 
MD5 签名无法适配 2024 
年后新密钥、缺失批发专属筛选条件、分页无自动闭环、无限流熔断机制、未解析线下实体商位与混批门槛字段，且大量使用第三方中转 API 
而非平台原生网关。本文基于义乌购官方原生&lt;code&gt;search/goods&lt;/code&gt;搜索接口，封装&lt;strong&gt;MD5/SHA1 双算法自适应签名、多维度批发筛选、全自动分页遍历、限流指数退避、时差校验&lt;/strong&gt;，全程依托官方开放 API 开发，无爬虫逆向逻辑。&lt;/p&gt;&lt;p data-pid=&quot;G6wVLyQP&quot;&gt;一、本文差异化核心亮点&lt;/p&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;双加密算法兼容&lt;/strong&gt;：自动识别新旧 AppSecret，老密钥 MD5、2024-10 新密钥 SHA1，解决 90% 开发者签名 401 鉴权失败问题，市面教程极少完整实现兼容逻辑。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;小商品批发专属筛选体系&lt;/strong&gt;：内置价格区间、最小起批量、线下市场、销量排序筛选，贴合义乌源头批发业务，区别零售平台简易搜索代码。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;全自动分页闭环&lt;/strong&gt;：读取总商品数循环遍历所有页面，空页自动终止，无需外部维护页码循环，适配批量货源采集。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;严苛限流防护机制&lt;/strong&gt;：适配免费版 1 次 / 秒、企业版 10 次 / 秒双档位限速，捕获 429 超限自动延长休眠，规避 IP 封禁 8 小时风险。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;批发字段结构化清洗&lt;/strong&gt;：单独提取实体商位、混批最低件数、库存预警阈值等义乌独有字段，直接适配 ERP 入库逻辑。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p data-pid=&quot;4EeL-3wf&quot;&gt;二、接口基础规范&lt;/p&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;原生接口地址：&lt;code&gt;https://api.yiwugo.com/search/goods&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;请求方式：GET 参数拼接&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;公共必填参数：app_key、keyword、timestamp（秒级时间戳）、sign 签名&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;签名规则：参数 ASCII 升序、过滤空值、中文 URL 编码，新旧密钥区分加密算法&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;调用限制：个人开发者 QPS≤1，企业签约 QPS≤10，超限直接锁定 IP8 小时&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;权限要求：义乌购开放平台企业实名认证，开通商品搜索读取权限&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;figure data-size=&quot;normal&quot;&gt;&lt;div class=&quot;RichText-ConditionalImagePortal&quot;&gt;&lt;img src=&quot;https://pica.zhimg.com/80/v2-7a9a696ec26566ab472f38dff4cd94aa_720w.webp&quot; data-caption=&quot;&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1164&quot; data-rawheight=&quot;583&quot; data-original-token=&quot;v2-b8f428fada6adf74fdca9081dcd1bed6&quot; class=&quot;origin_image zh-lightbox-thumb lazy&quot; width=&quot;1164&quot; data-original=&quot;https://pica.zhimg.com/v2-7a9a696ec26566ab472f38dff4cd94aa_r.jpg&quot; data-actualsrc=&quot;https://pica.zhimg.com/v2-7a9a696ec26566ab472f38dff4cd94aa_1440w.jpg&quot; height=&quot;583&quot; data-lazy-status=&quot;ok&quot;/&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p data-pid=&quot;pTXZkZTa&quot;&gt;&lt;a href=&quot;https://o0b.cn/iiiace&quot; target=&quot;_blank&quot;&gt;点击获取key和secret&lt;/a&gt;&lt;/p&gt;&lt;p data-pid=&quot;BWn3V5uc&quot;&gt;三、完整可运行 Python 生产代码&lt;/p&gt;&lt;p data-pid=&quot;Q3XPkjoZ&quot;&gt;python&lt;br/&gt;&lt;br/&gt;运行&lt;br/&gt;&lt;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;import&amp;nbsp;requests
import&amp;nbsp;hashlib
import&amp;nbsp;time
import&amp;nbsp;json
from&amp;nbsp;urllib.parse&amp;nbsp;import&amp;nbsp;quote

class&amp;nbsp;YiWuKeywordSearchClient:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;app_key,&amp;nbsp;app_secret,&amp;nbsp;is_new_key=True):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_key&amp;nbsp;=&amp;nbsp;app_key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_secret&amp;nbsp;=&amp;nbsp;app_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.is_new_key&amp;nbsp;=&amp;nbsp;is_new_key&amp;nbsp;&amp;nbsp;#&amp;nbsp;True=2024后密钥SHA1，False=老密钥MD5
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.api_url&amp;nbsp;=&amp;nbsp;&amp;quot;https://api.yiwugo.com/search/goods&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.session&amp;nbsp;=&amp;nbsp;requests.Session()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;build_signature(self,&amp;nbsp;params):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;双算法兼容标准签名，过滤空参数并编码中文&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;valid_params&amp;nbsp;=&amp;nbsp;{k:&amp;nbsp;v&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;params.items()&amp;nbsp;if&amp;nbsp;v&amp;nbsp;is&amp;nbsp;not&amp;nbsp;None&amp;nbsp;and&amp;nbsp;str(v).strip()&amp;nbsp;!=&amp;nbsp;&amp;quot;&amp;quot;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sorted_kv&amp;nbsp;=&amp;nbsp;sorted(valid_params.items(),&amp;nbsp;key=lambda&amp;nbsp;x:&amp;nbsp;x[0])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_parts&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;sorted_kv:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val_encode&amp;nbsp;=&amp;nbsp;quote(str(v),&amp;nbsp;encoding=&amp;quot;utf-8&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_parts.append(f&amp;quot;{k}={val_encode}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_raw_str&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;amp;&amp;quot;.join(sign_parts)&amp;nbsp;+&amp;nbsp;f&amp;quot;&amp;amp;secret={self.app_secret}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;self.is_new_key:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_res&amp;nbsp;=&amp;nbsp;hashlib.sha1(sign_raw_str.encode(&amp;quot;utf-8&amp;quot;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_res&amp;nbsp;=&amp;nbsp;hashlib.md5(sign_raw_str.encode(&amp;quot;utf-8&amp;quot;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;sign_res.hexdigest().upper()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;single_page_search(self,&amp;nbsp;keyword,&amp;nbsp;page=1,&amp;nbsp;page_size=30,&amp;nbsp;min_price=None,&amp;nbsp;max_price=None,&amp;nbsp;min_buy=None,&amp;nbsp;sort=&amp;quot;sales_desc&amp;quot;):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;单页关键词搜索，支持批发多条件筛选&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;timestamp&amp;nbsp;=&amp;nbsp;int(time.time())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_params&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;app_key&amp;quot;:&amp;nbsp;self.app_key,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;keyword&amp;quot;:&amp;nbsp;keyword,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;timestamp&amp;quot;:&amp;nbsp;timestamp,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page&amp;quot;:&amp;nbsp;page,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page_size&amp;quot;:&amp;nbsp;min(page_size,&amp;nbsp;50),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sort&amp;quot;:&amp;nbsp;sort
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;min_price:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_params[&amp;quot;min_price&amp;quot;]&amp;nbsp;=&amp;nbsp;min_price
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;max_price:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_params[&amp;quot;max_price&amp;quot;]&amp;nbsp;=&amp;nbsp;max_price
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;min_buy:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_params[&amp;quot;min_buy&amp;quot;]&amp;nbsp;=&amp;nbsp;min_buy
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_params[&amp;quot;sign&amp;quot;]&amp;nbsp;=&amp;nbsp;self.build_signature(base_params)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;self.session.get(self.api_url,&amp;nbsp;params=base_params,&amp;nbsp;timeout=15)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw_data&amp;nbsp;=&amp;nbsp;resp.json()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;429限流指数退避重试
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;raw_data.get(&amp;quot;code&amp;quot;)&amp;nbsp;==&amp;nbsp;429:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(3)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;self.single_page_search(keyword,&amp;nbsp;page,&amp;nbsp;page_size,&amp;nbsp;min_price,&amp;nbsp;max_price,&amp;nbsp;min_buy,&amp;nbsp;sort)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;raw_data.get(&amp;quot;code&amp;quot;)&amp;nbsp;!=&amp;nbsp;200:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;-1,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;raw_data.get(&amp;quot;msg&amp;quot;,&amp;nbsp;&amp;quot;接口调用失败&amp;quot;),&amp;nbsp;&amp;quot;list&amp;quot;:&amp;nbsp;[]}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data_body&amp;nbsp;=&amp;nbsp;raw_data.get(&amp;quot;data&amp;quot;,&amp;nbsp;{})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goods_raw&amp;nbsp;=&amp;nbsp;data_body.get(&amp;quot;goods_list&amp;quot;,&amp;nbsp;[])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goods_clean&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;批发商品标准化清洗
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;item&amp;nbsp;in&amp;nbsp;goods_raw:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goods_clean.append({
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;goods_id&amp;quot;:&amp;nbsp;item.get(&amp;quot;goods_id&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;title&amp;quot;:&amp;nbsp;item.get(&amp;quot;title&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;market_shop&amp;quot;:&amp;nbsp;item.get(&amp;quot;market_shop&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;wholesale_price&amp;quot;:&amp;nbsp;item.get(&amp;quot;price&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;min_buy&amp;quot;:&amp;nbsp;item.get(&amp;quot;min_buy&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;stock&amp;quot;:&amp;nbsp;item.get(&amp;quot;stock&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;warning_stock&amp;quot;:&amp;nbsp;item.get(&amp;quot;warning_stock&amp;quot;,&amp;nbsp;0),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sales_volume&amp;quot;:&amp;nbsp;item.get(&amp;quot;sales&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;main_img&amp;quot;:&amp;nbsp;item.get(&amp;quot;main_image&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;supplier_name&amp;quot;:&amp;nbsp;item.get(&amp;quot;supplier_name&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;免费版强制1秒间隔，规避风控
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(1)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;code&amp;quot;:&amp;nbsp;200,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;total&amp;quot;:&amp;nbsp;data_body.get(&amp;quot;total&amp;quot;,&amp;nbsp;0),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;total_page&amp;quot;:&amp;nbsp;data_body.get(&amp;quot;total_page&amp;quot;,&amp;nbsp;0),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;current_page&amp;quot;:&amp;nbsp;page,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;goods_list&amp;quot;:&amp;nbsp;goods_clean
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;Exception&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;-2,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;f&amp;quot;网络异常：{str(e)}&amp;quot;,&amp;nbsp;&amp;quot;list&amp;quot;:&amp;nbsp;[]}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_all_keyword_goods(self,&amp;nbsp;keyword,&amp;nbsp;min_price=None,&amp;nbsp;max_price=None,&amp;nbsp;min_buy=None,&amp;nbsp;sort=&amp;quot;sales_desc&amp;quot;):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;自动循环拉取关键词全部货源，无需手动分页&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_goods&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;current_page&amp;nbsp;=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page_result&amp;nbsp;=&amp;nbsp;self.single_page_search(keyword,&amp;nbsp;current_page,&amp;nbsp;30,&amp;nbsp;min_price,&amp;nbsp;max_price,&amp;nbsp;min_buy,&amp;nbsp;sort)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;page_result[&amp;quot;code&amp;quot;]&amp;nbsp;!=&amp;nbsp;200&amp;nbsp;or&amp;nbsp;len(page_result[&amp;quot;goods_list&amp;quot;])&amp;nbsp;==&amp;nbsp;0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_goods.extend(page_result[&amp;quot;goods_list&amp;quot;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;current_page&amp;nbsp;&amp;gt;=&amp;nbsp;page_result[&amp;quot;total_page&amp;quot;]:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;current_page&amp;nbsp;+=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;keyword&amp;quot;:&amp;nbsp;keyword,&amp;nbsp;&amp;quot;total_matched&amp;quot;:&amp;nbsp;len(all_goods),&amp;nbsp;&amp;quot;goods_all&amp;quot;:&amp;nbsp;all_goods}

#&amp;nbsp;调用示例
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client&amp;nbsp;=&amp;nbsp;YiWuKeywordSearchClient(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_key=&amp;quot;开发者后台申请的AppKey&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_secret=&amp;quot;开发者后台密钥AppSecret&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;is_new_key=True
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;搜索饰品，价格5-50元，起批≥10件，按销量排序
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;client.get_all_keyword_goods(keyword=&amp;quot;饰品&amp;quot;,&amp;nbsp;min_price=5,&amp;nbsp;max_price=50,&amp;nbsp;min_buy=10)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(json.dumps(result,&amp;nbsp;ensure_ascii=False,&amp;nbsp;indent=2))&lt;/pre&gt;&lt;/div&gt;&lt;p data-pid=&quot;Yc4oPtry&quot;&gt;四、实战原创避坑要点&lt;/p&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;时间戳必须秒级&lt;/strong&gt;，传入毫秒值会触发服务器时差拦截，直接返回签名无效，多数简易教程未做限制。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;新老密钥加密算法不可混用，2024 年 10 月后创建应用强制 SHA1，老应用使用 MD5，代码自动区分适配。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;market_shop&lt;/code&gt;线下商位为义乌独有字段，用于线下实地看样，零售电商平台无该返回值。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;warning_stock&lt;/code&gt;库存预警字段不可忽略，库存低于预警值商家不再接单，入库时需增加过滤判断。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;免费版调用间隔最低 1 秒，无缓冲重试机制，高频采集会直接锁定 IP8 小时无法访问接口。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Thu, 25 Jun 2026 17:35:01 +0800</pubDate></item><item><title>义乌购商品 ID 详情接口实战：双算法兼容签名 + 小商品批发结构化解析 + 限流熔断（Python 合规生产版）</title><link>https://www.apiproxylog.com/?id=178</link><description>&lt;p&gt;&lt;span id=&quot;content&quot;&gt;&lt;p data-first-child=&quot;&quot; data-pid=&quot;kL21I9DM&quot;&gt;前言&lt;/p&gt;&lt;p data-pid=&quot;_ekN-0nP&quot;&gt;小商品
 ERP、跨境铺货、线下档口货源监控业务中，通过商品 ID 拉取完整货源详情是核心需求。网上现有义乌购教程存在大量短板：仅单一 MD5 
签名不兼容新版密钥、无阶梯批发价 / 线下商位字段解析、缺少时间戳时差校验、无限流自动休眠、未区分商品下架 / 不存在 / 
签名错误多级异常，且多数混淆第三方中转 API 与义乌购原生开放网关。本文基于义乌购官方原生&lt;code&gt;goods/detail&lt;/code&gt;详情接口，封装&lt;strong&gt;MD5/SHA1 双算法兼容签名、按需字段裁剪、小商品批发专属字段清洗、限流指数退避、时间戳时差校验&lt;/strong&gt;，全程仅使用官方开放 API，无网页爬虫逆向。&lt;/p&gt;&lt;p data-pid=&quot;Jp2MqBfU&quot;&gt;一、本文差异化核心亮点&lt;/p&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;双签名算法自动兼容&lt;/strong&gt;：区分 2024-10 前后 AppKey，自动切换 MD5/SHA1 加密，解决 90% 开发者签名 401 报错痛点，全网少有完整兼容实现。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;小商品批发独有字段解析&lt;/strong&gt;：单独提取线下实体商位、多阶梯批发价、混批门槛、现货库存、起订量等义乌特色业务数据。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;时间戳时差校验逻辑&lt;/strong&gt;：提前捕获本地与服务器时差超 10 分钟问题，避免重放拦截。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;分级限流熔断机制&lt;/strong&gt;：捕获 429 超限、401 签名失效、404 商品下架三类异常，自动延长休眠规避 IP 封禁。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;按需 fields 字段过滤&lt;/strong&gt;：自定义返回字段缩减报文体积，降低接口调用配额消耗，适配批量同步场景。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p data-pid=&quot;Z-THMRbZ&quot;&gt;二、接口基础规范&lt;/p&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;官方原生接口地址：&lt;code&gt;https://api.yiwugo.com/goods/detail&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;请求方式：GET 标准参数拼接&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;必传公共参数：app_key、goods_id、timestamp（秒级）、sign&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;签名规则：老密钥 MD5，2024-10 新密钥强制 SHA1，参数 ASCII 升序拼接&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;调用限制：个人开发者 QPS≤1，企业签约版 QPS≤10，超限锁定 IP8 小时&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;权限要求：义乌购开放平台企业实名认证，开通商品详情读取权限&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;figure data-size=&quot;normal&quot;&gt;&lt;div class=&quot;RichText-ConditionalImagePortal&quot;&gt;&lt;img src=&quot;https://pic1.zhimg.com/80/v2-68a6ad9c896ab6c2f965fde2b28d3530_720w.jpg&quot; data-caption=&quot;&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1166&quot; data-rawheight=&quot;567&quot; data-original-token=&quot;v2-e0a40b35e9aeca558d4ae6c3554c5869&quot; class=&quot;origin_image zh-lightbox-thumb lazy&quot; width=&quot;1166&quot; data-original=&quot;https://pic1.zhimg.com/v2-68a6ad9c896ab6c2f965fde2b28d3530_r.jpg&quot; data-actualsrc=&quot;https://pic1.zhimg.com/v2-68a6ad9c896ab6c2f965fde2b28d3530_1440w.jpg&quot; height=&quot;567&quot; data-lazy-status=&quot;ok&quot;/&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p data-pid=&quot;YCfgffcX&quot;&gt;&lt;a href=&quot;https://o0b.cn/iiiace&quot; target=&quot;_blank&quot;&gt;点击获取key和secret&lt;/a&gt;&lt;/p&gt;&lt;p data-pid=&quot;IglaPm79&quot;&gt;三、完整可运行 Python 生产代码&lt;/p&gt;&lt;p data-pid=&quot;1SIJhRWq&quot;&gt;python&lt;br/&gt;&lt;br/&gt;运行&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;import&amp;nbsp;requests
import&amp;nbsp;hashlib
import&amp;nbsp;time
import&amp;nbsp;json
from&amp;nbsp;urllib.parse&amp;nbsp;import&amp;nbsp;quote

class&amp;nbsp;YiWuGoodsDetailClient:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;app_key,&amp;nbsp;app_secret,&amp;nbsp;is_new_key=True):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_key&amp;nbsp;=&amp;nbsp;app_key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_secret&amp;nbsp;=&amp;nbsp;app_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.is_new_key&amp;nbsp;=&amp;nbsp;is_new_key&amp;nbsp;&amp;nbsp;#&amp;nbsp;True=2024后密钥SHA1，False=老密钥MD5
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.api_url&amp;nbsp;=&amp;nbsp;&amp;quot;https://api.yiwugo.com/goods/detail&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.session&amp;nbsp;=&amp;nbsp;requests.Session()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;build_signature(self,&amp;nbsp;params):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;双算法兼容签名生成，过滤空参数+中文编码&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;valid_params&amp;nbsp;=&amp;nbsp;{k:&amp;nbsp;v&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;params.items()&amp;nbsp;if&amp;nbsp;v&amp;nbsp;is&amp;nbsp;not&amp;nbsp;None&amp;nbsp;and&amp;nbsp;str(v).strip()&amp;nbsp;!=&amp;nbsp;&amp;quot;&amp;quot;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sorted_kv&amp;nbsp;=&amp;nbsp;sorted(valid_params.items(),&amp;nbsp;key=lambda&amp;nbsp;x:&amp;nbsp;x[0])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_parts&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;sorted_kv:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val_encode&amp;nbsp;=&amp;nbsp;quote(str(v),&amp;nbsp;encoding=&amp;quot;utf-8&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_parts.append(f&amp;quot;{k}={val_encode}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_str&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;amp;&amp;quot;.join(sign_parts)&amp;nbsp;+&amp;nbsp;f&amp;quot;&amp;amp;secret={self.app_secret}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;self.is_new_key:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_raw&amp;nbsp;=&amp;nbsp;hashlib.sha1(sign_str.encode(&amp;quot;utf-8&amp;quot;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_raw&amp;nbsp;=&amp;nbsp;hashlib.md5(sign_str.encode(&amp;quot;utf-8&amp;quot;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;sign_raw.hexdigest().upper()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_detail_by_goods_id(self,&amp;nbsp;goods_id,&amp;nbsp;fields=None):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;根据商品ID查询完整批发详情&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;timestamp&amp;nbsp;=&amp;nbsp;int(time.time())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_params&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;app_key&amp;quot;:&amp;nbsp;self.app_key,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;goods_id&amp;quot;:&amp;nbsp;goods_id,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;timestamp&amp;quot;:&amp;nbsp;timestamp
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;fields:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_params[&amp;quot;fields&amp;quot;]&amp;nbsp;=&amp;nbsp;fields
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_params[&amp;quot;sign&amp;quot;]&amp;nbsp;=&amp;nbsp;self.build_signature(base_params)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;self.session.get(self.api_url,&amp;nbsp;params=base_params,&amp;nbsp;timeout=15)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw_data&amp;nbsp;=&amp;nbsp;resp.json()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;限流429自动退避重试
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;raw_data.get(&amp;quot;code&amp;quot;)&amp;nbsp;==&amp;nbsp;429:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(3)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;self.get_detail_by_goods_id(goods_id,&amp;nbsp;fields)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;鉴权/业务异常统一返回
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;raw_data.get(&amp;quot;code&amp;quot;)&amp;nbsp;!=&amp;nbsp;200:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;-1,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;raw_data.get(&amp;quot;msg&amp;quot;,&amp;nbsp;&amp;quot;接口调用失败&amp;quot;),&amp;nbsp;&amp;quot;data&amp;quot;:&amp;nbsp;None}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;item&amp;nbsp;=&amp;nbsp;raw_data.get(&amp;quot;data&amp;quot;,&amp;nbsp;{})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;price_step_list&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;解析多阶梯批发价格
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;price_info&amp;nbsp;in&amp;nbsp;item.get(&amp;quot;price_step&amp;quot;,&amp;nbsp;[]):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;price_step_list.append({
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;min_num&amp;quot;:&amp;nbsp;price_info[&amp;quot;min_num&amp;quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;max_num&amp;quot;:&amp;nbsp;price_info[&amp;quot;max_num&amp;quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;wholesale_price&amp;quot;:&amp;nbsp;price_info[&amp;quot;price&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;小商品批发结构化清洗
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;goods_id&amp;quot;:&amp;nbsp;item.get(&amp;quot;goods_id&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;title&amp;quot;:&amp;nbsp;item.get(&amp;quot;title&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;market_shop&amp;quot;:&amp;nbsp;item.get(&amp;quot;market_shop&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),&amp;nbsp;&amp;nbsp;#&amp;nbsp;线下实体商位
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;mix_min_order&amp;quot;:&amp;nbsp;item.get(&amp;quot;mix_min_order&amp;quot;),&amp;nbsp;&amp;nbsp;#&amp;nbsp;混批最低件数
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;total_stock&amp;quot;:&amp;nbsp;item.get(&amp;quot;stock&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;main_img&amp;quot;:&amp;nbsp;item.get(&amp;quot;main_image&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;detail_img&amp;quot;:&amp;nbsp;item.get(&amp;quot;detail_images&amp;quot;,&amp;nbsp;[]),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sales&amp;quot;:&amp;nbsp;item.get(&amp;quot;sales_volume&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;price_steps&amp;quot;:&amp;nbsp;price_step_list,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;supplier_name&amp;quot;:&amp;nbsp;item.get(&amp;quot;supplier_name&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;update_time&amp;quot;:&amp;nbsp;item.get(&amp;quot;update_time&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(1)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;200,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;&amp;quot;success&amp;quot;,&amp;nbsp;&amp;quot;data&amp;quot;:&amp;nbsp;result}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;Exception&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;-2,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;f&amp;quot;网络请求异常：{str(e)}&amp;quot;,&amp;nbsp;&amp;quot;data&amp;quot;:&amp;nbsp;None}

#&amp;nbsp;调用示例
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client&amp;nbsp;=&amp;nbsp;YiWuGoodsDetailClient(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_key=&amp;quot;开发者后台申请的AppKey&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_secret=&amp;quot;开发者后台AppSecret密钥&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;is_new_key=True&amp;nbsp;&amp;nbsp;#&amp;nbsp;新注册应用填True
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;按需指定返回字段，减少报文体积
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;need_fields&amp;nbsp;=&amp;nbsp;&amp;quot;goods_id,title,market_shop,price_step,stock,sales_volume&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;res&amp;nbsp;=&amp;nbsp;client.get_detail_by_goods_id(goods_id=98765432,&amp;nbsp;fields=need_fields)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(json.dumps(res,&amp;nbsp;ensure_ascii=False,&amp;nbsp;indent=2))&lt;/pre&gt;&lt;/div&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p data-pid=&quot;4oXbyUYI&quot;&gt;四、实战原创避坑要点&lt;/p&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;密钥时间区分签名&lt;/strong&gt;：2024 年 10 月后新申请应用必须 SHA1，老密钥 MD5，混用直接签名校验失败，绝大多数教程未做兼容。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;timestamp 为秒级&lt;/strong&gt;，毫秒时间戳会触发服务器时差拦截，报错签名无效。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;market_shop 线下商位为义乌独有字段&lt;/strong&gt;，零售平台无该数据，铺货系统需单独存储用于线下看样业务。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;price_step 阶梯价不可忽略&lt;/strong&gt;，小商品多档批发价需循环解析，仅取统一售价会造成 ERP 价格错乱。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;QPS 严格控制 1 次 / 秒，个人开发者无缓冲重试，超限直接锁定 IP8 小时。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Wed, 24 Jun 2026 16:59:46 +0800</pubDate></item><item><title>VVIC 搜款网关键词商品搜索接口实战：服装批发筛选 + 标准 MD5 签名 + 限流自动退避（Python 合规生产版）</title><link>https://www.apiproxylog.com/?id=177</link><description>&lt;p&gt;&lt;span id=&quot;content&quot;&gt;&lt;p data-first-child=&quot;&quot; data-pid=&quot;k1NBjml1&quot;&gt;前言&lt;/p&gt;&lt;p data-pid=&quot;mdpJDliM&quot;&gt;服装批发 ERP、货源选品、跨境铺货、档口价格监控场景中，&lt;a class=&quot;RichContent-EntityWord css-b7erz1&quot; data-za-not-track-link=&quot;true&quot; data-paste-text=&quot;true&quot; href=&quot;https://zhida.zhihu.com/search?content_id=277432945&amp;content_type=Article&amp;match_order=1&amp;q=VVIC&amp;zhida_source=entity&quot; target=&quot;_blank&quot;&gt;VVIC&lt;svg width=&quot;10px&quot; height=&quot;10px&quot; viewbox=&quot;0 0 16 16&quot; class=&quot;ZDI ZDI--FourPointedStar16 css-1dvsrp&quot; fill=&quot;currentColor&quot;&gt;&lt;/svg&gt;&lt;/a&gt; 关键词搜索是货源采集核心入口。网上现有教程普遍存在多处短板：签名逻辑简化缺失空值过滤、仅实现单页查询无全量分页、缺少服装行业专属筛选字段、无 &lt;a class=&quot;RichContent-EntityWord css-b7erz1&quot; data-za-not-track-link=&quot;true&quot; data-paste-text=&quot;true&quot; href=&quot;https://zhida.zhihu.com/search?content_id=277432945&amp;content_type=Article&amp;match_order=1&amp;q=429+%E9%99%90%E6%B5%81&amp;zhida_source=entity&quot; target=&quot;_blank&quot;&gt;429 限流&lt;svg width=&quot;10px&quot; height=&quot;10px&quot; viewbox=&quot;0 0 16 16&quot; class=&quot;ZDI ZDI--FourPointedStar16 css-1dvsrp&quot; fill=&quot;currentColor&quot;&gt;&lt;/svg&gt;&lt;/a&gt;重试机制、未结构化解析批发核心数据（起批量、&lt;a class=&quot;RichContent-EntityWord css-b7erz1&quot; data-za-not-track-link=&quot;true&quot; data-paste-text=&quot;true&quot; href=&quot;https://zhida.zhihu.com/search?content_id=277432945&amp;content_type=Article&amp;match_order=1&amp;q=%E4%BA%A7%E4%B8%9A%E5%B8%A6&amp;zhida_source=entity&quot; target=&quot;_blank&quot;&gt;产业带&lt;svg width=&quot;10px&quot; height=&quot;10px&quot; viewbox=&quot;0 0 16 16&quot; class=&quot;ZDI ZDI--FourPointedStar16 css-1dvsrp&quot; fill=&quot;currentColor&quot;&gt;&lt;/svg&gt;&lt;/a&gt;、混批价），且大量混淆第三方中转 API 与 VVIC 原生开放接口。本文基于 VVIC 官方 V2.1 原生搜索接口&lt;code&gt;/api/search/item/keyword&lt;/code&gt;，封装&lt;strong&gt;标准 MD5 大写签名、产业带 / 起批量多维度筛选、自动分页闭环、限流指数退避、批发数据清洗降噪&lt;/strong&gt;，全程仅使用平台官方开放 API，无爬虫逆向，内容合规可直接通过 &lt;a class=&quot;RichContent-EntityWord css-b7erz1&quot; data-za-not-track-link=&quot;true&quot; data-paste-text=&quot;true&quot; href=&quot;https://zhida.zhihu.com/search?content_id=277432945&amp;content_type=Article&amp;match_order=1&amp;q=CSDN&amp;zhida_source=entity&quot; target=&quot;_blank&quot;&gt;CSDN&lt;svg width=&quot;10px&quot; height=&quot;10px&quot; viewbox=&quot;0 0 16 16&quot; class=&quot;ZDI ZDI--FourPointedStar16 css-1dvsrp&quot; fill=&quot;currentColor&quot;&gt;&lt;/svg&gt;&lt;/a&gt; 人工审核。&lt;/p&gt;&lt;p data-pid=&quot;5ZE1dIBD&quot;&gt;一、本文差异化核心亮点&lt;/p&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;原生官方接口适配&lt;/strong&gt;：摒弃第三方中转 API，基于 VVIC V2.1 正式版规范开发，参数、签名完全贴合官方文档。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;服装批发专属筛选&lt;/strong&gt;：内置价格区间、最小起订量、产业带市场、新品 / 爆款筛选，适配服装采购真实业务。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;严谨 &lt;a class=&quot;RichContent-EntityWord css-b7erz1&quot; data-za-not-track-link=&quot;true&quot; data-paste-text=&quot;true&quot; href=&quot;https://zhida.zhihu.com/search?content_id=277432945&amp;content_type=Article&amp;match_order=1&amp;q=MD5+%E7%AD%BE%E5%90%8D&amp;zhida_source=entity&quot; target=&quot;_blank&quot;&gt;MD5 签名&lt;svg width=&quot;10px&quot; height=&quot;10px&quot; viewbox=&quot;0 0 16 16&quot; class=&quot;ZDI ZDI--FourPointedStar16 css-1dvsrp&quot; fill=&quot;currentColor&quot;&gt;&lt;/svg&gt;&lt;/a&gt;封装&lt;/strong&gt;：过滤空参数、中文 URL 编码、13 位毫秒时间戳，解决 90% 开发者签名校验失败问题。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;全量智能分页闭环&lt;/strong&gt;：自动读取总页数循环拉取，空页自动终止，无需手动维护页码循环逻辑。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;风控分级保护&lt;/strong&gt;：捕获 429 限流、500 服务异常、403 鉴权失败，区分错误类型并自动休眠重试，规避 &lt;a class=&quot;RichContent-EntityWord css-b7erz1&quot; data-za-not-track-link=&quot;true&quot; data-paste-text=&quot;true&quot; href=&quot;https://zhida.zhihu.com/search?content_id=277432945&amp;content_type=Article&amp;match_order=1&amp;q=AppKey&amp;zhida_source=entity&quot; target=&quot;_blank&quot;&gt;AppKey&lt;svg width=&quot;10px&quot; height=&quot;10px&quot; viewbox=&quot;0 0 16 16&quot; class=&quot;ZDI ZDI--FourPointedStar16 css-1dvsrp&quot; fill=&quot;currentColor&quot;&gt;&lt;/svg&gt;&lt;/a&gt; 封禁。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p data-pid=&quot;LBlh7kEM&quot;&gt;二、接口基础规范&lt;/p&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;接口路径：&lt;code&gt;https://api.vvic.com/api/search/item/keyword&lt;/code&gt;（生产环境）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;请求方式：POST JSON（禁止 GET，易触发风控拦截）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;鉴权规则：AppKey+13 位毫秒 timestamp+MD5 大写签名&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;调用限制：基础权限 30 次 / 分钟，单页 page_size 最大 50，IP+AppKey 双重限流，超限返回 code=429&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;权限要求：VVIC 开放平台企业认证，开通商品搜索读取权限&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;figure data-size=&quot;normal&quot;&gt;&lt;div class=&quot;RichText-ConditionalImagePortal&quot;&gt;&lt;img src=&quot;https://picx.zhimg.com/v2-d2b83f3f80ad052cdd3a78fbadd234d7_1440w.jpg&quot; data-caption=&quot;&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1176&quot; data-rawheight=&quot;772&quot; data-original-token=&quot;v2-8c4997d533426c1f914a669cfa0158eb&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;1176&quot; data-original=&quot;https://picx.zhimg.com/v2-d2b83f3f80ad052cdd3a78fbadd234d7_r.jpg&quot;/&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p data-pid=&quot;xFHBYz-F&quot;&gt;&lt;a href=&quot;https://o0b.cn/iiiace&quot; target=&quot;_blank&quot;&gt;点击获取key和secret&lt;/a&gt;&lt;/p&gt;&lt;p data-pid=&quot;R4-zY-MF&quot;&gt;三、完整可运行 Python 生产代码&lt;/p&gt;&lt;p data-pid=&quot;x_yVaxmo&quot;&gt;python&lt;br/&gt;&lt;br/&gt;运行&lt;br/&gt;&lt;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;import&amp;nbsp;requests
import&amp;nbsp;hashlib
import&amp;nbsp;time
import&amp;nbsp;json
from&amp;nbsp;urllib.parse&amp;nbsp;import&amp;nbsp;quote
from&amp;nbsp;typing&amp;nbsp;import&amp;nbsp;Dict,&amp;nbsp;List,&amp;nbsp;Optional

class&amp;nbsp;VvicKeywordSearchClient:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;app_key:&amp;nbsp;str,&amp;nbsp;app_secret:&amp;nbsp;str):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_key&amp;nbsp;=&amp;nbsp;app_key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_secret&amp;nbsp;=&amp;nbsp;app_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.api_url&amp;nbsp;=&amp;nbsp;&amp;quot;https://api.vvic.com/api/search/item/keyword&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.session&amp;nbsp;=&amp;nbsp;requests.Session()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;generate_sign(self,&amp;nbsp;params:&amp;nbsp;Dict)&amp;nbsp;-&amp;gt;&amp;nbsp;str:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;VVIC&amp;nbsp;V2.1标准MD5签名，过滤空值+中文编码+ASCII升序&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;filter_params&amp;nbsp;=&amp;nbsp;{k:&amp;nbsp;v&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;params.items()&amp;nbsp;if&amp;nbsp;v&amp;nbsp;is&amp;nbsp;not&amp;nbsp;None&amp;nbsp;and&amp;nbsp;str(v).strip()&amp;nbsp;!=&amp;nbsp;&amp;quot;&amp;quot;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sorted_kv&amp;nbsp;=&amp;nbsp;sorted(filter_params.items(),&amp;nbsp;key=lambda&amp;nbsp;x:&amp;nbsp;x[0])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_parts&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;sorted_kv:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val_encode&amp;nbsp;=&amp;nbsp;quote(str(v),&amp;nbsp;encoding=&amp;quot;utf-8&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_parts.append(f&amp;quot;{k}={val_encode}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_str&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;amp;&amp;quot;.join(sign_parts)&amp;nbsp;+&amp;nbsp;self.app_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;md5_raw&amp;nbsp;=&amp;nbsp;hashlib.md5(sign_str.encode(&amp;quot;utf-8&amp;quot;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;md5_raw.hexdigest().upper()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;single_page_query(self,&amp;nbsp;keyword:&amp;nbsp;str,&amp;nbsp;page:&amp;nbsp;int&amp;nbsp;=&amp;nbsp;1,&amp;nbsp;page_size:&amp;nbsp;int&amp;nbsp;=&amp;nbsp;30,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;min_price:&amp;nbsp;Optional[int]&amp;nbsp;=&amp;nbsp;None,&amp;nbsp;max_price:&amp;nbsp;Optional[int]&amp;nbsp;=&amp;nbsp;None,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;min_buy:&amp;nbsp;Optional[int]&amp;nbsp;=&amp;nbsp;None,&amp;nbsp;market_code:&amp;nbsp;Optional[str]&amp;nbsp;=&amp;nbsp;None,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sort:&amp;nbsp;str&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;)&amp;nbsp;-&amp;gt;&amp;nbsp;Dict:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;单页关键词搜索，支持批发多条件筛选&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;timestamp&amp;nbsp;=&amp;nbsp;str(int(time.time()&amp;nbsp;*&amp;nbsp;1000))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_params&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;app_key&amp;quot;:&amp;nbsp;self.app_key,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;timestamp&amp;quot;:&amp;nbsp;timestamp,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;version&amp;quot;:&amp;nbsp;&amp;quot;2.1&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;keyword&amp;quot;:&amp;nbsp;keyword,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page&amp;quot;:&amp;nbsp;page,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page_size&amp;quot;:&amp;nbsp;min(page_size,&amp;nbsp;50),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sort&amp;quot;:&amp;nbsp;sort
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;服装批发筛选参数
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;min_price:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_params[&amp;quot;price_min&amp;quot;]&amp;nbsp;=&amp;nbsp;min_price
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;max_price:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_params[&amp;quot;price_max&amp;quot;]&amp;nbsp;=&amp;nbsp;max_price
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;min_buy:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_params[&amp;quot;min_buy&amp;quot;]&amp;nbsp;=&amp;nbsp;min_buy
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;market_code:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_params[&amp;quot;market&amp;quot;]&amp;nbsp;=&amp;nbsp;market_code

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_params[&amp;quot;sign&amp;quot;]&amp;nbsp;=&amp;nbsp;self.generate_sign(base_params)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;headers&amp;nbsp;=&amp;nbsp;{&amp;quot;Content-Type&amp;quot;:&amp;nbsp;&amp;quot;application/json;charset=utf-8&amp;quot;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;self.session.post(self.api_url,&amp;nbsp;json=base_params,&amp;nbsp;headers=headers,&amp;nbsp;timeout=15)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw_data&amp;nbsp;=&amp;nbsp;resp.json()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;限流429指数退避重试
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;raw_data.get(&amp;quot;code&amp;quot;)&amp;nbsp;==&amp;nbsp;429:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(2)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;self.single_page_query(keyword,&amp;nbsp;page,&amp;nbsp;page_size,&amp;nbsp;min_price,&amp;nbsp;max_price,&amp;nbsp;min_buy,&amp;nbsp;market_code,&amp;nbsp;sort)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;raw_data.get(&amp;quot;code&amp;quot;)&amp;nbsp;!=&amp;nbsp;200:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;-1,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;raw_data.get(&amp;quot;msg&amp;quot;,&amp;nbsp;&amp;quot;接口调用失败&amp;quot;),&amp;nbsp;&amp;quot;data&amp;quot;:&amp;nbsp;[]}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;res_body&amp;nbsp;=&amp;nbsp;raw_data.get(&amp;quot;data&amp;quot;,&amp;nbsp;{})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;item_list&amp;nbsp;=&amp;nbsp;res_body.get(&amp;quot;item_list&amp;quot;,&amp;nbsp;[])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;product_clean&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;批发商品结构化清洗
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;item&amp;nbsp;in&amp;nbsp;item_list:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;product_clean.append({
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;item_id&amp;quot;:&amp;nbsp;item.get(&amp;quot;item_id&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;title&amp;quot;:&amp;nbsp;item.get(&amp;quot;title&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;market_name&amp;quot;:&amp;nbsp;item.get(&amp;quot;market_name&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;wholesale_price&amp;quot;:&amp;nbsp;item.get(&amp;quot;price&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;min_order&amp;quot;:&amp;nbsp;item.get(&amp;quot;min_buy&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;stock_num&amp;quot;:&amp;nbsp;item.get(&amp;quot;stock&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sales_volume&amp;quot;:&amp;nbsp;item.get(&amp;quot;sales&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;main_img&amp;quot;:&amp;nbsp;item.get(&amp;quot;img_url&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;shop_name&amp;quot;:&amp;nbsp;item.get(&amp;quot;shop_name&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;update_time&amp;quot;:&amp;nbsp;item.get(&amp;quot;update_time&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(0.4)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;code&amp;quot;:&amp;nbsp;200,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;total&amp;quot;:&amp;nbsp;res_body.get(&amp;quot;total&amp;quot;,&amp;nbsp;0),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;total_page&amp;quot;:&amp;nbsp;res_body.get(&amp;quot;total_page&amp;quot;,&amp;nbsp;0),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;current_page&amp;quot;:&amp;nbsp;page,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;product_list&amp;quot;:&amp;nbsp;product_clean
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;Exception&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;-2,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;f&amp;quot;网络异常:{str(e)}&amp;quot;,&amp;nbsp;&amp;quot;data&amp;quot;:&amp;nbsp;[]}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_all_search_goods(self,&amp;nbsp;keyword:&amp;nbsp;str,&amp;nbsp;min_price=None,&amp;nbsp;max_price=None,&amp;nbsp;min_buy=None,&amp;nbsp;market_code=None,&amp;nbsp;sort=&amp;quot;sales&amp;quot;)&amp;nbsp;-&amp;gt;&amp;nbsp;Dict:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;一键拉取关键词全部商品，自动循环分页&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_product&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page&amp;nbsp;=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page_res&amp;nbsp;=&amp;nbsp;self.single_page_query(keyword,&amp;nbsp;page,&amp;nbsp;30,&amp;nbsp;min_price,&amp;nbsp;max_price,&amp;nbsp;min_buy,&amp;nbsp;market_code,&amp;nbsp;sort)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;page_res[&amp;quot;code&amp;quot;]&amp;nbsp;!=&amp;nbsp;200&amp;nbsp;or&amp;nbsp;len(page_res[&amp;quot;product_list&amp;quot;])&amp;nbsp;==&amp;nbsp;0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_product.extend(page_res[&amp;quot;product_list&amp;quot;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;page&amp;nbsp;&amp;gt;=&amp;nbsp;page_res[&amp;quot;total_page&amp;quot;]:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page&amp;nbsp;+=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;keyword&amp;quot;:&amp;nbsp;keyword,&amp;nbsp;&amp;quot;total_matched&amp;quot;:&amp;nbsp;len(all_product),&amp;nbsp;&amp;quot;goods_all&amp;quot;:&amp;nbsp;all_product}

#&amp;nbsp;调用示例
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client&amp;nbsp;=&amp;nbsp;VvicKeywordSearchClient(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_key=&amp;quot;开发者后台申请的AppKey&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_secret=&amp;quot;开发者后台AppSecret密钥&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;搜索连衣裙，价格30-120，起批2件，按销量排序
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;client.get_all_search_goods(keyword=&amp;quot;连衣裙&amp;quot;,&amp;nbsp;min_price=30,&amp;nbsp;max_price=120,&amp;nbsp;min_buy=2)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(json.dumps(result,&amp;nbsp;ensure_ascii=False,&amp;nbsp;indent=2))&lt;/pre&gt;&lt;/div&gt;&lt;p data-pid=&quot;UK6cFQr9&quot;&gt;四、实战原创避坑要点&lt;/p&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;时间戳必须 13 位毫秒&lt;/strong&gt;，秒级时间戳会直接签名不通过，全网多数简易教程遗漏该规范。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;中文关键词必须 URL 编码&lt;/strong&gt;，签名函数内置转义，直接传入中文会导致校验失败。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;page_size 上限 50&lt;/strong&gt;，超过 50 会返回参数非法，批量采集建议 30 条每页平衡速度与风控。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;sort 排序参数区分&lt;/strong&gt;：sales 销量、price_asc 低价、price_desc 高价、new 新品，服装选品优先销量排序。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;market 产业带编码必填数字&lt;/strong&gt;，如十三行、沙河对应专属编码，不传则返回全市场混合商品。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Tue, 23 Jun 2026 17:43:48 +0800</pubDate></item><item><title>VVIC 搜款网关键词商品搜索接口实战：服装批发筛选 + 标准 MD5 签名 + 限流自动退避（Python 合规生产版）</title><link>https://www.apiproxylog.com/?id=176</link><description>&lt;p&gt;&lt;span id=&quot;content&quot;&gt;&lt;p data-first-child=&quot;&quot; data-pid=&quot;k1NBjml1&quot;&gt;前言&lt;/p&gt;&lt;p data-pid=&quot;mdpJDliM&quot;&gt;服装批发
 ERP、货源选品、跨境铺货、档口价格监控场景中，VVIC 
关键词搜索是货源采集核心入口。网上现有教程普遍存在多处短板：签名逻辑简化缺失空值过滤、仅实现单页查询无全量分页、缺少服装行业专属筛选字段、无 
429 限流重试机制、未结构化解析批发核心数据（起批量、产业带、混批价），且大量混淆第三方中转 API 与 VVIC 原生开放接口。本文基于 
VVIC 官方 V2.1 原生搜索接口&lt;code&gt;/api/search/item/keyword&lt;/code&gt;，封装&lt;strong&gt;标准 MD5 大写签名、产业带 / 起批量多维度筛选、自动分页闭环、限流指数退避、批发数据清洗降噪&lt;/strong&gt;，全程仅使用平台官方开放 API，无爬虫逆向。&lt;/p&gt;&lt;p data-pid=&quot;5ZE1dIBD&quot;&gt;一、本文差异化核心亮点&lt;/p&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;原生官方接口适配&lt;/strong&gt;：摒弃第三方中转 API，基于 VVIC V2.1 正式版规范开发，参数、签名完全贴合官方文档。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;服装批发专属筛选&lt;/strong&gt;：内置价格区间、最小起订量、产业带市场、新品 / 爆款筛选，适配服装采购真实业务。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;严谨 MD5 签名封装&lt;/strong&gt;：过滤空参数、中文 URL 编码、13 位毫秒时间戳，解决 90% 开发者签名校验失败问题。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;全量智能分页闭环&lt;/strong&gt;：自动读取总页数循环拉取，空页自动终止，无需手动维护页码循环逻辑。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;风控分级保护&lt;/strong&gt;：捕获 429 限流、500 服务异常、403 鉴权失败，区分错误类型并自动休眠重试，规避 AppKey 封禁。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p data-pid=&quot;LBlh7kEM&quot;&gt;二、接口基础规范&lt;/p&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;接口路径：&lt;code&gt;https://api.vvic.com/api/search/item/keyword&lt;/code&gt;（生产环境）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;请求方式：POST JSON（禁止 GET，易触发风控拦截）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;鉴权规则：AppKey+13 位毫秒 timestamp+MD5 大写签名&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;调用限制：基础权限 30 次 / 分钟，单页 page_size 最大 50，IP+AppKey 双重限流，超限返回 code=429&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;权限要求：VVIC 开放平台企业认证，开通商品搜索读取权限&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;figure data-size=&quot;normal&quot;&gt;&lt;div class=&quot;RichText-ConditionalImagePortal&quot;&gt;&lt;img src=&quot;https://picx.zhimg.com/v2-d2b83f3f80ad052cdd3a78fbadd234d7_1440w.jpg&quot; data-caption=&quot;&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1176&quot; data-rawheight=&quot;772&quot; data-original-token=&quot;v2-8c4997d533426c1f914a669cfa0158eb&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;1176&quot; data-original=&quot;https://picx.zhimg.com/v2-d2b83f3f80ad052cdd3a78fbadd234d7_r.jpg&quot;/&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p data-pid=&quot;xFHBYz-F&quot;&gt;&lt;a href=&quot;https://o0b.cn/iiiace&quot; target=&quot;_blank&quot;&gt;点击获取key和secret&lt;/a&gt;&lt;/p&gt;&lt;p data-pid=&quot;R4-zY-MF&quot;&gt;三、完整可运行 Python 生产代码&lt;/p&gt;&lt;p data-pid=&quot;x_yVaxmo&quot;&gt;python&lt;br/&gt;&lt;br/&gt;运行&lt;br/&gt;&lt;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;import&amp;nbsp;requests
import&amp;nbsp;hashlib
import&amp;nbsp;time
import&amp;nbsp;json
from&amp;nbsp;urllib.parse&amp;nbsp;import&amp;nbsp;quote
from&amp;nbsp;typing&amp;nbsp;import&amp;nbsp;Dict,&amp;nbsp;List,&amp;nbsp;Optional

class&amp;nbsp;VvicKeywordSearchClient:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;app_key:&amp;nbsp;str,&amp;nbsp;app_secret:&amp;nbsp;str):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_key&amp;nbsp;=&amp;nbsp;app_key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_secret&amp;nbsp;=&amp;nbsp;app_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.api_url&amp;nbsp;=&amp;nbsp;&amp;quot;https://api.vvic.com/api/search/item/keyword&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.session&amp;nbsp;=&amp;nbsp;requests.Session()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;generate_sign(self,&amp;nbsp;params:&amp;nbsp;Dict)&amp;nbsp;-&amp;gt;&amp;nbsp;str:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;VVIC&amp;nbsp;V2.1标准MD5签名，过滤空值+中文编码+ASCII升序&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;filter_params&amp;nbsp;=&amp;nbsp;{k:&amp;nbsp;v&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;params.items()&amp;nbsp;if&amp;nbsp;v&amp;nbsp;is&amp;nbsp;not&amp;nbsp;None&amp;nbsp;and&amp;nbsp;str(v).strip()&amp;nbsp;!=&amp;nbsp;&amp;quot;&amp;quot;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sorted_kv&amp;nbsp;=&amp;nbsp;sorted(filter_params.items(),&amp;nbsp;key=lambda&amp;nbsp;x:&amp;nbsp;x[0])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_parts&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;sorted_kv:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val_encode&amp;nbsp;=&amp;nbsp;quote(str(v),&amp;nbsp;encoding=&amp;quot;utf-8&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_parts.append(f&amp;quot;{k}={val_encode}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_str&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;amp;&amp;quot;.join(sign_parts)&amp;nbsp;+&amp;nbsp;self.app_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;md5_raw&amp;nbsp;=&amp;nbsp;hashlib.md5(sign_str.encode(&amp;quot;utf-8&amp;quot;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;md5_raw.hexdigest().upper()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;single_page_query(self,&amp;nbsp;keyword:&amp;nbsp;str,&amp;nbsp;page:&amp;nbsp;int&amp;nbsp;=&amp;nbsp;1,&amp;nbsp;page_size:&amp;nbsp;int&amp;nbsp;=&amp;nbsp;30,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;min_price:&amp;nbsp;Optional[int]&amp;nbsp;=&amp;nbsp;None,&amp;nbsp;max_price:&amp;nbsp;Optional[int]&amp;nbsp;=&amp;nbsp;None,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;min_buy:&amp;nbsp;Optional[int]&amp;nbsp;=&amp;nbsp;None,&amp;nbsp;market_code:&amp;nbsp;Optional[str]&amp;nbsp;=&amp;nbsp;None,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sort:&amp;nbsp;str&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;)&amp;nbsp;-&amp;gt;&amp;nbsp;Dict:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;单页关键词搜索，支持批发多条件筛选&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;timestamp&amp;nbsp;=&amp;nbsp;str(int(time.time()&amp;nbsp;*&amp;nbsp;1000))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_params&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;app_key&amp;quot;:&amp;nbsp;self.app_key,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;timestamp&amp;quot;:&amp;nbsp;timestamp,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;version&amp;quot;:&amp;nbsp;&amp;quot;2.1&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;keyword&amp;quot;:&amp;nbsp;keyword,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page&amp;quot;:&amp;nbsp;page,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page_size&amp;quot;:&amp;nbsp;min(page_size,&amp;nbsp;50),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sort&amp;quot;:&amp;nbsp;sort
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;服装批发筛选参数
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;min_price:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_params[&amp;quot;price_min&amp;quot;]&amp;nbsp;=&amp;nbsp;min_price
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;max_price:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_params[&amp;quot;price_max&amp;quot;]&amp;nbsp;=&amp;nbsp;max_price
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;min_buy:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_params[&amp;quot;min_buy&amp;quot;]&amp;nbsp;=&amp;nbsp;min_buy
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;market_code:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_params[&amp;quot;market&amp;quot;]&amp;nbsp;=&amp;nbsp;market_code

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_params[&amp;quot;sign&amp;quot;]&amp;nbsp;=&amp;nbsp;self.generate_sign(base_params)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;headers&amp;nbsp;=&amp;nbsp;{&amp;quot;Content-Type&amp;quot;:&amp;nbsp;&amp;quot;application/json;charset=utf-8&amp;quot;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;self.session.post(self.api_url,&amp;nbsp;json=base_params,&amp;nbsp;headers=headers,&amp;nbsp;timeout=15)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw_data&amp;nbsp;=&amp;nbsp;resp.json()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;限流429指数退避重试
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;raw_data.get(&amp;quot;code&amp;quot;)&amp;nbsp;==&amp;nbsp;429:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(2)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;self.single_page_query(keyword,&amp;nbsp;page,&amp;nbsp;page_size,&amp;nbsp;min_price,&amp;nbsp;max_price,&amp;nbsp;min_buy,&amp;nbsp;market_code,&amp;nbsp;sort)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;raw_data.get(&amp;quot;code&amp;quot;)&amp;nbsp;!=&amp;nbsp;200:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;-1,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;raw_data.get(&amp;quot;msg&amp;quot;,&amp;nbsp;&amp;quot;接口调用失败&amp;quot;),&amp;nbsp;&amp;quot;data&amp;quot;:&amp;nbsp;[]}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;res_body&amp;nbsp;=&amp;nbsp;raw_data.get(&amp;quot;data&amp;quot;,&amp;nbsp;{})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;item_list&amp;nbsp;=&amp;nbsp;res_body.get(&amp;quot;item_list&amp;quot;,&amp;nbsp;[])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;product_clean&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;批发商品结构化清洗
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;item&amp;nbsp;in&amp;nbsp;item_list:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;product_clean.append({
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;item_id&amp;quot;:&amp;nbsp;item.get(&amp;quot;item_id&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;title&amp;quot;:&amp;nbsp;item.get(&amp;quot;title&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;market_name&amp;quot;:&amp;nbsp;item.get(&amp;quot;market_name&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;wholesale_price&amp;quot;:&amp;nbsp;item.get(&amp;quot;price&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;min_order&amp;quot;:&amp;nbsp;item.get(&amp;quot;min_buy&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;stock_num&amp;quot;:&amp;nbsp;item.get(&amp;quot;stock&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sales_volume&amp;quot;:&amp;nbsp;item.get(&amp;quot;sales&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;main_img&amp;quot;:&amp;nbsp;item.get(&amp;quot;img_url&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;shop_name&amp;quot;:&amp;nbsp;item.get(&amp;quot;shop_name&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;update_time&amp;quot;:&amp;nbsp;item.get(&amp;quot;update_time&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(0.4)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;code&amp;quot;:&amp;nbsp;200,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;total&amp;quot;:&amp;nbsp;res_body.get(&amp;quot;total&amp;quot;,&amp;nbsp;0),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;total_page&amp;quot;:&amp;nbsp;res_body.get(&amp;quot;total_page&amp;quot;,&amp;nbsp;0),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;current_page&amp;quot;:&amp;nbsp;page,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;product_list&amp;quot;:&amp;nbsp;product_clean
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;Exception&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;-2,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;f&amp;quot;网络异常:{str(e)}&amp;quot;,&amp;nbsp;&amp;quot;data&amp;quot;:&amp;nbsp;[]}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_all_search_goods(self,&amp;nbsp;keyword:&amp;nbsp;str,&amp;nbsp;min_price=None,&amp;nbsp;max_price=None,&amp;nbsp;min_buy=None,&amp;nbsp;market_code=None,&amp;nbsp;sort=&amp;quot;sales&amp;quot;)&amp;nbsp;-&amp;gt;&amp;nbsp;Dict:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;一键拉取关键词全部商品，自动循环分页&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_product&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page&amp;nbsp;=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page_res&amp;nbsp;=&amp;nbsp;self.single_page_query(keyword,&amp;nbsp;page,&amp;nbsp;30,&amp;nbsp;min_price,&amp;nbsp;max_price,&amp;nbsp;min_buy,&amp;nbsp;market_code,&amp;nbsp;sort)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;page_res[&amp;quot;code&amp;quot;]&amp;nbsp;!=&amp;nbsp;200&amp;nbsp;or&amp;nbsp;len(page_res[&amp;quot;product_list&amp;quot;])&amp;nbsp;==&amp;nbsp;0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_product.extend(page_res[&amp;quot;product_list&amp;quot;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;page&amp;nbsp;&amp;gt;=&amp;nbsp;page_res[&amp;quot;total_page&amp;quot;]:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page&amp;nbsp;+=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;keyword&amp;quot;:&amp;nbsp;keyword,&amp;nbsp;&amp;quot;total_matched&amp;quot;:&amp;nbsp;len(all_product),&amp;nbsp;&amp;quot;goods_all&amp;quot;:&amp;nbsp;all_product}

#&amp;nbsp;调用示例
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client&amp;nbsp;=&amp;nbsp;VvicKeywordSearchClient(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_key=&amp;quot;开发者后台申请的AppKey&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_secret=&amp;quot;开发者后台AppSecret密钥&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;搜索连衣裙，价格30-120，起批2件，按销量排序
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;client.get_all_search_goods(keyword=&amp;quot;连衣裙&amp;quot;,&amp;nbsp;min_price=30,&amp;nbsp;max_price=120,&amp;nbsp;min_buy=2)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(json.dumps(result,&amp;nbsp;ensure_ascii=False,&amp;nbsp;indent=2))&lt;/pre&gt;&lt;/div&gt;&lt;p data-pid=&quot;UK6cFQr9&quot;&gt;四、实战原创避坑要点&lt;/p&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;时间戳必须 13 位毫秒&lt;/strong&gt;，秒级时间戳会直接签名不通过，全网多数简易教程遗漏该规范。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;中文关键词必须 URL 编码&lt;/strong&gt;，签名函数内置转义，直接传入中文会导致校验失败。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;page_size 上限 50&lt;/strong&gt;，超过 50 会返回参数非法，批量采集建议 30 条每页平衡速度与风控。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;sort 排序参数区分&lt;/strong&gt;：sales 销量、price_asc 低价、price_desc 高价、new 新品，服装选品优先销量排序。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;market 产业带编码必填数字&lt;/strong&gt;，如十三行、沙河对应专属编码，不传则返回全市场混合商品。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Mon, 22 Jun 2026 17:40:49 +0800</pubDate></item><item><title>乐天 Rakuten 商品详情接口实战：单品完整画像解析 + 签名鉴权 + 限流退避（Python 合规生产版） API爱好者 API爱好者</title><link>https://www.apiproxylog.com/?id=175</link><description>&lt;p&gt;&lt;span id=&quot;content&quot;&gt;&lt;p data-first-child=&quot;&quot; data-pid=&quot;_waVEF2m&quot;&gt;前言&lt;/p&gt;&lt;p data-pid=&quot;MBhoD-X_&quot;&gt;对日跨境
 ERP、竞品深度分析、多平台铺货场景下，乐天单品详情是业务核心数据源。网上现有教程普遍存在短板：仅做简单裸调用、缺少 HMAC-SHA256 
安全签名、未做日文图文清洗、无 429 限流重试、字段提取零散，且混淆乐天日本、韩国两套 API 规范，无法直接投入生产。本文基于乐天官方稳定版&lt;code&gt;IchibaItem/Item/20170426&lt;/code&gt;详情接口，封装&lt;strong&gt;标准加密签名、按需字段裁剪、多图 / 规格 / 评价结构化解析、指数退避限流、多层异常捕获&lt;/strong&gt;，全程仅使用官方开放 API，无网页爬虫逆向。&lt;/p&gt;&lt;p data-pid=&quot;86e6Yalp&quot;&gt;一、本文差异化核心亮点&lt;/p&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;完整 HMAC-SHA256 签名封装&lt;/strong&gt;：区别网上只传 ApplicationID 的简易代码，支持企业级防重放、防篡改请求。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;对日专属商品画像清洗&lt;/strong&gt;：统一解析日文详情描述、多图数组、尺寸重量、配送区域、评价总分等跨境刚需字段。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;按需 elements 字段过滤&lt;/strong&gt;：自定义返回字段减少报文体积，降低 API 配额消耗。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;分级限流自动退避机制&lt;/strong&gt;：捕获 429 超限自动延长休眠，避免开发者接口权限封禁。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;健壮异常分层处理&lt;/strong&gt;：区分 403 鉴权失败、404 商品不存在、网络超时、JSON 解析异常四类错误。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p data-pid=&quot;bHIGSAMA&quot;&gt;二、接口基础规范&lt;/p&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;接口名称：IchibaItem/Item/20170426（乐天日本商品详情稳定版本）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;请求网关：&lt;a href=&quot;https://link.zhihu.com/?target=https%3A//link.wtturl.cn/%3Ftarget%3Dhttps%253A%252F%252Fapp.rakuten.co.jp%252Fservices%252Fapi%252FIchibaItem%252FItem%252F20170426%26scene%3Dim%26aid%3D582478%26lang%3Dzh&quot; class=&quot; wrap external&quot; target=&quot;_blank&quot; rel=&quot;nofollow noreferrer&quot; data-za-detail-view-id=&quot;1043&quot;&gt;https://app.rakuten.co.jp/services/api/IchibaItem/Item/20170426&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;鉴权规则：ApplicationID 必填，SecretKey 用于生成 HMAC-SHA256 签名&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;请求方式：GET，参数 URL 拼接，返回 JSON 结构化数据&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;调用限制：个人开发者 QPS≤3，单账号日调用上限 10000 次，超限返回 429&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;权限要求：乐天开发者后台注册应用，开通 Ichiba 商品详情接口权限&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;figure data-size=&quot;normal&quot;&gt;&lt;div class=&quot;RichText-ConditionalImagePortal&quot;&gt;&lt;img src=&quot;https://picx.zhimg.com/80/v2-d6bb273c90e255fc2e25ac40185b40d1_720w.webp&quot; data-caption=&quot;&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1160&quot; data-rawheight=&quot;575&quot; data-original-token=&quot;v2-b52391fb2ac534e2635241cb34a5b2e1&quot; class=&quot;origin_image zh-lightbox-thumb lazy&quot; width=&quot;1160&quot; data-original=&quot;https://picx.zhimg.com/v2-d6bb273c90e255fc2e25ac40185b40d1_r.jpg&quot; data-actualsrc=&quot;https://picx.zhimg.com/v2-d6bb273c90e255fc2e25ac40185b40d1_1440w.jpg&quot; height=&quot;575&quot; data-lazy-status=&quot;ok&quot;/&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p data-pid=&quot;133eDBP4&quot;&gt;&lt;a href=&quot;https://link.zhihu.com/?target=https%3A//o0b.cn/iiiace&quot; class=&quot; wrap external&quot; target=&quot;_blank&quot; rel=&quot;nofollow noreferrer&quot; data-za-detail-view-id=&quot;1043&quot;&gt;点击获取key和secret&lt;/a&gt;&lt;/p&gt;&lt;p data-pid=&quot;r42IQF0z&quot;&gt;三、完整可运行 Python 生产代码&lt;/p&gt;&lt;p data-pid=&quot;Xa6EuOSD&quot;&gt;python&lt;br/&gt;&lt;br/&gt;运行&lt;br/&gt;&lt;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;import&amp;nbsp;requests
import&amp;nbsp;hmac
import&amp;nbsp;hashlib
import&amp;nbsp;time
import&amp;nbsp;json
from&amp;nbsp;urllib.parse&amp;nbsp;import&amp;nbsp;quote_plus
from&amp;nbsp;requests.exceptions&amp;nbsp;import&amp;nbsp;RequestException

class&amp;nbsp;RakutenItemDetailAPI:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;app_id,&amp;nbsp;secret_key):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_id&amp;nbsp;=&amp;nbsp;app_id
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.secret_key&amp;nbsp;=&amp;nbsp;secret_key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.base_url&amp;nbsp;=&amp;nbsp;&amp;quot;https://app.rakuten.co.jp/services/api/IchibaItem/Item/20170426&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.session&amp;nbsp;=&amp;nbsp;requests.Session()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;build_signature(self,&amp;nbsp;params):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;乐天标准HMAC-SHA256签名，参数ASCII升序、URL编码&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sorted_params&amp;nbsp;=&amp;nbsp;sorted(params.items(),&amp;nbsp;key=lambda&amp;nbsp;x:&amp;nbsp;x[0])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;param_str&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;amp;&amp;quot;.join(f&amp;quot;{k}={quote_plus(str(v))}&amp;quot;&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;sorted_params)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_raw&amp;nbsp;=&amp;nbsp;hmac.new(self.secret_key.encode(&amp;quot;utf-8&amp;quot;),&amp;nbsp;param_str.encode(&amp;quot;utf-8&amp;quot;),&amp;nbsp;hashlib.sha256)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;sign_raw.hexdigest().lower()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_item_detail(self,&amp;nbsp;item_code,&amp;nbsp;elements=None):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;获取乐天单品完整详情
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;item_code:&amp;nbsp;商品唯一编码&amp;nbsp;格式shopId:itemId
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;elements:&amp;nbsp;自定义返回字段，缩减报文
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:return:&amp;nbsp;标准化清洗后的商品详情
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;applicationId&amp;quot;:&amp;nbsp;self.app_id,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;itemCode&amp;quot;:&amp;nbsp;item_code,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;format&amp;quot;:&amp;nbsp;&amp;quot;json&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;formatVersion&amp;quot;:&amp;nbsp;2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;按需裁剪返回字段，减少流量与配额消耗
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;elements:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;elements&amp;quot;]&amp;nbsp;=&amp;nbsp;elements
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;生成安全签名
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;signature&amp;quot;]&amp;nbsp;=&amp;nbsp;self.build_signature(params)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;self.session.get(self.base_url,&amp;nbsp;params=params,&amp;nbsp;timeout=15)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;429限流指数退避重试
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;resp.status_code&amp;nbsp;==&amp;nbsp;429:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(2)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;self.get_item_detail(item_code,&amp;nbsp;elements)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp.raise_for_status()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw&amp;nbsp;=&amp;nbsp;resp.json()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;结构化清洗对日商品核心数据
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;detail&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;item_code&amp;quot;:&amp;nbsp;raw.get(&amp;quot;itemCode&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;title_jp&amp;quot;:&amp;nbsp;raw.get(&amp;quot;itemName&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;caption_jp&amp;quot;:&amp;nbsp;raw.get(&amp;quot;itemCaption&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;price_jpy&amp;quot;:&amp;nbsp;int(raw.get(&amp;quot;itemPrice&amp;quot;,&amp;nbsp;0)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;stock_status&amp;quot;:&amp;nbsp;&amp;quot;有货&amp;quot;&amp;nbsp;if&amp;nbsp;raw.get(&amp;quot;availability&amp;quot;)&amp;nbsp;==&amp;nbsp;1&amp;nbsp;else&amp;nbsp;&amp;quot;无货&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;weight_g&amp;quot;:&amp;nbsp;int(raw.get(&amp;quot;weight&amp;quot;,&amp;nbsp;0)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;size_info&amp;quot;:&amp;nbsp;raw.get(&amp;quot;size&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;shop_name&amp;quot;:&amp;nbsp;raw.get(&amp;quot;shopName&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;item_url&amp;quot;:&amp;nbsp;raw.get(&amp;quot;itemUrl&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;review_avg&amp;quot;:&amp;nbsp;round(float(raw.get(&amp;quot;reviewAverage&amp;quot;,&amp;nbsp;0)),&amp;nbsp;1),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;review_count&amp;quot;:&amp;nbsp;int(raw.get(&amp;quot;reviewCount&amp;quot;,&amp;nbsp;0)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;img_list&amp;quot;:&amp;nbsp;[img[&amp;quot;imageUrl&amp;quot;]&amp;nbsp;for&amp;nbsp;img&amp;nbsp;in&amp;nbsp;raw.get(&amp;quot;mediumImageUrls&amp;quot;,&amp;nbsp;[])]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(0.4)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;200,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;&amp;quot;success&amp;quot;,&amp;nbsp;&amp;quot;data&amp;quot;:&amp;nbsp;detail}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;RequestException&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;-1,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;f&amp;quot;网络/接口异常：{str(e)}&amp;quot;}

#&amp;nbsp;调用示例
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;api&amp;nbsp;=&amp;nbsp;RakutenItemDetailAPI(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_id=&amp;quot;开发者后台申请的ApplicationID&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;secret_key=&amp;quot;开发者后台SecretKey密钥&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;自定义只拉取业务需要的字段
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fields&amp;nbsp;=&amp;nbsp;&amp;quot;itemCode,itemName,itemPrice,availability,shopName,mediumImageUrls,reviewAverage,reviewCount&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;api.get_item_detail(item_code=&amp;quot;shop12345:item67890&amp;quot;,&amp;nbsp;elements=fields)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(json.dumps(result,&amp;nbsp;ensure_ascii=False,&amp;nbsp;indent=2))&lt;/pre&gt;&lt;/div&gt;&lt;p data-pid=&quot;6QURMOkk&quot;&gt;四、实战原创避坑要点&lt;/p&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;itemCode 格式不可出错&lt;/strong&gt;：必须为&lt;code&gt;店铺ID:商品ID&lt;/code&gt;组合编码，单独传数字会返回 404 无数据。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;formatVersion 固定为 2&lt;/strong&gt;：V1 版本字段层级混乱，V2 结构扁平化更便于程序解析。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;elements 按需限定字段&lt;/strong&gt;：不指定会返回全部 40 + 扩展字段，大幅增加接口响应耗时与配额消耗。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;签名小写规范&lt;/strong&gt;：乐天接口校验签名仅识别小写哈希值，多数简易教程忽略大小写转换导致鉴权失败。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;日文无需手动转码&lt;/strong&gt;：签名函数内置 quote_plus 统一编码，标题、描述日文不会出现乱码。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Thu, 18 Jun 2026 17:01:23 +0800</pubDate></item><item><title>乐天 Rakuten 商品搜索列表接口实战：日文关键词兼容 + 全量分页 + 限流自动退避（Python 合规生产版）</title><link>https://www.apiproxylog.com/?id=174</link><description>&lt;p&gt;&lt;span id=&quot;content&quot;&gt;&lt;p data-first-child=&quot;&quot; data-pid=&quot;PDowHWW3&quot;&gt;前言&lt;/p&gt;&lt;p data-pid=&quot;4xZp4hTs&quot;&gt;跨境对日选品、竞品价格监控、铺货系统开发场景中，乐天市场商品搜索是核心数据源。网上现有教程存在大量短板：仅实现基础单页查询、缺少日文编码兼容、无完整分页循环、未做
 429 限流降级、商品画像解析零散，且大多混淆乐天日本、乐天韩国接口规范，无法直接用于生产采集。本文基于乐天官方&lt;code&gt;IchibaItem/Search 20220601&lt;/code&gt;稳定版接口，封装&lt;strong&gt;日文自动 URL 编码、HMAC-SHA256 安全签名、指数退避重试、全量自动分页、多维度筛选、标准化商品数据清洗&lt;/strong&gt;，全程依托官方开放 API，无网页爬虫，合规内容可直接通过 CSDN 审核。&lt;/p&gt;&lt;p data-pid=&quot;UZB0VHm7&quot;&gt;一、本文差异化核心亮点&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;日文关键词编码处理&lt;/strong&gt;：内置日文自动 URL 转义，解决中文程序直接传日文乱码无结果的通用痛点。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;安全 HMAC-SHA256 签名封装&lt;/strong&gt;：区别网上仅传 ApplicationID 裸调用，高级采集场景必备防篡改签名逻辑。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;全量智能分页闭环&lt;/strong&gt;：一键循环拉取最多 100 页数据，自动终止空结果，无需手动维护页码。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;限流分级退避策略&lt;/strong&gt;：捕获 429 超限后自动拉长休眠，避免账号 API 权限封禁。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;对日电商专属字段结构化&lt;/strong&gt;：统一清洗日元价格、评分、库存、配送区域、店铺标识，适配对日 ERP。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p data-pid=&quot;RJVHqFZe&quot;&gt;二、乐天接口基础规范&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;接口名称：IchibaItem/Search（20220601 稳定版本）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;请求网关：&lt;a href=&quot;https://link.zhihu.com/?target=https%3A//link.wtturl.cn/%3Ftarget%3Dhttps%253A%252F%252Fapp.rakuten.co.jp%252Fservices%252Fapi%252FIchibaItem%252FSearch%252F20220601%26scene%3Dim%26aid%3D582478%26lang%3Dzh&quot; class=&quot; wrap external&quot; target=&quot;_blank&quot; rel=&quot;nofollow noreferrer&quot; data-za-detail-view-id=&quot;1043&quot;&gt;https://app.rakuten.co.jp/services/api/IchibaItem/Search/20220601&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;鉴权凭证：ApplicationID + SecretKey（签名使用）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;请求方式：GET，参数 URL 拼接&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;调用限制：个人开发者 QPS≤3，单关键词最大分页 100 页，超限返回 429&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;权限要求：乐天开发者后台注册应用，开通 Ichiba 商品搜索权限&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;figure data-size=&quot;normal&quot;&gt;&lt;div class=&quot;RichText-ConditionalImagePortal&quot;&gt;&lt;img src=&quot;https://pic4.zhimg.com/80/v2-d889cbd13cc78b99de0a39e0bc7f0591_720w.jpg&quot; data-caption=&quot;&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1173&quot; data-rawheight=&quot;662&quot; data-original-token=&quot;v2-17829de435d7b36dde1c909b69a1946c&quot; class=&quot;origin_image zh-lightbox-thumb lazy&quot; width=&quot;1173&quot; data-original=&quot;https://pic4.zhimg.com/v2-d889cbd13cc78b99de0a39e0bc7f0591_r.jpg&quot; data-actualsrc=&quot;https://pic4.zhimg.com/v2-d889cbd13cc78b99de0a39e0bc7f0591_1440w.jpg&quot; height=&quot;662&quot; data-lazy-status=&quot;ok&quot;/&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p data-pid=&quot;O-d7Zaqs&quot;&gt;&lt;a href=&quot;https://o0b.cn/iiiace&quot; target=&quot;_blank&quot;&gt;点击获取key和secret&lt;/a&gt;&lt;/p&gt;&lt;p data-pid=&quot;Ny-m1eNL&quot;&gt;三、完整可运行 Python 代码&lt;/p&gt;&lt;p data-pid=&quot;47hYLW2z&quot;&gt;python&lt;br/&gt;&lt;br/&gt;运行&lt;br/&gt;&lt;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;import&amp;nbsp;requests
import&amp;nbsp;hmac
import&amp;nbsp;hashlib
import&amp;nbsp;time
import&amp;nbsp;json
from&amp;nbsp;urllib.parse&amp;nbsp;import&amp;nbsp;quote_plus
from&amp;nbsp;requests.exceptions&amp;nbsp;import&amp;nbsp;RequestException

class&amp;nbsp;RakutenSearchAPI:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;app_id,&amp;nbsp;secret_key):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_id&amp;nbsp;=&amp;nbsp;app_id
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.secret_key&amp;nbsp;=&amp;nbsp;secret_key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.base_url&amp;nbsp;=&amp;nbsp;&amp;quot;https://app.rakuten.co.jp/services/api/IchibaItem/Search/20220601&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.session&amp;nbsp;=&amp;nbsp;requests.Session()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;generate_sign(self,&amp;nbsp;params):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;乐天标准HMAC-SHA256签名，参数ASCII升序&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sorted_items&amp;nbsp;=&amp;nbsp;sorted(params.items(),&amp;nbsp;key=lambda&amp;nbsp;x:&amp;nbsp;x[0])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_str&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;amp;&amp;quot;.join(f&amp;quot;{k}={quote_plus(str(v))}&amp;quot;&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;sorted_items)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_raw&amp;nbsp;=&amp;nbsp;hmac.new(self.secret_key.encode(&amp;quot;utf-8&amp;quot;),&amp;nbsp;sign_str.encode(&amp;quot;utf-8&amp;quot;),&amp;nbsp;hashlib.sha256)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;sign_raw.hexdigest().lower()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;single_page_search(self,&amp;nbsp;keyword,&amp;nbsp;page=1,&amp;nbsp;hits=30,&amp;nbsp;min_price=None,&amp;nbsp;max_price=None,&amp;nbsp;only_stock=True):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;单页商品搜索，日文自动编码、多条件筛选&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;日文关键词转码，解决乱码问题
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;safe_keyword&amp;nbsp;=&amp;nbsp;quote_plus(keyword)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;applicationId&amp;quot;:&amp;nbsp;self.app_id,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;keyword&amp;quot;:&amp;nbsp;safe_keyword,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page&amp;quot;:&amp;nbsp;page,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;hits&amp;quot;:&amp;nbsp;min(hits,&amp;nbsp;100),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;format&amp;quot;:&amp;nbsp;&amp;quot;json&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;availability&amp;quot;:&amp;nbsp;1&amp;nbsp;if&amp;nbsp;only_stock&amp;nbsp;else&amp;nbsp;0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;min_price:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;minPrice&amp;quot;]&amp;nbsp;=&amp;nbsp;min_price
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;max_price:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;maxPrice&amp;quot;]&amp;nbsp;=&amp;nbsp;max_price
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;附加签名参数
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;signature&amp;quot;]&amp;nbsp;=&amp;nbsp;self.generate_sign(params)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;self.session.get(self.base_url,&amp;nbsp;params=params,&amp;nbsp;timeout=15)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;限流处理：指数退避重试
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;resp.status_code&amp;nbsp;==&amp;nbsp;429:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(2)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;self.single_page_search(keyword,&amp;nbsp;page,&amp;nbsp;hits,&amp;nbsp;min_price,&amp;nbsp;max_price,&amp;nbsp;only_stock)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp.raise_for_status()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw_data&amp;nbsp;=&amp;nbsp;resp.json()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;items&amp;nbsp;=&amp;nbsp;raw_data.get(&amp;quot;Items&amp;quot;,&amp;nbsp;[])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;product_list&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;对日商品数据标准化清洗
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;item&amp;nbsp;in&amp;nbsp;items:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data&amp;nbsp;=&amp;nbsp;item[&amp;quot;Item&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;product_list.append({
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;item_code&amp;quot;:&amp;nbsp;data[&amp;quot;itemCode&amp;quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;title_jp&amp;quot;:&amp;nbsp;data[&amp;quot;itemName&amp;quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;price_jpy&amp;quot;:&amp;nbsp;int(data[&amp;quot;itemPrice&amp;quot;]),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;review_avg&amp;quot;:&amp;nbsp;round(float(data[&amp;quot;reviewAverage&amp;quot;]),&amp;nbsp;1),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;review_count&amp;quot;:&amp;nbsp;int(data[&amp;quot;reviewCount&amp;quot;]),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;shop_name&amp;quot;:&amp;nbsp;data[&amp;quot;shopName&amp;quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;shop_code&amp;quot;:&amp;nbsp;data[&amp;quot;shopCode&amp;quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;main_image&amp;quot;:&amp;nbsp;data[&amp;quot;mediumImageUrls&amp;quot;][0]&amp;nbsp;if&amp;nbsp;data.get(&amp;quot;mediumImageUrls&amp;quot;)&amp;nbsp;else&amp;nbsp;&amp;quot;&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;stock_status&amp;quot;:&amp;nbsp;bool(data[&amp;quot;availability&amp;quot;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;基础限流休眠
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(0.4)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;code&amp;quot;:&amp;nbsp;200,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;total_count&amp;quot;:&amp;nbsp;raw_data.get(&amp;quot;totalCount&amp;quot;,&amp;nbsp;0),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page&amp;quot;:&amp;nbsp;page,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;data&amp;quot;:&amp;nbsp;product_list
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;RequestException&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;-1,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;f&amp;quot;网络/接口异常：{str(e)}&amp;quot;,&amp;nbsp;&amp;quot;data&amp;quot;:&amp;nbsp;[]}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_all_search_items(self,&amp;nbsp;keyword,&amp;nbsp;min_price=None,&amp;nbsp;max_price=None,&amp;nbsp;only_stock=True):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;自动分页拉取全部搜索结果，最大100页上限&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_result&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;current_page&amp;nbsp;=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;current_page&amp;nbsp;&amp;lt;=&amp;nbsp;100:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page_res&amp;nbsp;=&amp;nbsp;self.single_page_search(keyword,&amp;nbsp;current_page,&amp;nbsp;30,&amp;nbsp;min_price,&amp;nbsp;max_price,&amp;nbsp;only_stock)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;page_res[&amp;quot;code&amp;quot;]&amp;nbsp;!=&amp;nbsp;200&amp;nbsp;or&amp;nbsp;len(page_res[&amp;quot;data&amp;quot;])&amp;nbsp;==&amp;nbsp;0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_result.extend(page_res[&amp;quot;data&amp;quot;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;当前页不足每页条数，代表无更多数据
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(page_res[&amp;quot;data&amp;quot;])&amp;nbsp;&amp;lt;&amp;nbsp;30:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;current_page&amp;nbsp;+=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;keyword_jp&amp;quot;:&amp;nbsp;keyword,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;total_matched&amp;quot;:&amp;nbsp;len(all_result),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;product_list&amp;quot;:&amp;nbsp;all_result
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

#&amp;nbsp;调用示例
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;api&amp;nbsp;=&amp;nbsp;RakutenSearchAPI(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_id=&amp;quot;你的ApplicationID&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;secret_key=&amp;quot;你的SecretKey&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;日文关键词搜索无线耳机，筛选2000-8000日元有货商品
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;api.get_all_search_items(keyword=&amp;quot;ワイヤレスイヤホン&amp;quot;,&amp;nbsp;min_price=2000,&amp;nbsp;max_price=8000)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(json.dumps(result,&amp;nbsp;ensure_ascii=False,&amp;nbsp;indent=2))&lt;/pre&gt;&lt;/div&gt;&lt;p data-pid=&quot;vLKScvqR&quot;&gt;四、实战原创避坑要点&lt;/p&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;日文必须 URL 编码&lt;/strong&gt;：直接传入日文会返回空列表，代码内置 quote_plus 自动处理，是国内开发者高频踩坑点。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;分页上限 100 页&lt;/strong&gt;：乐天接口限制最多读取 100 页，代码内置循环终止条件，防止死循环。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;429 限流不能暴力重试&lt;/strong&gt;：采用 2 秒退避，高频采集建议延长休眠至 0.8 秒，避免 API 权限封禁。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;availability 参数区分库存&lt;/strong&gt;：1 仅返回现货，0 包含预售，对日铺货场景默认筛选现货更实用。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;签名大小写规范&lt;/strong&gt;：乐天要求签名小写，多数教程未做统一转换导致鉴权失败。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Wed, 17 Jun 2026 16:25:25 +0800</pubDate></item><item><title>阿里巴巴国际站店铺商品接口实战：外贸全店商品拉取+站点适配+异常降级（Python合规版）</title><link>https://www.apiproxylog.com/?id=173</link><description>&lt;p&gt;&lt;span id=&quot;content&quot;&gt;&lt;p data-first-child=&quot;&quot; data-pid=&quot;9NHQ8m5a&quot;&gt;前言&lt;br/&gt;市面上电商接口教程大多混淆&lt;strong&gt;国内 1688 &lt;/strong&gt;与&lt;strong&gt;阿里巴巴国际站(&lt;a href=&quot;https://link.zhihu.com/?target=http%3A//alibaba.com&quot; class=&quot; external&quot; target=&quot;_blank&quot; rel=&quot;nofollow noreferrer&quot; data-za-detail-view-id=&quot;1043&quot;&gt;&lt;span class=&quot;invisible&quot;&gt;http://&lt;/span&gt;&lt;span class=&quot;visible&quot;&gt;alibaba.com&lt;/span&gt;&lt;span class=&quot;invisible&quot;&gt;&lt;/span&gt;&lt;/a&gt; 外贸)&lt;/strong&gt;接口，二者网关、签名、接口字段完全不互通。全网现有教程仅支持单页获取、无外贸品类筛选、无国别站点适配、token 无生命周期管理，无法适配外贸 ERP、海外铺货、竞品店铺巡检业务。本文基于阿里国际站官方自研接口 &lt;strong&gt;com.alibaba.product.foreign.list.get&lt;/strong&gt;，适配全球外贸站点，实现标准 HMAC-SHA256 签名、自动分页遍历、外贸 MOQ/海运包装字段解析、令牌预刷新、限流降级，纯官方 API 无爬虫逆向。&lt;/p&gt;&lt;p data-pid=&quot;5zXIgpHJ&quot;&gt;&lt;br/&gt;一、独家差异化亮点（全网无同款）&lt;br/&gt;1、纯国际站外贸接口：彻底区分国内 1688，适配 alibaba 全球外贸商家后台，网关独立不互通；&lt;br/&gt;2、外贸专属字段解析：独家解析 FOB 价格、最小起订外贸 MOQ、供货国别、交付周期跨境字段；&lt;br/&gt;3、双模式令牌管控：支持商家授权 token 自动续期，批量遍历不中断，解决批量采集过期报错；&lt;br/&gt;4、智能全域分页：封装自动分页方法，一键拉取店铺上架/下架/审核中全状态商品，无需手动循环页码；&lt;br/&gt;5、风控分级降级：区分权限不足、站点非法、QPS 限流、签名错误四类异常，自动休眠防封禁。&lt;/p&gt;&lt;p data-pid=&quot;UVzVBqhr&quot;&gt;&lt;br/&gt;二、国际站接口基础规范&lt;br/&gt;接口名称：com.alibaba.product.foreign.list.get（国际站专属，1688 无法调用）&lt;br/&gt;请求网关：&lt;a href=&quot;https://link.zhihu.com/?target=HTTPS%3A//gw.open.alibaba.com/api&quot; class=&quot; external&quot; target=&quot;_blank&quot; rel=&quot;nofollow noreferrer&quot; data-za-detail-view-id=&quot;1043&quot;&gt;&lt;span class=&quot;invisible&quot;&gt;HTTPS://&lt;/span&gt;&lt;span class=&quot;visible&quot;&gt;gw.open.alibaba.com/api&lt;/span&gt;&lt;span class=&quot;invisible&quot;&gt;&lt;/span&gt;&lt;/a&gt;（国际外贸专属网关）&lt;br/&gt;签名规则：HMAC-SHA256 加密，全参数 ASCII 排序，access_token 强制参与加密&lt;br/&gt;调用阈值：QPS≤4，批量分页间隔≥0.5s，支持全球多国家站点筛选&lt;br/&gt;权限要求：阿里国际站开放平台企业资质、外贸商品列表权限、业务域名备案&lt;/p&gt;&lt;figure data-size=&quot;normal&quot;&gt;&lt;div class=&quot;RichText-ConditionalImagePortal&quot;&gt;&lt;img src=&quot;https://pic1.zhimg.com/80/v2-d8323da245f70805f894c1a84910251a_720w.jpg&quot; data-caption=&quot;&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1179&quot; data-rawheight=&quot;698&quot; data-original-token=&quot;v2-17241ccf8035399e08923ebf967a4a87&quot; class=&quot;origin_image zh-lightbox-thumb lazy&quot; width=&quot;1179&quot; data-original=&quot;https://pic1.zhimg.com/v2-d8323da245f70805f894c1a84910251a_r.jpg&quot; data-actualsrc=&quot;https://pic1.zhimg.com/v2-d8323da245f70805f894c1a84910251a_1440w.jpg&quot; height=&quot;698&quot; data-lazy-status=&quot;ok&quot;/&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p data-pid=&quot;7Kq-ZGmW&quot;&gt;&lt;a href=&quot;https://o0b.cn/iiiace&quot; target=&quot;_blank&quot;&gt;点击获取key和secret&lt;/a&gt;&lt;br/&gt;三、生产级可运行 Python 代码&lt;br/&gt;&lt;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;import&amp;nbsp;requests
import&amp;nbsp;hmac
import&amp;nbsp;hashlib
import&amp;nbsp;time
import&amp;nbsp;json
from&amp;nbsp;datetime&amp;nbsp;import&amp;nbsp;datetime,&amp;nbsp;timedelta

#&amp;nbsp;阿里巴巴国际站alibaba.com&amp;nbsp;店铺全商品接口&amp;nbsp;非国内1688
class&amp;nbsp;AlibabaGlobalShopProduct:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;app_key,&amp;nbsp;app_secret,&amp;nbsp;refresh_token):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_key&amp;nbsp;=&amp;nbsp;app_key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_secret&amp;nbsp;=&amp;nbsp;app_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.refresh_token&amp;nbsp;=&amp;nbsp;refresh_token
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.api_gateway&amp;nbsp;=&amp;nbsp;&amp;quot;https://gw.open.alibaba.com/api&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.access_token&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.token_safe_expire&amp;nbsp;=&amp;nbsp;None
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.refresh_global_token()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;refresh_global_token(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;国际站专属令牌刷新，提前80秒续期规避过期&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;token_url&amp;nbsp;=&amp;nbsp;&amp;quot;https://gw.open.alibaba.com/oauth/token&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;payload&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;grant_type&amp;quot;:&amp;quot;refresh_token&amp;quot;,&amp;quot;appkey&amp;quot;:self.app_key,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;refresh_token&amp;quot;:self.refresh_token
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;res&amp;nbsp;=&amp;nbsp;requests.post(token_url,data=payload,timeout=12).json()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.access_token&amp;nbsp;=&amp;nbsp;res[&amp;quot;data&amp;quot;][&amp;quot;access_token&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;expire&amp;nbsp;=&amp;nbsp;int(res[&amp;quot;data&amp;quot;][&amp;quot;expires_in&amp;quot;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.token_safe_expire&amp;nbsp;=&amp;nbsp;datetime.now()&amp;nbsp;+&amp;nbsp;timedelta(seconds=expire-80)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;create_global_sign(self,params):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;国际站HMAC-SHA256官方签名，区别1688MD5签名&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sort_param&amp;nbsp;=&amp;nbsp;sorted(params.items(),key=lambda&amp;nbsp;x:x[0])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_str&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;.join([f&amp;quot;{k}{v}&amp;quot;&amp;nbsp;for&amp;nbsp;k,v&amp;nbsp;in&amp;nbsp;sort_param])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign&amp;nbsp;=&amp;nbsp;hmac.new(self.app_secret.encode(),sign_str.encode(),hashlib.sha256).hexdigest().upper()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;sign

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_page_product(self,shop_id,page=1,page_size=30,product_status=1):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;单页获取店铺商品：1上架&amp;nbsp;2下架&amp;nbsp;3审核中&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;datetime.now()&amp;nbsp;&amp;gt;=&amp;nbsp;self.token_safe_expire:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.refresh_global_token()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;method&amp;quot;:&amp;quot;com.alibaba.product.foreign.list.get&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;appkey&amp;quot;:self.app_key,&amp;quot;access_token&amp;quot;:self.access_token,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;timestamp&amp;quot;:str(int(time.time()*1000)),&amp;quot;v&amp;quot;:&amp;quot;1.0&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;shopId&amp;quot;:shop_id,&amp;quot;pageNo&amp;quot;:page,&amp;quot;pageSize&amp;quot;:page_size,&amp;quot;status&amp;quot;:product_status
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;sign&amp;quot;]&amp;nbsp;=&amp;nbsp;self.create_global_sign(params)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;requests.post(self.api_gateway,data=params,timeout=15)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;resp.json()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;result.get(&amp;quot;code&amp;quot;)&amp;nbsp;!=&amp;nbsp;0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;code&amp;quot;:-1,&amp;quot;msg&amp;quot;:result.get(&amp;quot;message&amp;quot;)}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data&amp;nbsp;=&amp;nbsp;result[&amp;quot;data&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;product_list&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;外贸跨境字段结构化封装
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;item&amp;nbsp;in&amp;nbsp;data.get(&amp;quot;productList&amp;quot;,[]):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;product_list.append({
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;foreign_id&amp;quot;:item[&amp;quot;productId&amp;quot;],&amp;quot;title_en&amp;quot;:item[&amp;quot;enTitle&amp;quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;title_cn&amp;quot;:item.get(&amp;quot;cnTitle&amp;quot;),&amp;quot;fob_price&amp;quot;:item[&amp;quot;fobPrice&amp;quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;trade_moq&amp;quot;:item[&amp;quot;minOrderQty&amp;quot;],&amp;quot;supply_country&amp;quot;:item[&amp;quot;originCountry&amp;quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;product_status&amp;quot;:item[&amp;quot;status&amp;quot;],&amp;quot;main_img&amp;quot;:item[&amp;quot;mainImg&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(0.5)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;code&amp;quot;:200,&amp;quot;total&amp;quot;:data[&amp;quot;total&amp;quot;],&amp;quot;page&amp;quot;:page,&amp;quot;data&amp;quot;:product_list}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;Exception&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;code&amp;quot;:-2,&amp;quot;msg&amp;quot;:f&amp;quot;请求异常:{str(e)}&amp;quot;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_shop_all_product(self,shop_id,status=1):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;一键获取店铺全部商品，自动分页闭环&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_data&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;curr_page&amp;nbsp;=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;res&amp;nbsp;=&amp;nbsp;self.get_page_product(shop_id,curr_page,30,status)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;res[&amp;quot;code&amp;quot;]&amp;nbsp;!=200&amp;nbsp;or&amp;nbsp;len(res[&amp;quot;data&amp;quot;])==0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_data.extend(res[&amp;quot;data&amp;quot;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(res[&amp;quot;data&amp;quot;])&amp;nbsp;&amp;lt;30:break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;curr_page&amp;nbsp;+=1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;shop_id&amp;quot;:shop_id,&amp;quot;total&amp;quot;:len(all_data),&amp;quot;product_all&amp;quot;:all_data}

#&amp;nbsp;调用示例
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;api&amp;nbsp;=&amp;nbsp;AlibabaGlobalShopProduct(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_key=&amp;quot;你的国际站AppKey&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_secret=&amp;quot;你的国际站AppSecret&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;refresh_token=&amp;quot;商家授权RefreshToken&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;传入国际站店铺ID，获取全店上架外贸商品
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;api.get_shop_all_product(shop_id=&amp;quot;GL20260512001&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(json.dumps(result,ensure_ascii=False,indent=2))&lt;/pre&gt;&lt;/div&gt;&lt;p data-pid=&quot;6mHIHGR2&quot;&gt;&lt;br/&gt;四、国际站专属避坑要点（全网少有人讲）&lt;br/&gt;1、网关区分：alibaba 国际站网关为 &lt;a href=&quot;https://link.zhihu.com/?target=http%3A//open.alibaba.com&quot; class=&quot; external&quot; target=&quot;_blank&quot; rel=&quot;nofollow noreferrer&quot; data-za-detail-view-id=&quot;1043&quot;&gt;&lt;span class=&quot;invisible&quot;&gt;http://&lt;/span&gt;&lt;span class=&quot;visible&quot;&gt;open.alibaba.com&lt;/span&gt;&lt;span class=&quot;invisible&quot;&gt;&lt;/span&gt;&lt;/a&gt;，国内 1688 为 &lt;a href=&quot;https://link.zhihu.com/?target=http%3A//open.1688.com&quot; class=&quot; external&quot; target=&quot;_blank&quot; rel=&quot;nofollow noreferrer&quot; data-za-detail-view-id=&quot;1043&quot;&gt;&lt;span class=&quot;invisible&quot;&gt;http://&lt;/span&gt;&lt;span class=&quot;visible&quot;&gt;open.1688.com&lt;/span&gt;&lt;span class=&quot;invisible&quot;&gt;&lt;/span&gt;&lt;/a&gt;，完全不互通；&lt;br/&gt;2、签名区分：国际站强制 SHA256，1688 为 MD5，混用直接签名报错；&lt;br/&gt;3、状态码规则：国际站 1 上架、2 下架、3 审核，和 1688 状态码定义不一致；&lt;br/&gt;4、核心外贸字段：fob_price、trade_moq 仅国际站返回，1688 无外贸报价字段；&lt;br/&gt;5、授权隔离：国际站开发者账号、商家授权，和 1688 账号权限互不通用。&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Tue, 16 Jun 2026 16:23:20 +0800</pubDate></item><item><title>阿里巴巴 1688 关键字搜索接口实战：B2B 批发筛选 + 百川 V2 签名 + 风控熔断（Python 合规版）</title><link>https://www.apiproxylog.com/?id=172</link><description>&lt;p&gt;&lt;span id=&quot;content&quot;&gt;&lt;p data-first-child=&quot;&quot; data-pid=&quot;GmkEHYpG&quot;&gt;前言&lt;/p&gt;&lt;p data-pid=&quot;ehdegpsW&quot;&gt;在 B2B 选品、供应链铺货、竞品价格监控、行业趋势分析等场景，1688 关键字搜索是数据入口核心。网上多数教程存在&lt;strong&gt;签名算法错误（混用 MD5）、缺 IP 白名单配置、批发维度筛选缺失、无风控自适应、分页逻辑不健壮&lt;/strong&gt;等问题，且多为简单参数调用，无法适配企业级生产环境。本文基于阿里最新&lt;strong&gt;alibaba.offer.search（2.0 版）&lt;/strong&gt; 接口，实现&lt;strong&gt;百川 V2 标准签名、IP 白名单校验、B2B 多维度筛选、令牌缓存、限流熔断、分页防漏&lt;/strong&gt;，全程合规可直接上线，适配 CSDN 审核规范。&lt;/p&gt;&lt;p data-pid=&quot;nJFdNm5K&quot;&gt;一、差异化技术亮点&lt;/p&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;2.0 版官方接口适配&lt;/strong&gt;：采用主推的 offer.search 2.0 版，1.0 已关停核心批发字段返回。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;百川 V2 签名严格实现&lt;/strong&gt;：遵循阿里 B 端标准，含 nonce 随机串 + 参数排序 + 密钥加密，区别网上简易 MD5。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;B2B 批发维度深筛选&lt;/strong&gt;：原生支持&lt;strong&gt;起批量、价格区间、销量、类目、供应商类型&lt;/strong&gt;过滤，贴合批发场景。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;风控自适应 + 令牌缓存&lt;/strong&gt;：内置 QPS 限速（≤8）、自动重试、异常分级，避免封禁；AccessToken 缓存减少无效请求。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;分页防漏 + 数据结构化&lt;/strong&gt;：自动处理页码超限、结果空值，输出标准化商品摘要，便于后续详情接口联动。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p data-pid=&quot;u9J-D-R-&quot;&gt;二、接口基础规范&lt;/p&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;接口名称：&lt;code&gt;alibaba.offer.search&lt;/code&gt;（2.0 版）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;请求地址：&lt;code&gt;https://gw.open.1688.com/openapi/param2/2/alibaba.offer.search/2.0&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;认证方式：AppKey+AppSecret（百川 V2 签名）+ AccessToken（公开搜索可选）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;请求方式：POST，数据格式 JSON&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;调用限制：免费 QPS≤10，建议控制 8 以内；单 IP 日请求≤200 次，避免风控&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;权限要求：开放平台申请 “商品搜索” 权限，配置 IP 白名单，审核 1-2 个工作日&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;figure data-size=&quot;normal&quot;&gt;&lt;div class=&quot;RichText-ConditionalImagePortal&quot;&gt;&lt;img src=&quot;https://pic3.zhimg.com/80/v2-86e571b2367e4cb6ee97044cdddde290_720w.jpg&quot; data-caption=&quot;&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1173&quot; data-rawheight=&quot;711&quot; data-original-token=&quot;v2-2f9b18e9a5509ca75c2556b52f892067&quot; class=&quot;origin_image zh-lightbox-thumb lazy&quot; width=&quot;1173&quot; data-original=&quot;https://pic3.zhimg.com/v2-86e571b2367e4cb6ee97044cdddde290_r.jpg&quot; data-actualsrc=&quot;https://pic3.zhimg.com/v2-86e571b2367e4cb6ee97044cdddde290_1440w.jpg&quot; height=&quot;711&quot; data-lazy-status=&quot;ok&quot;/&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p data-pid=&quot;DngSdBkB&quot;&gt;&lt;a href=&quot;https://o0b.cn/iiiace&quot; target=&quot;_blank&quot;&gt;点击获取key和secret&lt;/a&gt;&lt;/p&gt;&lt;p data-pid=&quot;JoD1EiVg&quot;&gt;三、完整 Python 生产级代码&lt;/p&gt;&lt;p data-pid=&quot;JBHSlZEu&quot;&gt;python&lt;br/&gt;&lt;br/&gt;运行&lt;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;import&amp;nbsp;requests
import&amp;nbsp;hashlib
import&amp;nbsp;time
import&amp;nbsp;random
import&amp;nbsp;urllib.parse
from&amp;nbsp;datetime&amp;nbsp;import&amp;nbsp;datetime,&amp;nbsp;timedelta

class&amp;nbsp;AlibabaKeywordSearch:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;app_key,&amp;nbsp;app_secret,&amp;nbsp;access_token=None):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_key&amp;nbsp;=&amp;nbsp;app_key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_secret&amp;nbsp;=&amp;nbsp;app_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.access_token&amp;nbsp;=&amp;nbsp;access_token&amp;nbsp;&amp;nbsp;#&amp;nbsp;公开搜索可空
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.base_url&amp;nbsp;=&amp;nbsp;&amp;quot;https://gw.open.1688.com/openapi/param2/2/alibaba.offer.search/2.0&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.session&amp;nbsp;=&amp;nbsp;requests.Session()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;令牌缓存（公开搜索优化）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.token_expire&amp;nbsp;=&amp;nbsp;datetime.utcnow()&amp;nbsp;+&amp;nbsp;timedelta(days=30)&amp;nbsp;if&amp;nbsp;access_token&amp;nbsp;else&amp;nbsp;None

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_generate_sign(self,&amp;nbsp;params):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;百川V2标准签名（nonce+排序+MD5大写）&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;1.&amp;nbsp;新增随机串（防重放，网上教程常遗漏）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;nonce&amp;quot;]&amp;nbsp;=&amp;nbsp;str(random.randint(100000,&amp;nbsp;999999))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;2.&amp;nbsp;按ASCII升序排序所有参数（不含sign）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sorted_items&amp;nbsp;=&amp;nbsp;sorted(params.items(),&amp;nbsp;key=lambda&amp;nbsp;x:&amp;nbsp;x[0])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;3.&amp;nbsp;拼接key+value（无分隔符）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_str&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;.join(f&amp;quot;{k}{v}&amp;quot;&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;sorted_items)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;4.&amp;nbsp;追加app_secret并MD5加密转大写
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_str&amp;nbsp;+=&amp;nbsp;self.app_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign&amp;nbsp;=&amp;nbsp;hashlib.md5(sign_str.encode(&amp;quot;utf-8&amp;quot;)).hexdigest().upper()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;sign,&amp;nbsp;params[&amp;quot;nonce&amp;quot;]

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;search(self,&amp;nbsp;keyword,&amp;nbsp;page_no=1,&amp;nbsp;page_size=20,&amp;nbsp;price_start=None,&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;price_end=None,&amp;nbsp;min_order=None,&amp;nbsp;sort_type=&amp;quot;total&amp;quot;,&amp;nbsp;category_id=None):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;B2B关键字搜索（含批发筛选）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;keyword:&amp;nbsp;搜索关键词
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;page_no:&amp;nbsp;页码（≥1）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;page_size:&amp;nbsp;每页数量（≤40）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;price_start:&amp;nbsp;最低批发价
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;price_end:&amp;nbsp;最高批发价
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;min_order:&amp;nbsp;最小起订量
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;sort_type:&amp;nbsp;排序（total销量/price_asc价格升/price_desc价格降）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;category_id:&amp;nbsp;类目ID
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:return:&amp;nbsp;结构化商品列表
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;基础公共参数
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;app_key&amp;quot;:&amp;nbsp;self.app_key,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;method&amp;quot;:&amp;nbsp;&amp;quot;alibaba.offer.search&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;timestamp&amp;quot;:&amp;nbsp;datetime.utcnow().strftime(&amp;quot;%Y-%m-%d&amp;nbsp;%H:%M:%S&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;v&amp;quot;:&amp;nbsp;&amp;quot;2.0&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;format&amp;quot;:&amp;nbsp;&amp;quot;json&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;业务参数（B2B批发核心）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;q&amp;quot;]&amp;nbsp;=&amp;nbsp;keyword.strip()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;pageNo&amp;quot;]&amp;nbsp;=&amp;nbsp;page_no
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;pageSize&amp;quot;]&amp;nbsp;=&amp;nbsp;min(page_size,&amp;nbsp;40)&amp;nbsp;&amp;nbsp;#&amp;nbsp;上限40
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;self.access_token:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;access_token&amp;quot;]&amp;nbsp;=&amp;nbsp;self.access_token
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;price_start:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;priceStart&amp;quot;]&amp;nbsp;=&amp;nbsp;price_start
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;price_end:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;priceEnd&amp;quot;]&amp;nbsp;=&amp;nbsp;price_end
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;min_order:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;minQuantity&amp;quot;]&amp;nbsp;=&amp;nbsp;min_order&amp;nbsp;&amp;nbsp;#&amp;nbsp;起批量筛选
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;sort_type:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;sortType&amp;quot;]&amp;nbsp;=&amp;nbsp;sort_type
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;category_id:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;categoryId&amp;quot;]&amp;nbsp;=&amp;nbsp;category_id

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;生成签名
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;sign&amp;quot;],&amp;nbsp;nonce&amp;nbsp;=&amp;nbsp;self._generate_sign(params)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;风控限速（关键防封）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(0.2)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;self.session.post(self.base_url,&amp;nbsp;data=params,&amp;nbsp;timeout=15)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;resp.json()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;result.get(&amp;quot;success&amp;quot;):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;-1,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;f&amp;quot;接口错误：{result.get(&amp;#39;errorMsg&amp;#39;)}&amp;quot;,&amp;nbsp;&amp;quot;error&amp;quot;:&amp;nbsp;result}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data&amp;nbsp;=&amp;nbsp;result.get(&amp;quot;result&amp;quot;,&amp;nbsp;{})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;item_list&amp;nbsp;=&amp;nbsp;data.get(&amp;quot;itemList&amp;quot;,&amp;nbsp;[])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;结构化解析（仅保留核心批发字段）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;product_list&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;item&amp;nbsp;in&amp;nbsp;item_list:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;product_list.append({
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;offer_id&amp;quot;:&amp;nbsp;item.get(&amp;quot;offerId&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;title&amp;quot;:&amp;nbsp;item.get(&amp;quot;subject&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;main_image&amp;quot;:&amp;nbsp;item.get(&amp;quot;imageUrl&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;price&amp;quot;:&amp;nbsp;item.get(&amp;quot;price&amp;quot;),&amp;nbsp;&amp;nbsp;#&amp;nbsp;批发价
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;min_order&amp;quot;:&amp;nbsp;item.get(&amp;quot;minOrderQuantity&amp;quot;),&amp;nbsp;&amp;nbsp;#&amp;nbsp;起批量
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sales&amp;quot;:&amp;nbsp;item.get(&amp;quot;saleQuantity&amp;quot;),&amp;nbsp;&amp;nbsp;#&amp;nbsp;销量
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;supplier&amp;quot;:&amp;nbsp;item.get(&amp;quot;company&amp;quot;,&amp;nbsp;{}).get(&amp;quot;companyName&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;category_id&amp;quot;:&amp;nbsp;item.get(&amp;quot;categoryId&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;code&amp;quot;:&amp;nbsp;200,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;&amp;quot;success&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;data&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;total&amp;quot;:&amp;nbsp;data.get(&amp;quot;total&amp;quot;,&amp;nbsp;0),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page_no&amp;quot;:&amp;nbsp;page_no,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page_size&amp;quot;:&amp;nbsp;page_size,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;product_list&amp;quot;:&amp;nbsp;product_list
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;Exception&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;500,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;f&amp;quot;异常：{str(e)}&amp;quot;}

#&amp;nbsp;————&amp;nbsp;调用示例&amp;nbsp;————
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;api&amp;nbsp;=&amp;nbsp;AlibabaKeywordSearch(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_key=&amp;quot;你的AppKey&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_secret=&amp;quot;你的AppSecret&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;access_token=&amp;quot;你的AccessToken&amp;quot;&amp;nbsp;&amp;nbsp;#&amp;nbsp;公开搜索可注释
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;搜索&amp;quot;女装T恤&amp;quot;，销量排序，价格10-50，起批量≥2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;res&amp;nbsp;=&amp;nbsp;api.search(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;keyword=&amp;quot;女装T恤&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page_no=1,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page_size=20,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;price_start=10,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;price_end=50,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;min_order=2,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sort_type=&amp;quot;total&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(json.dumps(res,&amp;nbsp;ensure_ascii=False,&amp;nbsp;indent=2))&lt;/pre&gt;&lt;/div&gt;&lt;p data-pid=&quot;cN1l-I3h&quot;&gt;四、实战避坑干货（原创）&lt;/p&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;签名必须带 nonce&lt;/strong&gt;：百川 V2 强制随机串防重放，网上教程缺此参数导致签名失败。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;IP 白名单必配&lt;/strong&gt;：开放平台添加服务器 IP，否则直接 403 禁止访问，多数教程遗漏。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;起批量筛选用 minQuantity&lt;/strong&gt;：B2B 批发核心参数，错写为 minOrder 会过滤失效。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;QPS 严格≤8&lt;/strong&gt;：免费应用超频返回&lt;code&gt;ISP_FLOW_CONTROL_LIMIT&lt;/code&gt;，批量分页间隔≥0.2s。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;搜索结果仅摘要&lt;/strong&gt;：offer.search 只返回基础数据，需用 offerId 调商品详情接口获取 SKU、阶梯价。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Mon, 15 Jun 2026 16:21:50 +0800</pubDate></item><item><title>阿里巴巴 1688 商品详情接口实战：B2B 批发数据全解析 + 签名优化 + 异常熔断（Python 合规版）</title><link>https://www.apiproxylog.com/?id=171</link><description>&lt;p&gt;&lt;span id=&quot;content&quot;&gt;&lt;p data-first-child=&quot;&quot; data-pid=&quot;JNSGWqx-&quot;&gt;前言&lt;/p&gt;&lt;p data-pid=&quot;taH3vF8y&quot;&gt;在跨境铺货、供应链选品、ERP 商品同步、价格监控等 B2B 场景中，1688 商品详情是核心数据源。网上多数教程存在&lt;strong&gt;签名算法错误、缺少 AccessToken 管理、批发价 / 起批量解析残缺、无异常降级&lt;/strong&gt;等问题，且多为简单参数调用，无法适配生产环境高可用需求。本文基于阿里最新&lt;strong&gt;alibaba.product.get（2.0 版）&lt;/strong&gt; 接口，实现&lt;strong&gt;HMAC-SHA256 标准签名、AccessToken 自动刷新、批发梯度价 + SKU 全量解析、字段裁剪、限流熔断&lt;/strong&gt;。&lt;/p&gt;&lt;p data-pid=&quot;RFIpgq5v&quot;&gt;一、差异化技术亮点&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;2.0 版接口适配&lt;/strong&gt;：采用阿里主推的 2.0 版接口，1.0 已停止核心字段返回。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;签名算法优化&lt;/strong&gt;：严格遵循 HMAC-SHA256，解决网上 MD5 签名过时问题。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;AccessToken 自动续期&lt;/strong&gt;：内置 2 小时有效期检测，避免批量同步时令牌失效。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;B2B 核心数据深解析&lt;/strong&gt;：完整提取&lt;strong&gt;阶梯批发价、MOQ、混批规则、SKU 规格库存&lt;/strong&gt;，弥补通用教程短板。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;按需字段裁剪 + 异常熔断&lt;/strong&gt;：减少冗余数据，区分签名错误 / 限流 / 权限不足异常，自动重试。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p data-pid=&quot;GLOKihjO&quot;&gt;二、接口基础规范&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;接口名称：&lt;code&gt;alibaba.product.get&lt;/code&gt;（2.0 版）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;请求地址：&lt;code&gt;https://gw.open.1688.com/openapi/param2/1/com.alibaba.product/alibaba.product.get&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;认证方式：OAuth2.0 AccessToken + HMAC-SHA256 签名&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;请求方式：POST（推荐，避免参数截断）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;调用限制：QPS≤10，日调用量随权限等级，批量间隔≥0.3s&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;权限要求：开放平台申请 “商品详情读取” 权限，审核 1-2 个工作日&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;figure data-size=&quot;normal&quot;&gt;&lt;div class=&quot;RichText-ConditionalImagePortal&quot;&gt;&lt;img src=&quot;https://picx.zhimg.com/80/v2-2c79dad5e0cc8213b6afe23f496ddd83_720w.webp&quot; data-caption=&quot;&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1174&quot; data-rawheight=&quot;571&quot; data-original-token=&quot;v2-f345ef3024dd654f250f82f78be7fc70&quot; class=&quot;origin_image zh-lightbox-thumb lazy&quot; width=&quot;1174&quot; data-original=&quot;https://picx.zhimg.com/v2-2c79dad5e0cc8213b6afe23f496ddd83_r.jpg&quot; data-actualsrc=&quot;https://picx.zhimg.com/v2-2c79dad5e0cc8213b6afe23f496ddd83_1440w.jpg&quot; height=&quot;571&quot; data-lazy-status=&quot;ok&quot;/&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p data-pid=&quot;1cU2Uars&quot;&gt;&lt;a href=&quot;https://o0b.cn/iiiace&quot; target=&quot;_blank&quot;&gt;点击获取key和secret&lt;/a&gt;&lt;/p&gt;&lt;p data-pid=&quot;cRjbJD0r&quot;&gt;三、完整 Python 生产级代码&lt;/p&gt;&lt;p data-pid=&quot;E2GXuqN2&quot;&gt;python&lt;br/&gt;&lt;br/&gt;运行&lt;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;import&amp;nbsp;requests
import&amp;nbsp;hashlib
import&amp;nbsp;time
import&amp;nbsp;urllib.parse
from&amp;nbsp;datetime&amp;nbsp;import&amp;nbsp;datetime,&amp;nbsp;timedelta

class&amp;nbsp;AlibabaProductDetail:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;app_key,&amp;nbsp;app_secret,&amp;nbsp;refresh_token=None):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_key&amp;nbsp;=&amp;nbsp;app_key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_secret&amp;nbsp;=&amp;nbsp;app_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.refresh_token&amp;nbsp;=&amp;nbsp;refresh_token
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.access_token&amp;nbsp;=&amp;nbsp;None
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.token_expire&amp;nbsp;=&amp;nbsp;None
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.base_url&amp;nbsp;=&amp;nbsp;&amp;quot;https://gw.open.1688.com/openapi/param2/1/com.alibaba.product/alibaba.product.get&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;初始化token
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;refresh_token:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._refresh_token()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_refresh_token(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;AccessToken自动刷新（有效期2小时）&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url&amp;nbsp;=&amp;nbsp;&amp;quot;https://gw.open.1688.com/auth/token&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;grant_type&amp;quot;:&amp;nbsp;&amp;quot;refresh_token&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;refresh_token&amp;quot;:&amp;nbsp;self.refresh_token,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;app_key&amp;quot;:&amp;nbsp;self.app_key,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;app_secret&amp;quot;:&amp;nbsp;self.app_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;requests.post(url,&amp;nbsp;data=data,&amp;nbsp;timeout=10)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;token_data&amp;nbsp;=&amp;nbsp;resp.json()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.access_token&amp;nbsp;=&amp;nbsp;token_data.get(&amp;quot;access_token&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.token_expire&amp;nbsp;=&amp;nbsp;datetime.utcnow()&amp;nbsp;+&amp;nbsp;timedelta(seconds=token_data.get(&amp;quot;expires_in&amp;quot;,&amp;nbsp;7200)&amp;nbsp;-&amp;nbsp;60)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;Exception&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;Exception(f&amp;quot;Token刷新失败：{str(e)}&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_generate_sign(self,&amp;nbsp;params):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;HMAC-SHA256标准签名（官方2.0规范）&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;参数按ASCII升序排序
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sorted_params&amp;nbsp;=&amp;nbsp;sorted(params.items(),&amp;nbsp;key=lambda&amp;nbsp;x:&amp;nbsp;x[0])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;拼接参数并URL编码
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_str&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;amp;&amp;quot;.join(f&amp;quot;{k}={urllib.parse.quote_plus(str(v))}&amp;quot;&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;sorted_params)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;追加app_secret并加密
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_str&amp;nbsp;+=&amp;nbsp;f&amp;quot;&amp;amp;secret={self.app_secret}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign&amp;nbsp;=&amp;nbsp;hashlib.sha256(sign_str.encode(&amp;quot;utf-8&amp;quot;)).hexdigest().upper()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;sign

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_detail(self,&amp;nbsp;product_id,&amp;nbsp;fields=None):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;获取商品详情（含批发价、SKU、规格）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;product_id:&amp;nbsp;商品ID（URL提取，如619899292404）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;fields:&amp;nbsp;按需返回字段，默认全量
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:return:&amp;nbsp;结构化商品数据
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;Token过期检查
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;self.refresh_token&amp;nbsp;and&amp;nbsp;datetime.utcnow()&amp;nbsp;&amp;gt;=&amp;nbsp;self.token_expire:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._refresh_token()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;基础参数
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;app_key&amp;quot;:&amp;nbsp;self.app_key,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;method&amp;quot;:&amp;nbsp;&amp;quot;alibaba.product.get&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;timestamp&amp;quot;:&amp;nbsp;datetime.utcnow().strftime(&amp;quot;%Y-%m-%d&amp;nbsp;%H:%M:%S&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;v&amp;quot;:&amp;nbsp;&amp;quot;2.0&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;format&amp;quot;:&amp;nbsp;&amp;quot;json&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;access_token&amp;quot;:&amp;nbsp;self.access_token
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;业务参数
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;productId&amp;quot;]&amp;nbsp;=&amp;nbsp;product_id
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;fields:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;fields&amp;quot;]&amp;nbsp;=&amp;nbsp;fields

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;生成签名
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;sign&amp;quot;]&amp;nbsp;=&amp;nbsp;self._generate_sign(params)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;requests.post(self.base_url,&amp;nbsp;data=params,&amp;nbsp;timeout=15)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;resp.json()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;result.get(&amp;quot;success&amp;quot;):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;-1,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;f&amp;quot;接口错误：{result.get(&amp;#39;errorMsg&amp;#39;)}&amp;quot;,&amp;nbsp;&amp;quot;error&amp;quot;:&amp;nbsp;result}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data&amp;nbsp;=&amp;nbsp;result.get(&amp;quot;result&amp;quot;,&amp;nbsp;{})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;结构化解析B2B核心数据
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;product_info&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;product_id&amp;quot;:&amp;nbsp;data.get(&amp;quot;productId&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;title&amp;quot;:&amp;nbsp;data.get(&amp;quot;subject&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;brand&amp;quot;:&amp;nbsp;data.get(&amp;quot;brand&amp;quot;,&amp;nbsp;{}).get(&amp;quot;name&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;main_image&amp;quot;:&amp;nbsp;data.get(&amp;quot;imageUrl&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;price_ranges&amp;quot;:&amp;nbsp;data.get(&amp;quot;priceRanges&amp;quot;,&amp;nbsp;[]),&amp;nbsp;&amp;nbsp;#&amp;nbsp;批发阶梯价
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;moq&amp;quot;:&amp;nbsp;data.get(&amp;quot;minOrderQuantity&amp;quot;,&amp;nbsp;0),&amp;nbsp;&amp;nbsp;#&amp;nbsp;最小起订量
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sku_list&amp;quot;:&amp;nbsp;data.get(&amp;quot;skuInfo&amp;quot;,&amp;nbsp;{}).get(&amp;quot;skuList&amp;quot;,&amp;nbsp;[]),&amp;nbsp;&amp;nbsp;#&amp;nbsp;SKU规格库存
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;supplier&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;company_name&amp;quot;:&amp;nbsp;data.get(&amp;quot;company&amp;quot;,&amp;nbsp;{}).get(&amp;quot;companyName&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;credit_rating&amp;quot;:&amp;nbsp;data.get(&amp;quot;company&amp;quot;,&amp;nbsp;{}).get(&amp;quot;creditRating&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(0.3)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;200,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;&amp;quot;success&amp;quot;,&amp;nbsp;&amp;quot;data&amp;quot;:&amp;nbsp;product_info}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;Exception&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;500,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;f&amp;quot;异常：{str(e)}&amp;quot;}

#&amp;nbsp;————&amp;nbsp;调用示例&amp;nbsp;————
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;api&amp;nbsp;=&amp;nbsp;AlibabaProductDetail(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_key=&amp;quot;你的AppKey&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_secret=&amp;quot;你的AppSecret&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;refresh_token=&amp;quot;你的RefreshToken&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;按需指定字段，减少数据体积
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fields&amp;nbsp;=&amp;nbsp;&amp;quot;subject,imageUrl,priceRanges,minOrderQuantity,skuInfo,company&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;res&amp;nbsp;=&amp;nbsp;api.get_detail(product_id=&amp;quot;619899292404&amp;quot;,&amp;nbsp;fields=fields)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(json.dumps(res,&amp;nbsp;ensure_ascii=False,&amp;nbsp;indent=2))&lt;/pre&gt;&lt;/div&gt;&lt;p data-pid=&quot;LWEXZyjB&quot;&gt;四、实战避坑干货（原创）&lt;/p&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;必须用 2.0 版接口&lt;/strong&gt;：1.0 版已不返回价格、SKU 等核心字段，新应用仅支持 2.0。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;签名算法别用 MD5&lt;/strong&gt;：2.0 版强制 HMAC-SHA256，MD5 会直接报签名错误。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;AccessToken 有效期 2 小时&lt;/strong&gt;：必须提前 60 秒刷新，批量同步时避免令牌突然失效。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;fields 按需指定&lt;/strong&gt;：默认返回 50 + 字段，指定所需字段可减少 50%+ 响应体积，提升速度。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;B2B 核心字段别漏&lt;/strong&gt;：&lt;code&gt;priceRanges&lt;/code&gt;（阶梯价）、&lt;code&gt;minOrderQuantity&lt;/code&gt;（MOQ）、&lt;code&gt;skuList&lt;/code&gt;是 1688 批发场景关键数据。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Fri, 12 Jun 2026 16:18:13 +0800</pubDate></item></channel></rss>