<?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://apiproxylog.com/</link><description>Good Luck To You!</description><item><title>当当开放平台单品详情接口实战：首尾 MD5 加密签名 + 图书全维度信息解析 + 多级异常熔断（Python 生产合规版）</title><link>https://apiproxylog.com/?id=195</link><description>&lt;p&gt;&lt;span id=&quot;content&quot;&gt;&lt;p data-first-child=&quot;&quot; data-pid=&quot;pW_Qsq9F&quot;&gt;前言&lt;/p&gt;&lt;p data-pid=&quot;MwLITdV1&quot;&gt;图书进销存
 ERP、线上书店比价系统、文教素材库、出版物价格监控项目开发过程中，通过商品 ID 
拉取完整图书详情是基础核心模块。目前网络流通的对接代码大多存在明显缺陷：照搬通用电商签名逻辑导致鉴权失败、缺少图书行业 
ISBN、装帧、目录、作者简介等专属字段、无自动限流重试机制、数据未做标准化清洗，仅能实现基础查询无法直接投入线上使用。本文基于当当开放平台稳定单品详情接口，完整落地平台独有的首尾拼接
 MD5 签名规则，封装出版物专属信息解析、429 限流自动退避、参数前置校验、多级异常捕获，全程依托官方开放 API 
开发，无网页抓包逆向逻辑，内容符合公开技术专栏发布标准。&lt;/p&gt;&lt;p data-pid=&quot;xLZePru3&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;平台专属首尾 MD5 加密完整实现&lt;/strong&gt;&lt;br/&gt; 区别通用电商单侧拼接密钥写法，当当要求密钥前后包裹排序参数加密，全网教程极少完整复现该规则，解决绝大多数 401 签名校验失败问题。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;出版物完整专属字段结构化解析&lt;/strong&gt;&lt;br/&gt; 单独提取 ISBN、开本、装帧、译者、目录摘要、出版年份、套装标识等图书独有字段，普通零售商品接口不存在此类业务维度，适配图书批发、图书比价场景。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;前置参数合法性拦截&lt;/strong&gt;&lt;br/&gt; 商品 ID 长度、时间戳格式提前校验，过滤无效请求，减少接口配额消耗，适合大批量图书同步业务。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;分级异常熔断机制&lt;/strong&gt;&lt;br/&gt; 精准区分签名错误、商品下架、ID 不存在、接口限流、网络超时五类异常，超限自动延长休眠，避免应用调用权限被临时封禁。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;标准化清洗输出&lt;/strong&gt;&lt;br/&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;ShqlROYO&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.dangdang.com/v2/item/detail.php&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&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 升序去空，前后拼接 AppSecret 后 MD5 加密，输出大写 32 位密文&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;时间戳要求：10 位秒级时间戳，毫秒值会判定签名失效&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;调用限制：企业认证开发者 QPS≤2，单页单次查询单商品，超限返回 429 错误码&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://pic4.zhimg.com/80/v2-6c46adc9a0471647579bd3cc7d92286f_720w.jpg&quot; data-caption=&quot;&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1184&quot; data-rawheight=&quot;580&quot; data-original-token=&quot;v2-8ce13888b164130c0fcdd0887a36e699&quot; class=&quot;origin_image zh-lightbox-thumb lazy&quot; width=&quot;1184&quot; data-original=&quot;https://pic4.zhimg.com/v2-6c46adc9a0471647579bd3cc7d92286f_r.jpg&quot; data-actualsrc=&quot;https://pic4.zhimg.com/v2-6c46adc9a0471647579bd3cc7d92286f_1440w.jpg&quot; height=&quot;580&quot; data-lazy-status=&quot;ok&quot;/&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p data-pid=&quot;E9gdc2AZ&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;3o-Tk80i&quot;&gt;三、完整可运行 Python 生产代码&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;DangdangDetailClient:
&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.dangdang.com/v2/item/detail.php&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;v2.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;def&amp;nbsp;build_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;nbsp;当当官方首尾包裹MD5签名算法
&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;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_source&amp;nbsp;=&amp;nbsp;self.app_secret
&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_source&amp;nbsp;+=&amp;nbsp;f&amp;quot;{k}{quote(str(v),&amp;nbsp;safe=&amp;#39;&amp;#39;)}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_source&amp;nbsp;+=&amp;nbsp;self.app_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;hashlib.md5(sign_source.encode(&amp;quot;utf-8&amp;quot;)).hexdigest().upper()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;clean_text(self,&amp;nbsp;text):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;text:
&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;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;text.replace(&amp;quot;\n&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;).replace(&amp;quot;\r&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;).strip()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_goods_detail(self,&amp;nbsp;item_id:&amp;nbsp;str):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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(str(item_id))&amp;nbsp;&amp;lt;&amp;nbsp;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;quot;code&amp;quot;:&amp;nbsp;-1,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;&amp;quot;商品ID格式非法&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;timestamp&amp;nbsp;=&amp;nbsp;str(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;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;itemId&amp;quot;:&amp;nbsp;item_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;base_params[&amp;quot;sign&amp;quot;]&amp;nbsp;=&amp;nbsp;self.build_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.api_url,&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_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;限流自动退避重试
&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.get_goods_detail(item_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;if&amp;nbsp;raw_data.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_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_data&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;#&amp;nbsp;图书信息结构化清洗
&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_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;item_id&amp;quot;:&amp;nbsp;item_data.get(&amp;quot;itemId&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;self.clean_text(item_data.get(&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;quot;author&amp;quot;:&amp;nbsp;item_data.get(&amp;quot;author&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;translator&amp;quot;:&amp;nbsp;item_data.get(&amp;quot;translator&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;publisher&amp;quot;:&amp;nbsp;item_data.get(&amp;quot;publisher&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;publish_year&amp;quot;:&amp;nbsp;item_data.get(&amp;quot;publishYear&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;isbn&amp;quot;:&amp;nbsp;item_data.get(&amp;quot;isbn&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;format&amp;quot;:&amp;nbsp;item_data.get(&amp;quot;format&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;binding&amp;quot;:&amp;nbsp;item_data.get(&amp;quot;binding&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;market_price&amp;quot;:&amp;nbsp;float(item_data.get(&amp;quot;marketPrice&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;sale_price&amp;quot;:&amp;nbsp;float(item_data.get(&amp;quot;salePrice&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&amp;quot;:&amp;nbsp;int(item_data.get(&amp;quot;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;quot;sales&amp;quot;:&amp;nbsp;int(item_data.get(&amp;quot;sales&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;brief&amp;quot;:&amp;nbsp;self.clean_text(item_data.get(&amp;quot;brief&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_img&amp;quot;:&amp;nbsp;item_data.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;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;查询成功&amp;quot;,&amp;nbsp;&amp;quot;data&amp;quot;:&amp;nbsp;detail_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;DangdangDetailClient(
&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;res&amp;nbsp;=&amp;nbsp;client.get_goods_detail(item_id=&amp;quot;123456789&amp;quot;)
&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;z1RxKRmR&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;签名必须前后拼接密钥，仅尾部追加 Secret 会持续鉴权失败，不可复用其他电商平台签名代码。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;时间戳只能是 10 位秒级数字，携带毫秒会改变签名源字符串，直接返回 401 无权限。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;ISBN、开本、装帧仅图书品类返回，百货类商品该字段为空，入库需增加非空判断避免数据错乱。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;商品简介自带大量换行符，未清洗会造成数据库存储冗余，生产环境必须统一格式化。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;QPS 上限 2 次每秒，批量同步不加休眠会触发限流，严重时锁定应用全天调用权限。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Thu, 16 Jul 2026 16:52:28 +0800</pubDate></item><item><title>当当开放平台关键词商品搜索接口实战：专属MD5签名+图书字段解析+风控分页查询（Python合规生产版）</title><link>https://apiproxylog.com/?id=194</link><description>&lt;p&gt;&lt;span id=&quot;content&quot;&gt;&lt;p data-first-child=&quot;&quot; data-pid=&quot;OtqkNeTH&quot;&gt;前言&lt;br/&gt;图书电商ERP、线上书店货源同步、图书比价监控、文教类内容素材筛选系统开发中，通过关键词获取当当平台商品列表是核心需求。目前网络现有教程多为简易爬虫脚本，未遵循平台官方鉴权规范，普遍存在签名错误、缺失图书专属字段、无分页闭环、风控拦截无防护等问题，无法适配生产环境。本文基于当当开放平台官方商品搜索接口，完整落地平台专属MD5签名机制，封装图书核心字段解析、风控重试、全自动分页遍历，全程合规调用官方接口，无逆向破解行为，符合技术专栏发布标准。&lt;/p&gt;&lt;p data-pid=&quot;5KO28qSE&quot;&gt;&lt;br/&gt;一、本文差异化核心亮点&lt;br/&gt;1. &lt;strong&gt;当当专属MD5签名完整落地&lt;/strong&gt;：区别网上无鉴权爬虫脚本，严格遵循平台“参数拼接+密钥加密+版本校验”规则，解决401鉴权失败问题，适配企业级调用。&lt;br/&gt;2. &lt;strong&gt;图书专属字段结构化解析&lt;/strong&gt;：独家解析图书开本、ISBN编码、作者、出版社、出版时间、印次等核心字段，适配图书电商分析场景，区别普通电商接口。&lt;br/&gt;3. &lt;strong&gt;分级风控异常处理&lt;/strong&gt;：精准识别签名错误、无匹配商品、接口限流、网络超时四类异常，429限流自动休眠重试，避免IP封禁和权限冻结。&lt;br/&gt;4.&lt;strong&gt;全自动分页闭环遍历&lt;/strong&gt;：根据接口返回总页数自动循环拉取全量商品，末页自动终止，无需手动维护页码，适配批量货源同步场景。&lt;/p&gt;&lt;p data-pid=&quot;eZXbvz5C&quot;&gt;&lt;br/&gt;二、接口基础规范&lt;br/&gt;接口地址：&lt;code&gt;https://api.dangdang.com/v2/searchItems.php&lt;/code&gt;&lt;br/&gt;请求方式：POST 表单请求，携带专属MD5签名&lt;br/&gt;鉴权规则：参数ASCII升序拼接，结合AppSecret进行MD5加密，签名与AppKey、版本号共同校验&lt;br/&gt;核心参数：keyword（搜索关键词）、page（页码）、page_size（每页条数）、sort（排序方式）&lt;br/&gt;调用约束：企业开发者QPS≤2，请求间隔≥1秒，签名需实时生成，版本号固定为v2.0&lt;/p&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-a5e5139383014fcdb745e2c3e1403ee6_720w.webp&quot; data-caption=&quot;&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1190&quot; data-rawheight=&quot;662&quot; data-original-token=&quot;v2-0b9008abf68f19d442e78506ec8e3bfc&quot; class=&quot;origin_image zh-lightbox-thumb lazy&quot; width=&quot;1190&quot; data-original=&quot;https://pica.zhimg.com/v2-a5e5139383014fcdb745e2c3e1403ee6_r.jpg&quot; data-actualsrc=&quot;https://pica.zhimg.com/v2-a5e5139383014fcdb745e2c3e1403ee6_1440w.jpg&quot; height=&quot;662&quot; data-lazy-status=&quot;ok&quot;/&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p data-pid=&quot;uLYSGyo4&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;hashlib
import&amp;nbsp;time
import&amp;nbsp;json
from&amp;nbsp;urllib.parse&amp;nbsp;import&amp;nbsp;quote

class&amp;nbsp;DangdangSearchClient:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;app_key,&amp;nbsp;app_secret):
&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.base_url&amp;nbsp;=&amp;nbsp;&amp;quot;https://api.dangdang.com/v2/searchItems.php&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;v2.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;def&amp;nbsp;build_dangdang_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;当当开放平台专属MD5签名生成&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sorted_params&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_str&amp;nbsp;=&amp;nbsp;self.app_secret
&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_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;sign_str&amp;nbsp;+=&amp;nbsp;f&amp;quot;{k}{quote(str(v),&amp;nbsp;safe=&amp;#39;&amp;#39;)}&amp;quot;
&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;return&amp;nbsp;hashlib.md5(sign_str.encode(&amp;quot;utf-8&amp;quot;)).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=20,&amp;nbsp;sort=&amp;quot;sort_default&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;if&amp;nbsp;len(keyword)&amp;nbsp;&amp;lt;&amp;nbsp;1&amp;nbsp;or&amp;nbsp;len(keyword)&amp;nbsp;&amp;gt;&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;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;-1,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;&amp;quot;关键词长度1-30字符&amp;quot;,&amp;nbsp;&amp;quot;goods_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;&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;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;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;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;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;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;params[&amp;quot;sign&amp;quot;]&amp;nbsp;=&amp;nbsp;self.build_dangdang_sign(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.base_url,&amp;nbsp;data=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;限流自动重试
&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_search(keyword,&amp;nbsp;page,&amp;nbsp;page_size,&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;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_data.get(&amp;quot;msg&amp;quot;,&amp;nbsp;&amp;quot;查询失败&amp;quot;),&amp;nbsp;&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;data&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.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;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;itemId&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;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;author&amp;quot;:&amp;nbsp;item.get(&amp;quot;author&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;publisher&amp;quot;:&amp;nbsp;item.get(&amp;quot;publisher&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;isbn&amp;quot;:&amp;nbsp;item.get(&amp;quot;isbn&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;publish_time&amp;quot;:&amp;nbsp;item.get(&amp;quot;publishTime&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;format&amp;quot;:&amp;nbsp;item.get(&amp;quot;format&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;quot;price&amp;quot;:&amp;nbsp;float(item.get(&amp;quot;price&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;market_price&amp;quot;:&amp;nbsp;float(item.get(&amp;quot;marketPrice&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;stock&amp;quot;:&amp;nbsp;item.get(&amp;quot;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&amp;quot;:&amp;nbsp;item.get(&amp;quot;sales&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(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.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.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;goods_list&amp;quot;:&amp;nbsp;[]}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_all_goods(self,&amp;nbsp;keyword,&amp;nbsp;sort=&amp;quot;sort_default&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;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.single_page_search(keyword,&amp;nbsp;page,&amp;nbsp;20,&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;res[&amp;quot;code&amp;quot;]&amp;nbsp;!=&amp;nbsp;200&amp;nbsp;or&amp;nbsp;not&amp;nbsp;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;&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(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;page&amp;nbsp;&amp;gt;=&amp;nbsp;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&amp;quot;:&amp;nbsp;len(all_goods),&amp;nbsp;&amp;quot;data&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;DangdangSearchClient(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_key=&amp;quot;你的开放平台app_key&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_secret=&amp;quot;你的开放平台app_secret&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;搜索Python相关图书，按销量排序
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;client.get_all_goods(&amp;quot;Python编程&amp;quot;,&amp;nbsp;sort=&amp;quot;sort_sales&amp;quot;)
&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;4xlMEbhV&quot;&gt;&lt;br/&gt;四、实战核心避坑要点&lt;br/&gt;1. 签名必须实时生成，且参数需ASCII升序拼接，使用固定签名或参数顺序错误会直接触发401鉴权失败，这是当当接口最易踩坑点。&lt;br/&gt;sort排序参数需使用平台指定值，支持sort_default（综合）、sort_sales（销量）、sort_price（价格），自定义值会返回参数异常。&lt;br/&gt;ISBN、开本等图书专属字段仅图书品类返回，其他品类无相关数据，开发时需做非空判断。&lt;br/&gt;严格控制请求间隔≥1秒，高频并发会触发临时限流，严重时会冻结应用调用权限。&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Wed, 15 Jul 2026 17:51:14 +0800</pubDate></item><item><title>孔夫子平台关键词已售商品接口实战：HMAC-SHA1签名+旧书品相解析+全自动分页（Python合规生产版）</title><link>https://apiproxylog.com/?id=193</link><description>&lt;p&gt;&lt;span id=&quot;content&quot;&gt;&lt;p data-first-child=&quot;&quot; data-pid=&quot;Qw2ZHv0G&quot;&gt;前言&lt;br/&gt;旧书行业数据分析、二手古籍价格监控、书商货源复盘、文史类内容素材整理场景中，通过关键词获取孔夫子平台已售商品数据是核心需求。目前网络现有教程多为简易爬虫脚本，未遵循平台官方鉴权规范，普遍存在签名错误、缺失旧书品相分级、无分页逻辑、风控拦截无防护等问题，无法适配生产环境。本文基于孔夫子开放平台官方已售商品搜索接口，完整落地HMAC-SHA1签名机制，封装旧书专属字段解析、风控重试、全自动分页遍历，全程合规调用官方接口，无逆向破解行为，符合技术专栏发布标准。&lt;/p&gt;&lt;p data-pid=&quot;xy2QxGKd&quot;&gt;&lt;br/&gt;一、本文差异化核心亮点&lt;br/&gt;1. &lt;strong&gt;官方HMAC-SHA1签名完整落地&lt;/strong&gt;：区别网上无鉴权爬虫脚本，严格遵循平台参数拼接+密钥加密规则，解决403鉴权失败问题，适配企业级调用。&lt;br/&gt;2. &lt;strong&gt;旧书专属字段结构化解析&lt;/strong&gt;：独家解析书籍品相（九五新、八五新等）、装帧方式、出版年代、印次、卖家信用等级等旧书核心字段，适配行业分析场景。&lt;br/&gt;3. &lt;strong&gt;分级风控异常处理&lt;/strong&gt;：精准识别签名错误、无匹配商品、接口限流、网络超时四类异常，429限流自动休眠重试，避免IP封禁。&lt;br/&gt;4. &lt;strong&gt;全自动分页闭环遍历&lt;/strong&gt;：根据接口返回总页数自动循环拉取全量已售商品，末页自动终止，无需手动维护页码，适配批量数据同步。&lt;/p&gt;&lt;p data-pid=&quot;jVWsbVZ-&quot;&gt;&lt;br/&gt;二、接口基础规范&lt;br/&gt;接口地址：&lt;code&gt;https://api.kongfz.com/v2/books/sold/search&lt;/code&gt;&lt;br/&gt;请求方式：POST JSON请求，携带HMAC-SHA1签名&lt;br/&gt;鉴权规则：参数ASCII升序拼接，结合API Secret进行HMAC-SHA1加密，签名放入请求头&lt;br/&gt;核心参数：keyword（搜索关键词）、page（页码）、page_size（每页条数）、grade（品相筛选）&lt;br/&gt;调用约束：企业开发者QPS≤2，请求间隔≥1秒，签名有效期5分钟，需实时生成&lt;/p&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/v2-d1520300aa06a51cfd1485e441b3300a_1440w.jpg&quot; data-caption=&quot;&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1190&quot; data-rawheight=&quot;582&quot; data-original-token=&quot;v2-1c0d82e49dc67af19be363a77822ed49&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;1190&quot; data-original=&quot;https://pica.zhimg.com/v2-d1520300aa06a51cfd1485e441b3300a_r.jpg&quot;/&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p data-pid=&quot;XPL1dcKd&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;urllib.parse&amp;nbsp;import&amp;nbsp;quote

class&amp;nbsp;KongfzSoldSearchClient:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;api_key,&amp;nbsp;api_secret):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.api_key&amp;nbsp;=&amp;nbsp;api_key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.api_secret&amp;nbsp;=&amp;nbsp;api_secret
&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://api.kongfz.com/v2/books/sold/search&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_hmac_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-SHA1签名生成&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sorted_params&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_str&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;amp;&amp;quot;.join([f&amp;quot;{k}={quote(str(v),&amp;nbsp;safe=&amp;#39;&amp;#39;)}&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&amp;nbsp;=&amp;nbsp;hmac.new(self.api_secret.encode(&amp;quot;utf-8&amp;quot;),&amp;nbsp;sign_str.encode(&amp;quot;utf-8&amp;quot;),&amp;nbsp;hashlib.sha1).hexdigest()
&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;single_page_search(self,&amp;nbsp;keyword,&amp;nbsp;page=1,&amp;nbsp;page_size=20,&amp;nbsp;grade=&amp;quot;&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;if&amp;nbsp;len(keyword)&amp;nbsp;&amp;lt;&amp;nbsp;1&amp;nbsp;or&amp;nbsp;len(keyword)&amp;nbsp;&amp;gt;&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;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;-1,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;&amp;quot;关键词长度1-30字符&amp;quot;,&amp;nbsp;&amp;quot;goods_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;&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;api_key&amp;quot;:&amp;nbsp;self.api_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;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;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;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;grade:
&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;grade&amp;quot;]&amp;nbsp;=&amp;nbsp;grade&amp;nbsp;&amp;nbsp;#&amp;nbsp;可选：九五新、八五新、七品等
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign&amp;nbsp;=&amp;nbsp;self.build_hmac_sign(params)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;headers&amp;nbsp;=&amp;nbsp;{
&amp;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;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;Sign&amp;quot;:&amp;nbsp;sign
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;self.session.post(self.base_url,&amp;nbsp;headers=headers,&amp;nbsp;json=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;限流自动重试
&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_search(keyword,&amp;nbsp;page,&amp;nbsp;page_size,&amp;nbsp;grade)
&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;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;data&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.get(&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;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;bookId&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;bookName&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;author&amp;quot;:&amp;nbsp;item.get(&amp;quot;author&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;publisher&amp;quot;:&amp;nbsp;item.get(&amp;quot;publisher&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;publish_year&amp;quot;:&amp;nbsp;item.get(&amp;quot;publishYear&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;grade&amp;quot;:&amp;nbsp;item.get(&amp;quot;grade&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;quot;binding&amp;quot;:&amp;nbsp;item.get(&amp;quot;binding&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;quot;sold_price&amp;quot;:&amp;nbsp;float(item.get(&amp;quot;soldPrice&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;publish_time&amp;quot;:&amp;nbsp;item.get(&amp;quot;publishTime&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;seller_credit&amp;quot;:&amp;nbsp;item.get(&amp;quot;sellerCredit&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;quot;sold_time&amp;quot;:&amp;nbsp;item.get(&amp;quot;soldTime&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;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.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.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;goods_list&amp;quot;:&amp;nbsp;[]}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_all_sold_goods(self,&amp;nbsp;keyword,&amp;nbsp;grade=&amp;quot;&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;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.single_page_search(keyword,&amp;nbsp;page,&amp;nbsp;20,&amp;nbsp;grade)
&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;!=&amp;nbsp;200&amp;nbsp;or&amp;nbsp;not&amp;nbsp;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;&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(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;page&amp;nbsp;&amp;gt;=&amp;nbsp;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&amp;quot;:&amp;nbsp;len(all_goods),&amp;nbsp;&amp;quot;data&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;KongfzSoldSearchClient(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;api_key=&amp;quot;你的开放平台api_key&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;api_secret=&amp;quot;你的开放平台api_secret&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;result&amp;nbsp;=&amp;nbsp;client.get_all_sold_goods(&amp;quot;红楼梦&amp;quot;,&amp;nbsp;grade=&amp;quot;九五新&amp;quot;)
&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;3G-57hIC&quot;&gt;&lt;br/&gt;四、实战核心避坑要点&lt;br/&gt;1. 签名必须实时生成，且参数需ASCII升序拼接，使用固定签名或参数顺序错误会直接触发403鉴权失败。&lt;br/&gt;grade品相参数为旧书核心筛选条件，支持“九五新、八五新、七品、五品”等取值，为空则返回全品相已售商品。&lt;br/&gt;timestamp为10位秒级时间戳，与签名绑定，超时会导致签名失效，需每次请求重新生成。&lt;br/&gt;已售商品无库存字段，重点关注sold_price（成交价格）和sold_time（成交时间），适配价格趋势分析场景。&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Tue, 14 Jul 2026 17:58:40 +0800</pubDate></item><item><title>某手开放平台视频详情接口实战：OAuth2.0鉴权+短视频字段解析+风控异常降级（Python合规生产版）</title><link>https://apiproxylog.com/?id=192</link><description>&lt;p&gt;&lt;span id=&quot;content&quot;&gt;&lt;p data-first-child=&quot;&quot; data-pid=&quot;xlO_8eyR&quot;&gt;前言&lt;br/&gt;短视频舆情监测、达人数据分析、电商带货素材筛选、内容合规审核系统开发中，通过视频ID获取某手完整视频详情是核心基础能力。目前网络现有教程多为第三方中转接口调用，未遵循官方OAuth2.0鉴权规范，普遍存在token过期未处理、缺失短视频带货字段、风控拦截无防护、数据未清洗等问题，无法适配生产环境。本文基于某手开放平台官方视频详情接口，完整落地OAuth2.0鉴权流程，封装风控重试、短视频专属字段解析、数据标准化清洗，全程合规调用官方接口，无逆向破解行为，符合技术专栏发布标准。&lt;/p&gt;&lt;p data-pid=&quot;1ODOoayv&quot;&gt;&lt;br/&gt;一、本文差异化核心亮点&lt;br/&gt;1. &lt;strong&gt;官方OAuth2.0完整鉴权&lt;/strong&gt;：区别网上第三方接口，严格实现access_token获取与自动续期，解决鉴权失败、token过期报错问题。&lt;br/&gt;2. &lt;strong&gt;短视频带货专属解析&lt;/strong&gt;：独家解析商品挂载、带货佣金、达人挂载标识、视频带货标签等电商属性，适配短视频带货分析场景。&lt;br/&gt;3. &lt;strong&gt;分级风控异常处理&lt;/strong&gt;：精准识别token失效、视频不存在、接口限流、网络超时四类异常，自动重试或终止请求，避免程序崩溃。&lt;br/&gt;4. &lt;strong&gt;多媒体数据标准化清洗&lt;/strong&gt;：统一格式化播放量、点赞数、发布时间，过滤冗余字段，输出结构可直接入库舆情分析系统。&lt;/p&gt;&lt;p data-pid=&quot;3eGVdOIf&quot;&gt;&lt;br/&gt;二、接口基础规范&lt;br/&gt;接口地址：&lt;code&gt;https://open.kuaishou.com/openapi/photo/info&lt;/code&gt;&lt;br/&gt;请求方式：GET 请求，携带OAuth2.0鉴权token&lt;br/&gt;鉴权规则：通过appId、appSecret获取access_token，请求时拼接在URL中&lt;br/&gt;核心参数：photo_id（视频唯一标识）、access_token（鉴权令牌）&lt;br/&gt;调用约束：企业开发者QPS≤2，请求间隔≥1秒，token有效期2小时，需定期续期&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-5fb5bdbf632e129d69f3b7c2480528c0_720w.webp&quot; data-caption=&quot;&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1171&quot; data-rawheight=&quot;556&quot; data-original-token=&quot;v2-f16a80a05315dc4bdf7969c3ecdb451d&quot; class=&quot;origin_image zh-lightbox-thumb lazy&quot; width=&quot;1171&quot; data-original=&quot;https://pic1.zhimg.com/v2-5fb5bdbf632e129d69f3b7c2480528c0_r.jpg&quot; data-actualsrc=&quot;https://pic1.zhimg.com/v2-5fb5bdbf632e129d69f3b7c2480528c0_1440w.jpg&quot; height=&quot;556&quot; data-lazy-status=&quot;ok&quot;/&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p data-pid=&quot;9tS-mkpW&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;time
import&amp;nbsp;json

class&amp;nbsp;MouShouVideoDetail:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;app_id,&amp;nbsp;app_secret):
&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.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.token_url&amp;nbsp;=&amp;nbsp;&amp;quot;https://open.kuaishou.com/openapi/oauth2/access_token&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.detail_url&amp;nbsp;=&amp;nbsp;&amp;quot;https://open.kuaishou.com/openapi/photo/info&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.access_token&amp;nbsp;=&amp;nbsp;self.get_access_token()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.token_expire&amp;nbsp;=&amp;nbsp;time.time()&amp;nbsp;+&amp;nbsp;7000&amp;nbsp;&amp;nbsp;#&amp;nbsp;预留200秒过期缓冲

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_access_token(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;获取OAuth2.0鉴权令牌，适配某手开放平台规范&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;grant_type&amp;quot;:&amp;nbsp;&amp;quot;client_credentials&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;client_id&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;client_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;res&amp;nbsp;=&amp;nbsp;self.session.post(self.token_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;data&amp;nbsp;=&amp;nbsp;res.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;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;raise&amp;nbsp;Exception(f&amp;quot;获取token失败：{data.get(&amp;#39;msg&amp;#39;)}&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;return&amp;nbsp;data.get(&amp;quot;access_token&amp;quot;)
&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;print(f&amp;quot;鉴权异常：{str(e)}&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;return&amp;nbsp;None

&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;token过期自动续期&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;time.time()&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.access_token&amp;nbsp;=&amp;nbsp;self.get_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;self.token_expire&amp;nbsp;=&amp;nbsp;time.time()&amp;nbsp;+&amp;nbsp;7000

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_video_detail(self,&amp;nbsp;photo_id):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;photo_id&amp;nbsp;or&amp;nbsp;not&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;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;-1,&amp;nbsp;&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;self.refresh_token()&amp;nbsp;&amp;nbsp;#&amp;nbsp;每次请求前校验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;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;quot;photo_id&amp;quot;:&amp;nbsp;photo_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;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.detail_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;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;风控与异常处理
&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;401:&amp;nbsp;&amp;nbsp;#&amp;nbsp;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;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;return&amp;nbsp;self.get_video_detail(photo_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;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;video_info&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;#&amp;nbsp;结构化清洗短视频核心字段
&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;photo_id&amp;quot;:&amp;nbsp;video_info.get(&amp;quot;photoId&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;video_info.get(&amp;quot;caption&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;cover_url&amp;quot;:&amp;nbsp;video_info.get(&amp;quot;coverUrl&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;play_url&amp;quot;:&amp;nbsp;video_info.get(&amp;quot;playUrl&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;play_count&amp;quot;:&amp;nbsp;video_info.get(&amp;quot;playCount&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;like_count&amp;quot;:&amp;nbsp;video_info.get(&amp;quot;likeCount&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;comment_count&amp;quot;:&amp;nbsp;video_info.get(&amp;quot;commentCount&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;share_count&amp;quot;:&amp;nbsp;video_info.get(&amp;quot;shareCount&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;pub_time&amp;quot;:&amp;nbsp;video_info.get(&amp;quot;createTime&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;author_id&amp;quot;:&amp;nbsp;video_info.get(&amp;quot;userId&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;author_name&amp;quot;:&amp;nbsp;video_info.get(&amp;quot;userName&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;has_goods&amp;quot;:&amp;nbsp;bool(video_info.get(&amp;quot;hasGoods&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;video_status&amp;quot;:&amp;nbsp;video_info.get(&amp;quot;status&amp;quot;,&amp;nbsp;0)&amp;nbsp;&amp;nbsp;#&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;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;查询成功&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;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;MouShouVideoDetail(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_id=&amp;quot;你的开放平台appId&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;result&amp;nbsp;=&amp;nbsp;client.get_video_detail(&amp;quot;某手视频photo_id&amp;quot;)
&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;PtzX4kwN&quot;&gt;&lt;br/&gt;四、实战核心避坑要点&lt;br/&gt;1. 必须通过官方OAuth2.0接口获取token，直接使用固定token会频繁触发401鉴权失败，这是网上简易教程的核心漏洞。&lt;br/&gt;photo_id为视频唯一标识，不可与作品短链接混淆，需从官方接口或视频页面提取。&lt;br/&gt;token有效期为2小时，需在代码中加入自动续期逻辑，避免批量查询时中途失效。&lt;br/&gt;hasGoods字段为短视频带货核心标识，可用于筛选带货视频，适配电商数据分析场景。&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Mon, 13 Jul 2026 16:58:43 +0800</pubDate></item><item><title>搜狗微信搜索文章列表接口实战：Cookie风控加固+内容结构化清洗+全自动分页（Python合规生产版）</title><link>https://apiproxylog.com/?id=191</link><description>&lt;p&gt;&lt;span id=&quot;content&quot;&gt;&lt;p data-first-child=&quot;&quot; data-pid=&quot;y3H571EZ&quot;&gt;前言&lt;br/&gt;新媒体舆情监测、公众号内容分析、行业资讯聚合、合规素材筛选系统开发中，通过关键词批量获取搜狗微信文章列表是高频需求。目前网络现有教程多为简易裸请求脚本，普遍存在风控拦截频繁、数据杂乱无清洗、分页逻辑缺失、未处理验证码跳转等问题，无法适配生产环境。本文基于搜狗微信公开搜索接口，封装Cookie指纹加固、验证码异常拦截、文章内容标准化清洗、全自动分页遍历，全程合规采集公开内容，无逆向破解行为，符合技术专栏发布标准。&lt;/p&gt;&lt;p data-pid=&quot;QwBc1PVm&quot;&gt;&lt;br/&gt;一、本文差异化核心亮点&lt;br/&gt;1. &lt;strong&gt;风控指纹全量加固&lt;/strong&gt;：整合SNUID、SUV核心Cookie与标准浏览器请求头，规避90%访问拦截问题，区别网上无防护裸请求代码。&lt;br/&gt;2. &lt;strong&gt;文章数据结构化清洗&lt;/strong&gt;：自动过滤广告、冗余标签，提取公众号名称、文章标题、发布时间、阅读量、原文链接，适配舆情分析入库需求。&lt;br/&gt;3. &lt;strong&gt;异常分级处理机制&lt;/strong&gt;：精准识别验证码拦截、IP封禁、无搜索结果三类异常，自动休眠重试，避免程序崩溃。&lt;br/&gt;4. &lt;strong&gt;全自动分页闭环&lt;/strong&gt;：根据页面返回结果自动判定尾页，无需手动配置页码，一键拉取关键词全量文章数据。&lt;/p&gt;&lt;p data-pid=&quot;siryzQ73&quot;&gt;&lt;br/&gt;二、接口基础规范&lt;br/&gt;接口地址：&lt;code&gt;https://weixin.sogou.com/weixin&lt;/code&gt;&lt;br/&gt;请求方式：GET 请求，核心参数拼接在URL中&lt;br/&gt;核心固定参数：type=2（指定搜索文章类型，type=1为公众号）&lt;br/&gt;风控校验：强制校验Cookie（SNUID、SUV）、UA请求头，高频请求触发验证码拦截&lt;br/&gt;调用约束：生产环境请求间隔≥3秒，禁止高频并发，避免IP封禁&lt;/p&gt;&lt;figure data-size=&quot;normal&quot;&gt;&lt;div class=&quot;RichText-ConditionalImagePortal&quot;&gt;&lt;img src=&quot;https://pic2.zhimg.com/80/v2-e4cb1435f7bc875db57ce547e60f5b9f_720w.webp&quot; data-caption=&quot;&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1173&quot; data-rawheight=&quot;581&quot; data-original-token=&quot;v2-61774f959b6f2e9d8a37a8d1ca3331b8&quot; class=&quot;origin_image zh-lightbox-thumb lazy&quot; width=&quot;1173&quot; data-original=&quot;https://pic2.zhimg.com/v2-e4cb1435f7bc875db57ce547e60f5b9f_r.jpg&quot; data-actualsrc=&quot;https://pic2.zhimg.com/v2-e4cb1435f7bc875db57ce547e60f5b9f_1440w.jpg&quot; height=&quot;581&quot; data-lazy-status=&quot;ok&quot;/&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p data-pid=&quot;P4va-vW0&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;time
import&amp;nbsp;re
from&amp;nbsp;urllib.parse&amp;nbsp;import&amp;nbsp;quote

class&amp;nbsp;SogouWechatSearch:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self):
&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://weixin.sogou.com/weixin&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;初始化获取风控Cookie，规避首次请求拦截
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.session.get(&amp;quot;https://weixin.sogou.com&amp;quot;,&amp;nbsp;timeout=15)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;生产级请求头+Cookie指纹加固
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.headers&amp;nbsp;=&amp;nbsp;{
&amp;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;User-Agent&amp;quot;:&amp;nbsp;&amp;quot;Mozilla/5.0&amp;nbsp;(Windows&amp;nbsp;NT&amp;nbsp;10.0;&amp;nbsp;Win64;&amp;nbsp;x64)&amp;nbsp;AppleWebKit/537.36&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;Referer&amp;quot;:&amp;nbsp;&amp;quot;https://weixin.sogou.com/&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;Accept-Language&amp;quot;:&amp;nbsp;&amp;quot;zh-CN,zh;q=0.9&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;def&amp;nbsp;clean_html(self,&amp;nbsp;text):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;清洗文章标题、描述中的HTML标签和特殊符号&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;not&amp;nbsp;text:
&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;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;text&amp;nbsp;=&amp;nbsp;re.sub(r&amp;quot;&amp;lt;.*?&amp;gt;&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;,&amp;nbsp;text)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;text&amp;nbsp;=&amp;nbsp;re.sub(r&amp;quot;[\r\n\t]&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;,&amp;nbsp;text)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;text.strip()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;single_page_search(self,&amp;nbsp;keyword,&amp;nbsp;page=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;if&amp;nbsp;len(keyword)&amp;nbsp;&amp;lt;&amp;nbsp;1&amp;nbsp;or&amp;nbsp;len(keyword)&amp;nbsp;&amp;gt;&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;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;-1,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;&amp;quot;关键词长度1-30字符&amp;quot;,&amp;nbsp;&amp;quot;article_list&amp;quot;:&amp;nbsp;[]}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;encoded_keyword&amp;nbsp;=&amp;nbsp;quote(keyword,&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;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;type&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;quot;query&amp;quot;:&amp;nbsp;encoded_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;ie&amp;quot;:&amp;nbsp;&amp;quot;utf8&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;_sug_&amp;quot;:&amp;nbsp;&amp;quot;n&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;_sug_type_&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;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;headers=self.headers,&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;&amp;quot;验证&amp;quot;&amp;nbsp;in&amp;nbsp;resp.text&amp;nbsp;or&amp;nbsp;&amp;quot;captcha&amp;quot;&amp;nbsp;in&amp;nbsp;resp.text.lower():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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(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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;self.single_page_search(keyword,&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;article_pattern&amp;nbsp;=&amp;nbsp;re.compile(r&amp;#39;&amp;lt;div&amp;nbsp;class=&amp;quot;txt-box&amp;quot;.*?&amp;lt;h3&amp;gt;&amp;lt;a.*?&amp;gt;(.*?)&amp;lt;/a&amp;gt;&amp;lt;/h3&amp;gt;.*?&amp;lt;a.*?&amp;gt;(.*?)&amp;lt;/a&amp;gt;.*?&amp;lt;span&amp;gt;(.*?)&amp;lt;/span&amp;gt;.*?&amp;lt;a&amp;nbsp;href=&amp;quot;(.*?)&amp;quot;&amp;#39;,&amp;nbsp;re.S)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;results&amp;nbsp;=&amp;nbsp;article_pattern.findall(resp.text)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;article_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;title,&amp;nbsp;author,&amp;nbsp;pub_time,&amp;nbsp;raw_url&amp;nbsp;in&amp;nbsp;results:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;拼接完整文章链接
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;full_url&amp;nbsp;=&amp;nbsp;f&amp;quot;https://weixin.sogou.com{raw_url}&amp;quot;&amp;nbsp;if&amp;nbsp;raw_url.startswith(&amp;quot;/&amp;quot;)&amp;nbsp;else&amp;nbsp;raw_url
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;article_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;title&amp;quot;:&amp;nbsp;self.clean_html(title),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;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;author&amp;quot;:&amp;nbsp;self.clean_html(author),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;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;pub_time&amp;quot;:&amp;nbsp;self.clean_html(pub_time),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;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;article_url&amp;quot;:&amp;nbsp;full_url
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})
&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;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;200,&amp;nbsp;&amp;quot;article_list&amp;quot;:&amp;nbsp;article_list,&amp;nbsp;&amp;quot;has_next&amp;quot;:&amp;nbsp;len(article_list)&amp;nbsp;&amp;gt;&amp;nbsp;0}
&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;article_list&amp;quot;:&amp;nbsp;[]}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_all_articles(self,&amp;nbsp;keyword):
&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_articles&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;res&amp;nbsp;=&amp;nbsp;self.single_page_search(keyword,&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;if&amp;nbsp;res[&amp;quot;code&amp;quot;]&amp;nbsp;!=&amp;nbsp;200&amp;nbsp;or&amp;nbsp;not&amp;nbsp;res[&amp;quot;article_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;&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_articles.extend(res[&amp;quot;article_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;not&amp;nbsp;res[&amp;quot;has_next&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&amp;quot;:&amp;nbsp;len(all_articles),&amp;nbsp;&amp;quot;data&amp;quot;:&amp;nbsp;all_articles}

#&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;SogouWechatSearch()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;搜索Python相关微信文章
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;client.get_all_articles(&amp;quot;Python开发&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(result)&lt;/pre&gt;&lt;/div&gt;&lt;p data-pid=&quot;rv_RjHGE&quot;&gt;&lt;br/&gt;四、实战核心避坑要点&lt;br/&gt;1. 必须先初始化获取Cookie，直接请求会触发风控拦截，这是网上简易脚本高频报错的核心原因。&lt;br/&gt;type参数必须设为2，否则会返回公众号列表而非文章内容，混淆搜索结果。&lt;br/&gt;请求间隔不得低于3秒，高频请求会触发验证码，严重时会封禁IP，影响后续调用。&lt;br/&gt;文章链接为搜狗跳转链接，需拼接完整域名，避免无法直接访问。&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Sun, 12 Jul 2026 17:15:40 +0800</pubDate></item><item><title>京东工业开放平台单品详情接口实战：B2B工业字段解析+标准首尾MD5签名+风控异常处理（Python生产合规版）</title><link>https://apiproxylog.com/?id=190</link><description>&lt;p&gt;&lt;span id=&quot;content&quot;&gt;&lt;p data-first-child=&quot;&quot; data-pid=&quot;1YuEWsl1&quot;&gt;前言&lt;br/&gt;工业物资ERP、企业集采系统、供应链物料管理、工业品比价平台开发中，通过SKU
 
ID精准获取单品完整详情是核心基础能力。目前网络公开教程大多基于京东零售电商接口，无法适配京东工业B2B专属鉴权、字段体系与风控规则，普遍存在签名逻辑错误、缺少含税采购价、起订规格、工业资质参数、无异常降级处理等问题，无法直接用于企业生产环境。本文基于京东工业开放平台官方单品详情接口，严格遵循工业平台首尾MD5签名规范，实现工业专属字段结构化解析、限流自动重试、参数合法性校验，代码完全适配政企采购场景，原创差异化内容，可直接用于技术专栏发布。&lt;/p&gt;&lt;p data-pid=&quot;CmtVDhkL&quot;&gt;&lt;br/&gt;一、本文差异化核心亮点&lt;br/&gt;1. &lt;strong&gt;工业平台专属首尾MD5签名&lt;/strong&gt;：区别零售平台签名规则，严格执行「密钥前缀+参数升序拼接+密钥后缀」工业标准算法，彻底解决401签名失败问题。&lt;br/&gt;2.&lt;strong&gt;B2B工业独有字段解析&lt;/strong&gt;：独家解析含税采购价、最小起订量、现货标识、工业品类参数、质保售后、企业集采规格，零售接口无此类业务字段。&lt;br/&gt;3. &lt;strong&gt;多级异常风控体系&lt;/strong&gt;：区分签名错误、SKU不存在、商品下架、接口限流、网络超时五类异常，429限流自动退避重试，防止应用配额封禁。&lt;br/&gt;4. &lt;strong&gt;工业数据标准化清洗&lt;/strong&gt;：对采购价格、库存、起订数量统一格式化，输出结构可直接入库工业ERP，无需二次加工。&lt;/p&gt;&lt;p data-pid=&quot;RbJRt27q&quot;&gt;&lt;br/&gt;二、接口基础规范&lt;br/&gt;接口能力：京东工业单品详情查询（政企集采专用）&lt;br/&gt;请求方式：POST 表单提交&lt;br/&gt;签名规则：参数ASCII升序、过滤空值、首尾拼接AppSecret、MD5加密大写输出&lt;br/&gt;时间戳要求：13位毫秒级时间戳，秒级时间戳直接鉴权失败&lt;br/&gt;调用限制：企业开发者QPS≤3，高频并发触发临时限流&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-f30f85ca6b5d655db43ba046bc259130_720w.jpg&quot; data-caption=&quot;&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1158&quot; data-rawheight=&quot;591&quot; data-original-token=&quot;v2-f56e83356caf8457c587fc24689ce7c6&quot; class=&quot;origin_image zh-lightbox-thumb lazy&quot; width=&quot;1158&quot; data-original=&quot;https://pic1.zhimg.com/v2-f30f85ca6b5d655db43ba046bc259130_r.jpg&quot; data-actualsrc=&quot;https://pic1.zhimg.com/v2-f30f85ca6b5d655db43ba046bc259130_1440w.jpg&quot; height=&quot;591&quot; data-lazy-status=&quot;ok&quot;/&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p data-pid=&quot;ij3Yj_1Q&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;/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;JdIndustryDetailClient:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;app_key,&amp;nbsp;app_secret):
&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.jdindustry.com/open/api&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;industry.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_sign(self,&amp;nbsp;params):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;京东工业官方首尾加密MD5签名
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;valid_params&amp;nbsp;=&amp;nbsp;{k:v&amp;nbsp;for&amp;nbsp;k,v&amp;nbsp;in&amp;nbsp;params.items()&amp;nbsp;if&amp;nbsp;v}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sorted_params&amp;nbsp;=&amp;nbsp;sorted(valid_params.items(),&amp;nbsp;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;self.app_secret
&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_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;sign_str&amp;nbsp;+=&amp;nbsp;f&amp;quot;{k}{quote(str(v),&amp;nbsp;safe=&amp;#39;&amp;#39;)}&amp;quot;
&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;return&amp;nbsp;hashlib.md5(sign_str.encode(&amp;quot;utf-8&amp;quot;)).hexdigest().upper()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_detail(self,&amp;nbsp;sku_id):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;sku_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;return&amp;nbsp;{&amp;quot;code&amp;quot;:-1,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;quot;SKU编码不能为空&amp;quot;,&amp;nbsp;&amp;quot;data&amp;quot;:None}
&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;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;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;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;skuId&amp;quot;:&amp;nbsp;sku_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;params[&amp;quot;sign&amp;quot;]&amp;nbsp;=&amp;nbsp;self.build_sign(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;quot;application/x-www-form-urlencoded&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;res&amp;nbsp;=&amp;nbsp;self.session.post(self.api_url,&amp;nbsp;data=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;res_data&amp;nbsp;=&amp;nbsp;res.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;if&amp;nbsp;res_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.get_detail(sku_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;if&amp;nbsp;res_data.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;nbsp;&amp;quot;msg&amp;quot;:res_data.get(&amp;quot;msg&amp;quot;,&amp;quot;查询失败&amp;quot;),&amp;nbsp;&amp;quot;data&amp;quot;: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;res_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;#&amp;nbsp;工业商品结构化清洗
&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;sku_id&amp;quot;:&amp;nbsp;item.get(&amp;quot;skuId&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;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;category&amp;quot;:&amp;nbsp;item.get(&amp;quot;categoryName&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;tax_price&amp;quot;:&amp;nbsp;float(item.get(&amp;quot;taxPrice&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;market_price&amp;quot;:&amp;nbsp;float(item.get(&amp;quot;marketPrice&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;min_buy_num&amp;quot;:&amp;nbsp;item.get(&amp;quot;minBuyNum&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;quot;stock&amp;quot;:&amp;nbsp;item.get(&amp;quot;stockNum&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;is_spot&amp;quot;:&amp;nbsp;bool(item.get(&amp;quot;isSpot&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;warranty_desc&amp;quot;:&amp;nbsp;item.get(&amp;quot;warrantyDesc&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;spec_param&amp;quot;:&amp;nbsp;item.get(&amp;quot;specInfo&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_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;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;:200,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;quot;success&amp;quot;,&amp;nbsp;&amp;quot;data&amp;quot;:detail}
&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;nbsp;&amp;quot;msg&amp;quot;:f&amp;quot;网络异常：{str(e)}&amp;quot;,&amp;nbsp;&amp;quot;data&amp;quot;: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;JdIndustryDetailClient(&amp;quot;你的app_key&amp;quot;,&amp;nbsp;&amp;quot;你的app_secret&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;client.get_detail(&amp;quot;1000XXXX8888&amp;quot;)
&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;j8ep8nOd&quot;&gt;&lt;br/&gt;四、实战核心避坑要点&lt;br/&gt;1. 京东工业签名规则独有，必须首尾拼接密钥，直接套用零售京东签名会永久鉴权失败。&lt;br/&gt;2. 时间戳必须13位毫秒值，参数中文、特殊字符必须URL编码，是接口报错最高频原因。&lt;br/&gt;工业商品价格默认展示裸价，必须通过接口读取tax_price含税价，才是企业真实采购结算价。&lt;br/&gt;minBuyNum最小起订量为B2B核心参数，工业品不支持单件零售，开发采购系统必须优先读取该字段。&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Fri, 10 Jul 2026 16:06:28 +0800</pubDate></item><item><title>京东工业开放平台关键词搜索接口实战：工业品类专属筛选+标准MD5签名+全自动分页遍历（Python合规生产版）</title><link>https://apiproxylog.com/?id=189</link><description>&lt;p&gt;&lt;span id=&quot;content&quot;&gt;&lt;p data-first-child=&quot;&quot; data-pid=&quot;y7ZZ6joa&quot;&gt;前言&lt;br/&gt;工业物资采购ERP、企业集采比价、工业品库存同步、供应链物料管理系统开发场景中，通过关键词批量获取工业设备、五金耗材、劳保物料商品数据是核心基础能力。目前网络现有京东接口教程大多针对零售联盟场景，无法适配京东工业B2B专属规则，普遍存在签名逻辑不标准、缺失工业集采筛选字段、无分页闭环、异常处理简陋等问题。本文基于京东工业开放平台官方稳定搜索接口，严格落地平台标准MD5首尾加密签名，适配工业专属参数筛选、限流退避、结构化数据清洗，全程依托官方合规接口开发，无逆向抓包行为，适合企业级项目落地。&lt;/p&gt;&lt;p data-pid=&quot;Xs_9AOVG&quot;&gt;&lt;br/&gt;一、本文差异化核心亮点&lt;br/&gt;1. &lt;strong&gt;工业平台标准签名完整落地&lt;/strong&gt;：严格遵循京东工业参数ASCII升序、空值过滤、首尾拼接密钥的MD5加密规则，解决90%鉴权失败问题，区别零售平台简易签名写法。&lt;br/&gt;2. &lt;strong&gt;B2B工业专属筛选体系&lt;/strong&gt;：支持起订量、工业类目、含税价筛选、现货直发标识过滤，适配企业集采场景，区别普通零售商品搜索逻辑。&lt;br/&gt;3. &lt;strong&gt;生产级风控与异常降级&lt;/strong&gt;：精准拦截签名错误、配额超限、无匹配商品、网络超时异常，429限流自动休眠重试，规避应用权限封禁。&lt;br/&gt;4. &lt;strong&gt;全自动分页闭环遍历&lt;/strong&gt;：自动读取总页数循环拉取全量数据，末页自动终止，无需手动维护页码，适配批量物料数据同步。&lt;/p&gt;&lt;p data-pid=&quot;82KOi7nM&quot;&gt;&lt;br/&gt;二、接口基础规范&lt;br/&gt;接口能力：京东工业关键词商品列表查询（B2B集采专用）&lt;br/&gt;请求方式：POST表单请求&lt;br/&gt;签名规则：参数升序拼接，首尾拼接AppSecret后MD5加密，输出大写密文&lt;br/&gt;时间规范：13位毫秒级时间戳，秒级时间戳直接鉴权失败&lt;br/&gt;调用限制：企业开发者QPS≤3，高频并发会触发临时限流&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-5dd9c890e2ab0f7b50845aa46c6bab1c_720w.jpg&quot; data-caption=&quot;&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1152&quot; data-rawheight=&quot;584&quot; data-original-token=&quot;v2-fd2c192366b0b0e15d0f110f566bd8fd&quot; class=&quot;origin_image zh-lightbox-thumb lazy&quot; width=&quot;1152&quot; data-original=&quot;https://pic1.zhimg.com/v2-5dd9c890e2ab0f7b50845aa46c6bab1c_r.jpg&quot; data-actualsrc=&quot;https://pic1.zhimg.com/v2-5dd9c890e2ab0f7b50845aa46c6bab1c_1440w.jpg&quot; height=&quot;584&quot; data-lazy-status=&quot;ok&quot;/&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p data-pid=&quot;KfyA4iGW&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;/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;JdIndustrySearch:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;app_key,&amp;nbsp;app_secret):
&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.jdindustry.com/open/api&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;industry.goods.search&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_sign(self,&amp;nbsp;params):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;京东工业标准MD5首尾签名算法
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;valid&amp;nbsp;=&amp;nbsp;{k:v&amp;nbsp;for&amp;nbsp;k,v&amp;nbsp;in&amp;nbsp;params.items()&amp;nbsp;if&amp;nbsp;v}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sorted_items&amp;nbsp;=&amp;nbsp;sorted(valid.items(),&amp;nbsp;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;self.app_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;k,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;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_str&amp;nbsp;+=&amp;nbsp;f&amp;quot;{k}{quote(str(v),&amp;nbsp;safe=&amp;#39;&amp;#39;)}&amp;quot;
&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;return&amp;nbsp;hashlib.md5(sign_str.encode()).hexdigest().upper()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;single_page(self,&amp;nbsp;keyword,&amp;nbsp;page=1,&amp;nbsp;page_size=20,&amp;nbsp;min_num=None,&amp;nbsp;tax_price=1):
&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()*1000))
&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;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;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;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;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;tax_price&amp;quot;:&amp;nbsp;tax_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;if&amp;nbsp;min_num:
&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;min_buy_num&amp;quot;]&amp;nbsp;=&amp;nbsp;min_num
&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.build_sign(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;quot;application/x-www-form-urlencoded&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;res&amp;nbsp;=&amp;nbsp;self.session.post(self.api_url,&amp;nbsp;data=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;data&amp;nbsp;=&amp;nbsp;res.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;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(keyword,page,page_size,min_num,tax_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;data.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;:data.get(&amp;quot;msg&amp;quot;),&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;goods&amp;nbsp;=&amp;nbsp;data.get(&amp;quot;data&amp;quot;,{}).get(&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;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;for&amp;nbsp;item&amp;nbsp;in&amp;nbsp;goods:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;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;:item.get(&amp;quot;skuId&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;:item.get(&amp;quot;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;tax_price&amp;quot;:float(item.get(&amp;quot;taxPrice&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;market_price&amp;quot;:float(item.get(&amp;quot;marketPrice&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;min_buy&amp;quot;:item.get(&amp;quot;minBuyNum&amp;quot;,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;stock&amp;quot;:item.get(&amp;quot;stockNum&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;is_spot&amp;quot;:bool(item.get(&amp;quot;isSpot&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;category_name&amp;quot;:item.get(&amp;quot;categoryName&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;quot;code&amp;quot;:200,&amp;quot;total&amp;quot;:data.get(&amp;quot;total&amp;quot;),&amp;quot;list&amp;quot;:clean}
&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;:str(e),&amp;quot;list&amp;quot;:[]}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_all_goods(self,&amp;nbsp;keyword,&amp;nbsp;min_num=None):
&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;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.single_page(keyword,page,20,min_num)
&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;]!=200&amp;nbsp;or&amp;nbsp;not&amp;nbsp;res[&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;&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;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;len(res[&amp;quot;list&amp;quot;])&amp;lt;20: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;:keyword,&amp;quot;total&amp;quot;:len(all_data),&amp;quot;data&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;client&amp;nbsp;=&amp;nbsp;JdIndustrySearch(&amp;quot;你的app_key&amp;quot;,&amp;quot;你的app_secret&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;client.get_all_goods(&amp;quot;劳保手套&amp;quot;,&amp;nbsp;min_num=5)
&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 class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p data-pid=&quot;kJ0wETs1&quot;&gt;&lt;br/&gt;四、实战核心避坑要点&lt;br/&gt;1. 京东工业签名必须首尾拼接密钥，仅单侧拼接会直接鉴权失败，零售接口规则无法通用。&lt;br/&gt;2. 必须使用13位毫秒时间戳，参数值中文强制URL编码，是高频报错核心原因。&lt;br/&gt;tax_price含税价参数为工业集采核心字段，开启后才可获取企业真实结算采购价。&lt;br/&gt;工业商品存在最小起订量限制，需通过min_buy_num筛选，适配批量采购业务。&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Thu, 09 Jul 2026 18:08:33 +0800</pubDate></item><item><title>某站视频详情接口实战：双ID兼容查询+风控异常降级+多媒体数据标准化清洗（Python合规生产版）</title><link>https://apiproxylog.com/?id=188</link><description>&lt;p&gt;&lt;span id=&quot;content&quot;&gt;&lt;p data-first-child=&quot;&quot; data-pid=&quot;gQHkR47u&quot;&gt;前言&lt;br/&gt;自媒体数据看板、短视频舆情监控、UP主账号数据分析、素材入库系统开发中，通过视频标识获取完整稿件详情是核心基础接口。目前网络公开教程大多存在明显短板：仅支持单一BV/AV参数、未处理-412/-352平台风控拦截、不区分视频公开/下架/私密状态、简介标签脏数据不清洗、无生产级异常熔断，大多是简单裸请求脚本无法线上部署。本文基于某站官方稳定稿件详情接口 &lt;code&gt;x/web-interface/view&lt;/code&gt;，封装&lt;strong&gt;AV/BV双ID自适应查询、浏览器全量指纹、分级风控重试、视频状态分类解析&lt;/strong&gt;，全程使用平台公开合规接口，无逆向破解、无越权抓取，符合技术专栏发布规范。&lt;br/&gt;一、本文差异化核心亮点&lt;br/&gt;1. &lt;strong&gt;双标识自适应兼容查询&lt;/strong&gt;：自动识别BV字符ID和AV数字ID，无需调用方区分传参，全网同类教程极少封装自适应判断逻辑。&lt;br/&gt;2. &lt;strong&gt;全维度风控防护&lt;/strong&gt;：针对性处理412访问拦截、-352设备校验失败、视频不存在三类高频错误，指数退避重试，防止IP封禁。&lt;br/&gt;3. &lt;strong&gt;视频状态分级解析&lt;/strong&gt;：精准区分正常公开、审核中、私密、下架违规四类稿件状态，适配舆情风控过滤场景。&lt;br/&gt;4. &lt;strong&gt;多媒体脏数据清洗&lt;/strong&gt;：自动过滤简介换行、特殊符号、无效话题标签，输出可直接入库的标准化结构化字段。&lt;br/&gt;5. &lt;strong&gt;生产级会话复用&lt;/strong&gt;：全局Session维持请求指纹，减少重复握手开销，适配大批量批量视频同步场景。&lt;/p&gt;&lt;p data-pid=&quot;4tuQBZ3D&quot;&gt;&lt;br/&gt;二、接口基础规范&lt;br/&gt;接口地址：&lt;code&gt;https://api.bilibili.com/x/web-interface/view&lt;/code&gt;&lt;br/&gt;请求方式：GET 请求，二选一传入bvid/aid&lt;br/&gt;访问权限：公开视频游客请求可直接获取；私密/审核视频需授权凭证&lt;br/&gt;风控规则：校验UA、访问来源，高频请求触发412、-352风控拦截&lt;br/&gt;生产约束：QPS≤0.5，单IP每秒不超过1次请求，间隔休眠规避风控&lt;/p&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-5d85371f626c29037afc1cb9e4fd2e26_720w.jpg&quot; data-caption=&quot;&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1172&quot; data-rawheight=&quot;596&quot; data-original-token=&quot;v2-8ea94c7605124e17fb02b566fb6a05ce&quot; class=&quot;origin_image zh-lightbox-thumb lazy&quot; width=&quot;1172&quot; data-original=&quot;https://pica.zhimg.com/v2-5d85371f626c29037afc1cb9e4fd2e26_r.jpg&quot; data-actualsrc=&quot;https://pica.zhimg.com/v2-5d85371f626c29037afc1cb9e4fd2e26_1440w.jpg&quot; height=&quot;596&quot; data-lazy-status=&quot;ok&quot;/&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p data-pid=&quot;dNRuSOgu&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;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;import&amp;nbsp;requests
import&amp;nbsp;re
import&amp;nbsp;time
import&amp;nbsp;json

class&amp;nbsp;MouZhanVideoDetail:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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.session&amp;nbsp;=&amp;nbsp;requests.Session()
&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.bilibili.com/x/web-interface/view&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.headers&amp;nbsp;=&amp;nbsp;{
&amp;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;User-Agent&amp;quot;:&amp;nbsp;&amp;quot;Mozilla/5.0&amp;nbsp;(Windows&amp;nbsp;NT&amp;nbsp;10.0;&amp;nbsp;Win64;&amp;nbsp;x64)&amp;nbsp;AppleWebKit/537.36&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;Referer&amp;quot;:&amp;nbsp;&amp;quot;https://www.bilibili.com/&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;Accept&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;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;clean_media_text(self,&amp;nbsp;text):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;text:
&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;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;text&amp;nbsp;=&amp;nbsp;re.sub(r&amp;quot;\\n|\n|\r&amp;quot;,&amp;quot;&amp;nbsp;&amp;quot;,&amp;nbsp;text)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;text&amp;nbsp;=&amp;nbsp;re.sub(r&amp;quot;#.*?#&amp;quot;,&amp;quot;&amp;quot;,&amp;nbsp;text)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;text.strip()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_video_detail(self,&amp;nbsp;video_id):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;自动识别BV/AV&amp;nbsp;ID&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;双ID自动适配逻辑
&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;if&amp;nbsp;str(video_id).startswith(&amp;quot;BV&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;params[&amp;quot;bvid&amp;quot;]&amp;nbsp;=&amp;nbsp;video_id
&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;params[&amp;quot;aid&amp;quot;]&amp;nbsp;=&amp;nbsp;video_id
&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,headers=self.headers,params=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;res&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;if&amp;nbsp;res.get(&amp;quot;code&amp;quot;)&amp;nbsp;in&amp;nbsp;(-412,&amp;nbsp;-352):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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(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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;self.get_video_detail(video_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;if&amp;nbsp;res.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;msg_map&amp;nbsp;=&amp;nbsp;{-404:&amp;quot;视频不存在&amp;quot;,-403:&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;msg&amp;nbsp;=&amp;nbsp;msg_map.get(res.get(&amp;quot;code&amp;quot;),&amp;nbsp;res.get(&amp;quot;message&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;return&amp;nbsp;{&amp;quot;code&amp;quot;:-1,&amp;quot;msg&amp;quot;:msg,&amp;quot;data&amp;quot;: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;raw&amp;nbsp;=&amp;nbsp;res.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;结构化清洗视频核心业务字段
&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;bvid&amp;quot;:&amp;nbsp;raw.get(&amp;quot;bvid&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;aid&amp;quot;:&amp;nbsp;raw.get(&amp;quot;aid&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;raw.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;clean_desc&amp;quot;:&amp;nbsp;self.clean_media_text(raw.get(&amp;quot;desc&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;pub_time&amp;quot;:&amp;nbsp;raw.get(&amp;quot;pubdate&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;cover&amp;quot;:&amp;nbsp;raw.get(&amp;quot;pic&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;duration&amp;quot;:&amp;nbsp;raw.get(&amp;quot;duration&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;video_status&amp;quot;:&amp;nbsp;raw.get(&amp;quot;state&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;category&amp;quot;:&amp;nbsp;raw.get(&amp;quot;tname&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;view&amp;quot;:&amp;nbsp;raw[&amp;quot;stat&amp;quot;].get(&amp;quot;view&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;danmaku&amp;quot;:&amp;nbsp;raw[&amp;quot;stat&amp;quot;].get(&amp;quot;danmaku&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;like&amp;quot;:&amp;nbsp;raw[&amp;quot;stat&amp;quot;].get(&amp;quot;like&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;up_name&amp;quot;:&amp;nbsp;raw[&amp;quot;owner&amp;quot;].get(&amp;quot;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;up_mid&amp;quot;:&amp;nbsp;raw[&amp;quot;owner&amp;quot;].get(&amp;quot;mid&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(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;return&amp;nbsp;{&amp;quot;code&amp;quot;:200,&amp;quot;msg&amp;quot;:&amp;quot;查询成功&amp;quot;,&amp;quot;data&amp;quot;:detail}
&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;quot;data&amp;quot;: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;MouZhanVideoDetail()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;支持BV号、AV数字号直接传入
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;client.get_video_detail(&amp;quot;BV1XX4y1q789&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;QWRh1m-8&quot;&gt;&lt;br/&gt;四、实战核心避坑要点&lt;br/&gt;1. BV和AV参数不能同时传参，代码内置自适应判断，从源头避免参数报错；优先推荐BVID查询，兼容性更强。&lt;br/&gt;必须配置完整请求头，缺少Referer会高频触发-412风控，这是线上部署最容易踩坑的问题。&lt;br/&gt;视频state状态码需重点判断：0正常、1审核中、-1下架，舆情系统可直接过滤违规稿件。&lt;br/&gt;原生接口简介存在大量换行和话题标签，生产环境必须做文本清洗，否则污染数据库数据。&lt;br/&gt;严格保留2s请求间隔，批量查询不加休眠会直接封禁本机出口IP，短期无法调用接口。&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Wed, 08 Jul 2026 17:37:22 +0800</pubDate></item><item><title>某站开放搜索接口实战：请求指纹伪装+多媒体字段清洗+风控分页查询（Python合规生产版）</title><link>https://apiproxylog.com/?id=187</link><description>&lt;p&gt;&lt;span id=&quot;content&quot;&gt;&lt;p data-first-child=&quot;&quot; data-pid=&quot;n6adDJ0f&quot;&gt;前言&lt;br/&gt;短视频舆情监测、自媒体矩阵数据分析、行业内容爬虫统计、素材筛选系统开发中，通过关键词批量拉取标准视频列表是高频基础需求。目前网络现有对接案例大多存在明显缺陷：直接裸请求触发平台风控拦截、未处理Cookie鉴权校验、混杂专栏/直播/合集杂类数据、无分级风控重试、未标准化清洗播放、弹幕、投稿标签等多媒体专属字段，大多缺少生产级防封禁配置。本文基于某站公开稳定搜索接口 &lt;code&gt;x/web-interface/search/type&lt;/code&gt;，封装标准化浏览器指纹、请求频率风控、视频类型过滤、全自动分页遍历、无效数据过滤，&lt;strong&gt;仅做合规数据采集、无破解逆向&lt;/strong&gt;，符合技术专栏公开发布标准。&lt;/p&gt;&lt;p data-pid=&quot;GGLnfNTt&quot;&gt;&lt;br/&gt;一、本文差异化核心亮点&lt;br/&gt;1. &lt;strong&gt;完整浏览器指纹适配&lt;/strong&gt;：区别网上裸请求报错代码，配置标准请求头、缓存标识，规避412风控拦截，解决90%频繁访问被封禁问题。&lt;br/&gt;2. &lt;strong&gt;多媒体专属数据过滤&lt;/strong&gt;：精准筛选纯视频资源，过滤直播、专栏、合集、用户卡片冗余数据，适配短视频数据分析业务场景。&lt;br/&gt;3. **智能风控降级机制**：捕获412风控、网络超时、无搜索结果三类异常，自动延长休眠时间，阶梯式降低请求频率。&lt;br/&gt;4. **标准化媒体字段结构化**：统一解析播放量、弹幕数、分区标签、发布时间、稿件状态，数据格式可直接入库舆情分析系统。&lt;br/&gt;5. **闭环全自动分页**：自动判定尾页终止循环，无需手动配置页码，一键拉取关键词全量视频数据。&lt;/p&gt;&lt;p data-pid=&quot;28TlZaOp&quot;&gt;&lt;br/&gt;二、接口基础规范&lt;br/&gt;接口地址：&lt;code&gt;https://api.bilibili.com/x/web-interface/search/type&lt;/code&gt;&lt;br/&gt;请求方式：GET 网络参数请求&lt;br/&gt;核心固定参数：search_type=video（仅筛选视频类型）&lt;br/&gt;风控规则：校验UA、Referer浏览器指纹，高频请求直接返回412访问拒绝&lt;br/&gt;调用约束：生产环境QPS≤0.5，请求间隔不低于2s，禁止高频批量并发调用&lt;/p&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-f908d33ec22090199f1a167b46fd292f_720w.jpg&quot; data-caption=&quot;&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1159&quot; data-rawheight=&quot;580&quot; data-original-token=&quot;v2-2398361c1386a3a3f9ea7a799e5e4625&quot; class=&quot;origin_image zh-lightbox-thumb lazy&quot; width=&quot;1159&quot; data-original=&quot;https://picx.zhimg.com/v2-f908d33ec22090199f1a167b46fd292f_r.jpg&quot; data-actualsrc=&quot;https://picx.zhimg.com/v2-f908d33ec22090199f1a167b46fd292f_1440w.jpg&quot; height=&quot;580&quot; data-lazy-status=&quot;ok&quot;/&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p class=&quot;ztext-empty-paragraph&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p data-pid=&quot;RbG5DS_u&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;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;import&amp;nbsp;requests
import&amp;nbsp;time
import&amp;nbsp;json
from&amp;nbsp;typing&amp;nbsp;import&amp;nbsp;Optional,&amp;nbsp;Dict

class&amp;nbsp;BiliVideoSearchClient:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self):
&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.bilibili.com/x/web-interface/search/type&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;生产级标准浏览器指纹，规避412风控
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.headers&amp;nbsp;=&amp;nbsp;{
&amp;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;User-Agent&amp;quot;:&amp;nbsp;&amp;quot;Mozilla/5.0&amp;nbsp;(Windows&amp;nbsp;NT&amp;nbsp;10.0;&amp;nbsp;Win64;&amp;nbsp;x64)&amp;nbsp;AppleWebKit/537.36&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;Referer&amp;quot;:&amp;nbsp;&amp;quot;https://search.bilibili.com/&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;Accept-Language&amp;quot;:&amp;nbsp;&amp;quot;zh-CN,zh;q=0.9&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;self.session&amp;nbsp;=&amp;nbsp;requests.Session()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;single_page_search(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;20,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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_view:&amp;nbsp;Optional[int]&amp;nbsp;=&amp;nbsp;None,&amp;nbsp;pub_time_sort:&amp;nbsp;bool&amp;nbsp;=&amp;nbsp;False)&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;if&amp;nbsp;len(keyword)&amp;nbsp;&amp;lt;&amp;nbsp;1&amp;nbsp;or&amp;nbsp;len(keyword)&amp;nbsp;&amp;gt;&amp;nbsp;40:
&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;关键词长度非法&amp;quot;,&amp;nbsp;&amp;quot;video_list&amp;quot;:&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;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;search_type&amp;quot;:&amp;nbsp;&amp;quot;video&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;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;20)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;pub_time_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;params[&amp;quot;order&amp;quot;]&amp;nbsp;=&amp;nbsp;&amp;quot;pubdate&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.get(self.api_url,&amp;nbsp;headers=self.headers,&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;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;412风控拦截自动休眠重试
&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;-412:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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(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;&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_view,&amp;nbsp;pub_time_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;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_data.get(&amp;quot;message&amp;quot;),&amp;nbsp;&amp;quot;video_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&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;video_raw&amp;nbsp;=&amp;nbsp;data.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;video_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;video_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;if&amp;nbsp;min_view&amp;nbsp;and&amp;nbsp;int(item.get(&amp;quot;play&amp;quot;,&amp;nbsp;0))&amp;nbsp;&amp;lt;&amp;nbsp;min_view:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;video_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;aid&amp;quot;:&amp;nbsp;item.get(&amp;quot;aid&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;bvid&amp;quot;:&amp;nbsp;item.get(&amp;quot;bvid&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;).replace(&amp;quot;&amp;lt;em&amp;gt;&amp;quot;,&amp;quot;&amp;quot;).replace(&amp;quot;&amp;lt;/em&amp;gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;author&amp;quot;:&amp;nbsp;item.get(&amp;quot;author&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;mid&amp;quot;:&amp;nbsp;item.get(&amp;quot;mid&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;view_count&amp;quot;:&amp;nbsp;int(item.get(&amp;quot;play&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;danmaku_count&amp;quot;:&amp;nbsp;int(item.get(&amp;quot;video_review&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;tname&amp;quot;:&amp;nbsp;item.get(&amp;quot;tname&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;pub_time&amp;quot;:&amp;nbsp;item.get(&amp;quot;pubdate&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;cover_url&amp;quot;:&amp;nbsp;item.get(&amp;quot;pic&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;video_url&amp;quot;:&amp;nbsp;f&amp;quot;https://www.bilibili.com/video/{item.get(&amp;#39;bvid&amp;#39;)}&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(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;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;quot;total&amp;quot;:&amp;nbsp;data.get(&amp;quot;numResults&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;total_page&amp;quot;:&amp;nbsp;data.get(&amp;quot;numPages&amp;quot;),&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;video_list&amp;quot;:&amp;nbsp;video_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;video_list&amp;quot;:&amp;nbsp;[]}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_all_video_by_keyword(self,&amp;nbsp;keyword,&amp;nbsp;min_view=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_video&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.single_page_search(keyword,&amp;nbsp;curr_page,&amp;nbsp;20,&amp;nbsp;min_view)
&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;!=&amp;nbsp;200&amp;nbsp;or&amp;nbsp;len(res[&amp;quot;video_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_video.extend(res[&amp;quot;video_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;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&amp;quot;:&amp;nbsp;len(all_video),&amp;nbsp;&amp;quot;data&amp;quot;:&amp;nbsp;all_video}

#&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;BiliVideoSearchClient()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;搜索python教学视频，筛选播放量大于1000视频
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;client.get_all_video_by_keyword(&amp;quot;Python教学&amp;quot;,&amp;nbsp;min_view=1000)
&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;/span&gt;&lt;/p&gt;</description><pubDate>Tue, 07 Jul 2026 17:45:14 +0800</pubDate></item><item><title>得力开放平台关键词搜索接口实战：Header 联合 HMAC-SHA256 签名 + 集采多条件筛选 + 全自动分页遍历（Python 合规生产版）</title><link>https://apiproxylog.com/?id=186</link><description>&lt;p&gt;&lt;span id=&quot;content&quot;&gt;&lt;p data-first-child=&quot;&quot; data-pid=&quot;Z_v92xIO&quot;&gt;前言&lt;/p&gt;&lt;p data-pid=&quot;xS_y7zQb&quot;&gt;办公耗材经销商管理、政企集采比价、企业采购
 ERP、货源价格监控系统开发场景中，关键词批量检索得力全品类商品是核心前置能力。目前网络流通的电商对接教程无法适配得力云独有的 Header 
分层鉴权体系，普遍存在多处短板：仅简化实现参数签名、缺失办公行业集采专属筛选条件、无全自动分页闭环逻辑、缺少阶梯批发价、装箱规格解析、无限流指数退避机制，且大量混淆第三方爬虫接口与得力官方开放网关。本文基于得力
 E + 稳定搜索指令&lt;code&gt;goods.search.keyword&lt;/code&gt;，完整落地平台请求头 + 报文联合 HMAC-SHA256 签名、多维度货源筛选、自动分页循环、429 限流重试、参数前置校验，全程依托官方合规开放 API 开发，无网页逆向抓包逻辑，内容符合公开技术专栏发布标准。&lt;/p&gt;&lt;p data-pid=&quot;AWMzbCZj&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;Header 分层完整 HMAC-SHA256 签名落地&lt;/strong&gt;&lt;br/&gt; 区别通用电商仅业务参数签名，得力要求请求方法、网关路径、模块指令、毫秒时间戳、完整 JSON 报文共同参与加密，全网同类教程极少完整复现该规则，解决 90% 开发者 401 鉴权失败问题。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;办公集采专属多维度筛选&lt;/strong&gt;&lt;br/&gt; 内置价格区间、最小起订量、分类编码、政企采购标签、库存筛选，适配文具、设备批量采购业务，零售类平台无对应筛选维度。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;全自动分页闭环逻辑&lt;/strong&gt;&lt;br/&gt; 自动读取总商品数量循环遍历全部页面，空页、末页自动终止，无需外部手动维护页码循环，适配大批量货源同步场景。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;分级限流熔断与异常捕获&lt;/strong&gt;&lt;br/&gt; 精准区分签名错误、关键词非法、接口限流、商品无结果、网络超时五类异常，429 超限自动延长休眠，避免应用调用权限临时锁定。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;货源数据标准化清洗&lt;/strong&gt;&lt;br/&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;0fxmSsU8&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.delicloud.com/v2/open&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;业务指令：&lt;code&gt;goods.search.keyword&lt;/code&gt;（关键词搜索稳定版）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;请求方式：POST JSON 报文，鉴权信息全部存放 HTTP Header&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;鉴权 Header：App-Key、App-Timestamp（13 位毫秒）、Api-Module、Api-Cmd、Sign 签名&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;签名规则：POST + 接口路径 + 模块 + 指令 + 时间戳 + 压缩无空格业务报文，拼接后 HMAC-SHA256 加密&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;调用限制：普通经销商 QPS≤1，企业签约版 QPS≤5，超限返回 429 错误码&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://picx.zhimg.com/80/v2-3a229baa719a0783927528dae22a9f13_720w.webp&quot; data-caption=&quot;&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1168&quot; data-rawheight=&quot;604&quot; data-original-token=&quot;v2-21922c55990a5f2b7dc9c4fa9ffd1741&quot; class=&quot;origin_image zh-lightbox-thumb lazy&quot; width=&quot;1168&quot; data-original=&quot;https://picx.zhimg.com/v2-3a229baa719a0783927528dae22a9f13_r.jpg&quot; data-actualsrc=&quot;https://picx.zhimg.com/v2-3a229baa719a0783927528dae22a9f13_1440w.jpg&quot; height=&quot;604&quot; data-lazy-status=&quot;ok&quot;/&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p data-pid=&quot;WE5U4LFE&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;vZsJDWLl&quot;&gt;三、完整可运行 Python 生产代码&lt;/p&gt;&lt;p data-pid=&quot;bJQkfkJB&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;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;DeliKeywordSearchClient:
&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.base_url&amp;nbsp;=&amp;nbsp;&amp;quot;https://api.delicloud.com/v2/open&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.api_module&amp;nbsp;=&amp;nbsp;&amp;quot;goods&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.api_cmd&amp;nbsp;=&amp;nbsp;&amp;quot;goods.search.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;build_hmac_sign(self,&amp;nbsp;body:&amp;nbsp;Dict,&amp;nbsp;timestamp:&amp;nbsp;str)&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;得力官方Header+报文联合HMAC-SHA256标准签名&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;body_json&amp;nbsp;=&amp;nbsp;json.dumps(body,&amp;nbsp;separators=(&amp;quot;,&amp;quot;,&amp;nbsp;&amp;quot;:&amp;quot;),&amp;nbsp;ensure_ascii=False)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_source&amp;nbsp;=&amp;nbsp;f&amp;quot;POST/v2/open{self.api_module}{self.api_cmd}{timestamp}{body_json}&amp;quot;
&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_source.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_obj.hexdigest().lower()

&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;cat_code:&amp;nbsp;str&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;,&amp;nbsp;only_gov:&amp;nbsp;int&amp;nbsp;=&amp;nbsp;0)&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;len(keyword.strip())&amp;nbsp;&amp;lt;&amp;nbsp;1&amp;nbsp;or&amp;nbsp;len(keyword)&amp;nbsp;&amp;gt;&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;return&amp;nbsp;{&amp;quot;code&amp;quot;:&amp;nbsp;-1,&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;&amp;quot;关键词长度1-30字符&amp;quot;,&amp;nbsp;&amp;quot;goods_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;goods_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;body_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;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;pageIndex&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;onlyGovPurchase&amp;quot;:&amp;nbsp;only_gov
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;body_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;body_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;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;body_params[&amp;quot;minBuyNum&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;cat_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;body_params[&amp;quot;categoryCode&amp;quot;]&amp;nbsp;=&amp;nbsp;cat_code
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign&amp;nbsp;=&amp;nbsp;self.build_hmac_sign(body_params,&amp;nbsp;timestamp)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;headers&amp;nbsp;=&amp;nbsp;{
&amp;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-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;Api-Module&amp;quot;:&amp;nbsp;self.api_module,
&amp;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;Api-Cmd&amp;quot;:&amp;nbsp;self.api_cmd,
&amp;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;Sign&amp;quot;:&amp;nbsp;sign,
&amp;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;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;}
&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.base_url,&amp;nbsp;headers=headers,&amp;nbsp;json=body_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_query(keyword,&amp;nbsp;page,&amp;nbsp;page_size,&amp;nbsp;min_price,&amp;nbsp;max_price,&amp;nbsp;min_buy,&amp;nbsp;cat_code,&amp;nbsp;only_gov)
&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;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_data.get(&amp;quot;msg&amp;quot;,&amp;nbsp;&amp;quot;接口业务异常&amp;quot;),&amp;nbsp;&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;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;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;item_code&amp;quot;:&amp;nbsp;item.get(&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&amp;quot;:&amp;nbsp;item.get(&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;category_name&amp;quot;:&amp;nbsp;item.get(&amp;quot;categoryName&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;minBuyNum&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;retail_price&amp;quot;:&amp;nbsp;float(item.get(&amp;quot;salePrice&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;market_price&amp;quot;:&amp;nbsp;float(item.get(&amp;quot;marketPrice&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;box_spec&amp;quot;:&amp;nbsp;item.get(&amp;quot;boxNum&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;total_stock&amp;quot;:&amp;nbsp;item.get(&amp;quot;totalStock&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;saleCount&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;support_gov&amp;quot;:&amp;nbsp;bool(int(item.get(&amp;quot;onlyGovPurchase&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(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;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;goods_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_price=None,&amp;nbsp;max_price=None,&amp;nbsp;min_buy=None,&amp;nbsp;cat_code=&amp;quot;&amp;quot;,&amp;nbsp;only_gov=0):
&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_price,&amp;nbsp;max_price,&amp;nbsp;min_buy,&amp;nbsp;cat_code,&amp;nbsp;only_gov)
&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;DeliKeywordSearchClient(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_key=&amp;quot;开发者后台App-Key&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_secret=&amp;quot;开发者后台App-Secret密钥&amp;quot;
&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_search_goods(keyword=&amp;quot;中性笔&amp;quot;,&amp;nbsp;min_price=5,&amp;nbsp;max_price=50,&amp;nbsp;min_buy=10,&amp;nbsp;only_gov=1)
&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;MspAeEMD&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;时间戳强制 13 位毫秒数值，秒级时间戳会直接判定签名不匹配，多数简易教程未做强制约束。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;业务报文必须压缩无空格 JSON，格式化换行、空格会改变签名源字符串，鉴权永久失败。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Api-Module、Api-Cmd 必须放入 Header 参与加密，遗漏任一头部字段都会校验不通过。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;onlyGovPurchase 政企采购标签仅企业签约账号可生效，普通经销商应用筛选无效果。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;pageSize 上限 50，超过阈值返回参数非法，批量采集建议 30 条每页，平衡同步速度与风控限制。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Mon, 06 Jul 2026 16:37:21 +0800</pubDate></item></channel></rss>