<?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://alexob.com/</link><description>Good Luck To You!</description><item><title>《拼多多开放平台API预充值踩坑：0.01元/百次背后的到账延迟与欠费停调》（附python源码）</title><link>https://alexob.com/?id=447</link><description>&lt;div class=&quot;ybc-p&quot;&gt;拼多多开放平台（POP Open Platform）采用&lt;strong&gt;预充值扣费模式&lt;/strong&gt;，基础API云内调用标准为 &lt;strong&gt;0.01元/百次&lt;/strong&gt;，云外为 &lt;strong&gt;0.1元/百次&lt;/strong&gt;，增值API分别为 &lt;strong&gt;0.03元/百次&lt;/strong&gt; 和 &lt;strong&gt;0.3元/百次&lt;/strong&gt;。其核心坑点在于：&lt;strong&gt;充值到账非实时（财务审核/银行通道延迟）、扣费按日结算滞后、余额不足会直接切断API调用（返回错误而非降级）&lt;/strong&gt;，且不会在调用失败时给出明确的“余额不足”提示，极易导致ERP漏单。&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;一、三大核心踩坑点拆解&lt;/h2&gt;&lt;ul class=&quot;ybc-ul-component list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;到账延迟（隐形断层）&lt;/strong&gt;：充值后通常需要财务审核或走银行通道，并非像云服务器那样秒级到账。如果在余额临界点时充值，短时间内仍未到账，调用会继续失败。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;欠费停调（硬切断）&lt;/strong&gt;：拼多多不像某些平台有缓冲期，当预充值账户余额为 &lt;strong&gt;0&lt;/strong&gt; 或 &lt;strong&gt;负数&lt;/strong&gt; 时，接口会直接返回调用失败（通常为系统级错误码，如 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;50001&lt;/code&gt; 权限/费用相关错误，具体以当期文档为准），&lt;strong&gt;不会触发限流（429）而是直接业务中断&lt;/strong&gt;，订单同步瞬间停止。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;扣费滞后感知&lt;/strong&gt;：官方按日统计扣除，控制台看到的余额可能不是实时扣减后的数值，容易误判还有余量而去睡大觉，醒来发现半夜断了好几个小时。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;二、防御性编码：余额监控 + 预充值预警 + 调用熔断（Python源码）&lt;/h2&gt;&lt;div class=&quot;ybc-p&quot;&gt;建议在ERP调度任务中嵌入一个 &lt;strong&gt;GuardedPddClient&lt;/strong&gt;，在每次批量调用前校验本地缓存的余额水位，低于阈值直接告警并暂停非核心任务。&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;pdd_api_guard.py
&amp;quot;&amp;quot;&amp;quot;
拼多多API预充值防御客户端
-&amp;nbsp;模拟获取账户余额（实际需调用拼多多费用查询接口或读取邮件/站内信）
-&amp;nbsp;本地水位阈值判断
-&amp;nbsp;欠费熔断&amp;nbsp;+&amp;nbsp;企微/钉钉告警
依赖:&amp;nbsp;requests
&amp;quot;&amp;quot;&amp;quot;
import&amp;nbsp;time
import&amp;nbsp;requests
import&amp;nbsp;hashlib
import&amp;nbsp;json
from&amp;nbsp;datetime&amp;nbsp;import&amp;nbsp;datetime

#&amp;nbsp;==================&amp;nbsp;配置区&amp;nbsp;==================
APP_KEY&amp;nbsp;=&amp;nbsp;&amp;quot;YOUR_PDD_APP_KEY&amp;quot;
APP_SECRET&amp;nbsp;=&amp;nbsp;&amp;quot;YOUR_PDD_APP_SECRET&amp;quot;
#&amp;nbsp;拼多多网关
GW&amp;nbsp;=&amp;nbsp;&amp;quot;https://gw-api.pinduoduo.com/api/router&amp;quot;
#&amp;nbsp;预警阈值：当预估或查询余额&amp;nbsp;&amp;lt;&amp;nbsp;预计1天消耗量时告警
WARNING_AMOUNT&amp;nbsp;=&amp;nbsp;10.0&amp;nbsp;&amp;nbsp;#&amp;nbsp;单位：元（例如预留10元≈100万次基础调用）
CHECK_INTERVAL&amp;nbsp;=&amp;nbsp;1800&amp;nbsp;&amp;nbsp;#&amp;nbsp;每30分钟校验一次余额
#&amp;nbsp;============================================
封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex
class&amp;nbsp;PddAccountGuard:
&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.last_check&amp;nbsp;=&amp;nbsp;0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.cached_balance&amp;nbsp;=&amp;nbsp;None

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_sign(self,&amp;nbsp;params:&amp;nbsp;dict)&amp;nbsp;-&amp;gt;&amp;nbsp;str:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;拼多多MD5签名:&amp;nbsp;secret&amp;nbsp;+&amp;nbsp;sorted_kv&amp;nbsp;+&amp;nbsp;secret&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;filtered&amp;nbsp;=&amp;nbsp;sorted(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&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;v&amp;nbsp;is&amp;nbsp;not&amp;nbsp;None&amp;nbsp;and&amp;nbsp;str(v).strip()&amp;nbsp;!=&amp;nbsp;&amp;quot;&amp;quot;&amp;nbsp;and&amp;nbsp;k&amp;nbsp;!=&amp;nbsp;&amp;quot;sign&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qs&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;.join(f&amp;quot;{k}{v}&amp;quot;&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;filtered)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw&amp;nbsp;=&amp;nbsp;f&amp;quot;{self.app_secret}{qs}{self.app_secret}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;hashlib.md5(raw.encode(&amp;quot;utf-8&amp;quot;)).hexdigest().upper()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_call_raw(self,&amp;nbsp;method:&amp;nbsp;str,&amp;nbsp;biz:&amp;nbsp;dict)&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;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;client_id&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;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;str(int(time.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;quot;data_type&amp;quot;:&amp;nbsp;&amp;quot;JSON&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;v&amp;quot;:&amp;nbsp;&amp;quot;V1.0&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;**biz
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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._sign(params)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r&amp;nbsp;=&amp;nbsp;requests.post(GW,&amp;nbsp;data=params,&amp;nbsp;timeout=15)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r.raise_for_status()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;r.json()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;fetch_balance_mock(self)&amp;nbsp;-&amp;gt;&amp;nbsp;float:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;【重要】
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;拼多多开放平台需查阅是否有公开的“查询账户余额”接口。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;若无直接接口，通常做法：
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.&amp;nbsp;爬取/解析站内信的扣费通知
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.&amp;nbsp;根据本地调用计数器&amp;nbsp;*&amp;nbsp;单价反向估算（误差大，仅作预警参考）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.&amp;nbsp;人工充值后在配置中心手动更新&amp;nbsp;balance
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;这里用&amp;nbsp;mock&amp;nbsp;模拟一个余额值
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;TODO:&amp;nbsp;替换为真实获取逻辑
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mock_balance&amp;nbsp;=&amp;nbsp;8.50&amp;nbsp;&amp;nbsp;#&amp;nbsp;模拟余额只剩8.5元
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.cached_balance&amp;nbsp;=&amp;nbsp;mock_balance
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;mock_balance

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;check_balance_safe(self,&amp;nbsp;est_daily_cost:&amp;nbsp;float):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;检查余额是否安全
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;est_daily_cost:&amp;nbsp;预估单日消耗成本（调用次数/100&amp;nbsp;*&amp;nbsp;0.01）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;now&amp;nbsp;=&amp;nbsp;time.time()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;now&amp;nbsp;-&amp;nbsp;self.last_check&amp;nbsp;&amp;lt;&amp;nbsp;CHECK_INTERVAL&amp;nbsp;and&amp;nbsp;self.cached_balance&amp;nbsp;is&amp;nbsp;not&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;bal&amp;nbsp;=&amp;nbsp;self.cached_balance
&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;bal&amp;nbsp;=&amp;nbsp;self.fetch_balance_mock()
&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.last_check&amp;nbsp;=&amp;nbsp;now

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;bal&amp;nbsp;&amp;lt;&amp;nbsp;WARNING_AMOUNT:
&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._alert(f&amp;quot;🚨&amp;nbsp;拼多多API余额预警：剩余&amp;nbsp;¥{bal:.2f}，低于安全阈值&amp;nbsp;¥{WARNING_AMOUNT}，预估日耗&amp;nbsp;¥{est_daily_cost:.2f}，请立即充值！&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;可选：触发非核心任务熔断
&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;False
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;✅&amp;nbsp;余额安全：剩余&amp;nbsp;¥{bal:.2f}，日耗预估&amp;nbsp;¥{est_daily_cost:.2f}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;True

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_alert(self,&amp;nbsp;msg:&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;简易告警（实际接入企微/钉钉Webhook）&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ts&amp;nbsp;=&amp;nbsp;datetime.now().strftime(&amp;quot;%Y-%m-%d&amp;nbsp;%H:%M:%S&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;[ALERT&amp;nbsp;{ts}]&amp;nbsp;{msg}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;示例：requests.post(WECOM_WEBHOOK,&amp;nbsp;json={&amp;quot;msgtype&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;text&amp;quot;:{&amp;quot;content&amp;quot;:msg}})

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;safe_call(self,&amp;nbsp;method:&amp;nbsp;str,&amp;nbsp;biz:&amp;nbsp;dict,&amp;nbsp;est_daily_cost:&amp;nbsp;float&amp;nbsp;=&amp;nbsp;0):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;带余额守卫的调用
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;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;self.check_balance_safe(est_daily_cost):
&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;RuntimeError(&amp;quot;API调用已熔断：账户余额不足，请充值后再试&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._call_raw(method,&amp;nbsp;biz)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;拼多多错误码判断（示例，以官方文档为准）
&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;error_response&amp;quot;&amp;nbsp;in&amp;nbsp;resp:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err&amp;nbsp;=&amp;nbsp;resp[&amp;quot;error_response&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;code&amp;nbsp;=&amp;nbsp;err.get(&amp;quot;code&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;err.get(&amp;quot;message&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;如果是费用/权限类错误，立即告警
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;code&amp;nbsp;in&amp;nbsp;(50001,&amp;nbsp;40001):&amp;nbsp;&amp;nbsp;#&amp;nbsp;示意：可能涉及权限/费用/密钥错误
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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._alert(f&amp;quot;❌&amp;nbsp;API返回疑似欠费/权限错误&amp;nbsp;[{code}]:&amp;nbsp;{msg}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;PDD[{code}]:&amp;nbsp;{msg}&amp;quot;)
&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;resp
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;requests.exceptions.RequestException&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;网络层错误也要排查是否因欠费被网关拒绝
&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._alert(f&amp;quot;网络层异常，需排查是否因欠费停调：{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;raise


#&amp;nbsp;=====================&amp;nbsp;使用示例&amp;nbsp;=====================
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client&amp;nbsp;=&amp;nbsp;PddAccountGuard(APP_KEY,&amp;nbsp;APP_SECRET)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;假设每天调用&amp;nbsp;50万次基础API，云内成本&amp;nbsp;=&amp;nbsp;5000&amp;nbsp;*&amp;nbsp;0.01&amp;nbsp;=&amp;nbsp;50元/天
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EST_COST_PER_DAY&amp;nbsp;=&amp;nbsp;50.0

&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;在定时任务（如APScheduler）拉取订单前先过守卫
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;client.safe_call(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;pdd.order.list.get&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;start_confirm_at&amp;quot;:&amp;nbsp;1620000000,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;end_confirm_at&amp;quot;:&amp;nbsp;1620086400,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;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;page_size&amp;quot;:&amp;nbsp;100
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;est_daily_cost=EST_COST_PER_DAY
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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(&amp;quot;调用成功:&amp;quot;,&amp;nbsp;result.get(&amp;quot;order_list_get_response&amp;quot;,&amp;nbsp;{}).get(&amp;quot;total_count&amp;quot;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;RuntimeError&amp;nbsp;as&amp;nbsp;re:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;业务中断:&amp;nbsp;{re}&amp;quot;)
&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;print(f&amp;quot;接口错误:&amp;nbsp;{e}&amp;quot;)&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;三、生产级避坑清单&lt;/h2&gt;&lt;ul class=&quot;ybc-ul-component list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;双账户隔离&lt;/strong&gt;：不要用主商家账号直接创建应用扣费，尽量用&lt;strong&gt;服务商/子账号&lt;/strong&gt;隔离API预充值账户，防止误扣店铺保证金关联资金。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;充值节奏&lt;/strong&gt;：不要等告警再充，&lt;strong&gt;设置“余额 &amp;lt; 3天预估消耗”自动触发充值流程&lt;/strong&gt;（甚至写脚本调用企业对公转账API，若开放），拼多多到账有延迟，必须留缓冲。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;区分错误码&lt;/strong&gt;：在统一异常处理里，把拼多多的 &lt;strong&gt;系统级错误（如签名错、权限错、费用相关错误）&lt;/strong&gt; 与 &lt;strong&gt;业务级错误（如参数非法）&lt;/strong&gt; 分开日志存储，欠费停调通常伴随特定系统级code，需第一时间钉钉轰炸。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;本地计数器兜底&lt;/strong&gt;：即使拿不到实时余额，也在程序里维护一个 &lt;strong&gt;(调用次数 // 100) * 0.01&lt;/strong&gt; 的本地累减计数器，结合最后一次查到的官方余额做“双重校验”，防止控制台数据滞后导致击穿。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;一句话总结：拼多多API &lt;strong&gt;0.01元/百次&lt;/strong&gt; 虽便宜，但&lt;strong&gt;预充值+硬切断&lt;/strong&gt;机制是ERP杀手，必须在代码层做&lt;strong&gt;余额守卫、提前充值、错误码甄别&lt;/strong&gt;，否则一次半夜欠费能让全店订单同步瘫痪数小时。&lt;/div&gt;&lt;/blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;如果你愿意，我可以帮你把这套 &lt;strong&gt;余额守卫逻辑&lt;/strong&gt; 嵌进你现有的 &lt;strong&gt;APScheduler 订单增量同步脚本&lt;/strong&gt; 里，并补一份 &lt;strong&gt;拼多多常见系统级错误码与欠费特征对照表&lt;/strong&gt; 吗？&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Sat, 18 Jul 2026 09:48:26 +0800</pubDate></item><item><title>《1688开放平台基础API真免费？QPS 10的限制怎么破（附GuardedClient源码）》</title><link>https://alexob.com/?id=446</link><description>&lt;div class=&quot;ybc-p&quot;&gt;1688开放平台的&lt;strong&gt;基础API（商品搜索&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;alibaba.offer.search&lt;/code&gt;、详情&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;alibaba.item.get&lt;/code&gt;、订单查询等）确实是免费的&lt;/strong&gt;，但默认受&lt;strong&gt;QPS限制（通常搜索类≈10/s，订单类≈20/s）&lt;/strong&gt;，超限会返回 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;ISP_FLOW_CONTROL_LIMIT&lt;/code&gt; 或 HTTP 429。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;“破”QPS 10 的本质解法有三层：&lt;/strong&gt;&lt;/div&gt;&lt;ol class=&quot;ybc-ol-component ybc-ol-component_1 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;客户端自律&lt;/strong&gt;：令牌桶限速在 &lt;strong&gt;8~9 QPS&lt;/strong&gt;（留余量防触发风控）。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;架构级扩容&lt;/strong&gt;：申请多个同企业实名下的AppKey做&lt;strong&gt;轮询分担&lt;/strong&gt;（理论QPS = 单Key上限 × N）。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;官方提额&lt;/strong&gt;：在开放平台购买&lt;strong&gt;资源包&lt;/strong&gt;将单Key提至50/100/200 QPS，或升级企业应用。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class=&quot;ybc-p&quot;&gt;以下是集成了&lt;strong&gt;令牌桶限速 + 多Key轮询 + 限流退避&lt;/strong&gt;的 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;GuardedClient&lt;/code&gt; 源码：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;guarded_1688_client.py
&amp;quot;&amp;quot;&amp;quot;
1688开放平台&amp;nbsp;GuardedClient
-&amp;nbsp;多AppKey轮询突破单Key&amp;nbsp;QPS限制
-&amp;nbsp;令牌桶单Key限速&amp;nbsp;(防触发ISP_FLOW_CONTROL_LIMIT)
-&amp;nbsp;捕获限流异常自动CoolDown&amp;nbsp;+&amp;nbsp;指数退避重试
依赖:&amp;nbsp;pip&amp;nbsp;install&amp;nbsp;requests
&amp;quot;&amp;quot;&amp;quot;
import&amp;nbsp;hashlib
import&amp;nbsp;json
import&amp;nbsp;time
import&amp;nbsp;requests
from&amp;nbsp;typing&amp;nbsp;import&amp;nbsp;Dict,&amp;nbsp;List
from&amp;nbsp;threading&amp;nbsp;import&amp;nbsp;Lock

#&amp;nbsp;------------------&amp;nbsp;配置区&amp;nbsp;------------------
APP_KEYS_SECRETS&amp;nbsp;=&amp;nbsp;[
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;同一企业实名下创建的多个自用型应用
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;quot;key&amp;quot;:&amp;nbsp;&amp;quot;YOUR_APP_KEY_1&amp;quot;,&amp;nbsp;&amp;quot;secret&amp;quot;:&amp;nbsp;&amp;quot;YOUR_APP_SECRET_1&amp;quot;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;quot;key&amp;quot;:&amp;nbsp;&amp;quot;YOUR_APP_KEY_2&amp;quot;,&amp;nbsp;&amp;quot;secret&amp;quot;:&amp;nbsp;&amp;quot;YOUR_APP_SECRET_2&amp;quot;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;{&amp;quot;key&amp;quot;:&amp;nbsp;&amp;quot;...&amp;quot;,&amp;nbsp;&amp;quot;secret&amp;quot;:&amp;nbsp;&amp;quot;...&amp;quot;},
]
GW&amp;nbsp;=&amp;nbsp;&amp;quot;https://gw.api.1688.com/openapi&amp;quot;
MAX_QPS_PER_KEY&amp;nbsp;=&amp;nbsp;8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;单Key保守限速（官方≈10，留余量）
TOKEN_BUCKET_CAP&amp;nbsp;=&amp;nbsp;MAX_QPS_PER_KEY
#&amp;nbsp;--------------------------------------------

封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex
#&amp;nbsp;=====&amp;nbsp;单Key令牌桶&amp;nbsp;=====
class&amp;nbsp;TokenBucket:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;rate:&amp;nbsp;float):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.rate&amp;nbsp;=&amp;nbsp;rate
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.tokens&amp;nbsp;=&amp;nbsp;rate
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.ts&amp;nbsp;=&amp;nbsp;time.monotonic()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.lock&amp;nbsp;=&amp;nbsp;Lock()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;wait(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with&amp;nbsp;self.lock:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;now&amp;nbsp;=&amp;nbsp;time.monotonic()
&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&amp;nbsp;=&amp;nbsp;min(self.rate,&amp;nbsp;self.tokens&amp;nbsp;+&amp;nbsp;(now&amp;nbsp;-&amp;nbsp;self.ts)&amp;nbsp;*&amp;nbsp;self.rate)
&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.ts&amp;nbsp;=&amp;nbsp;now
&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;self.tokens&amp;nbsp;&amp;lt;&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;time.sleep((1&amp;nbsp;-&amp;nbsp;self.tokens)&amp;nbsp;/&amp;nbsp;self.rate&amp;nbsp;+&amp;nbsp;0.005)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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.tokens&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;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.tokens&amp;nbsp;-=&amp;nbsp;1


#&amp;nbsp;=====&amp;nbsp;多Key轮询Guard&amp;nbsp;=====
class&amp;nbsp;Guarded1688Client:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;apps:&amp;nbsp;List[Dict],&amp;nbsp;gw=GW):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.apps&amp;nbsp;=&amp;nbsp;apps
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.gw&amp;nbsp;=&amp;nbsp;gw
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.idx&amp;nbsp;=&amp;nbsp;0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.idx_lock&amp;nbsp;=&amp;nbsp;Lock()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;为每个Key初始化独立令牌桶
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.buckets&amp;nbsp;=&amp;nbsp;[TokenBucket(MAX_QPS_PER_KEY)&amp;nbsp;for&amp;nbsp;_&amp;nbsp;in&amp;nbsp;apps]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.err_streak&amp;nbsp;=&amp;nbsp;[0]&amp;nbsp;*&amp;nbsp;len(apps)&amp;nbsp;&amp;nbsp;#&amp;nbsp;连续限流计数

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_next_app(self)&amp;nbsp;-&amp;gt;&amp;nbsp;(int,&amp;nbsp;Dict,&amp;nbsp;TokenBucket):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with&amp;nbsp;self.idx_lock:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;简单轮询，可改为按err_streak跳过冷却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;i&amp;nbsp;=&amp;nbsp;self.idx
&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.idx&amp;nbsp;=&amp;nbsp;(self.idx&amp;nbsp;+&amp;nbsp;1)&amp;nbsp;%&amp;nbsp;len(self.apps)
&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;i,&amp;nbsp;self.apps[i],&amp;nbsp;self.buckets[i]

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_sign_1688(self,&amp;nbsp;params:&amp;nbsp;Dict,&amp;nbsp;secret:&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;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1688签名:&amp;nbsp;md5(secret&amp;nbsp;+&amp;nbsp;sort(KV)&amp;nbsp;+&amp;nbsp;secret)&amp;nbsp;-&amp;gt;&amp;nbsp;大写
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;注意:&amp;nbsp;1688部分网关用&amp;nbsp;HmacMD5，这里以通用MD5为例，实际请对齐文档
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;filtered&amp;nbsp;=&amp;nbsp;sorted(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&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;v&amp;nbsp;is&amp;nbsp;not&amp;nbsp;None&amp;nbsp;and&amp;nbsp;str(v).strip()&amp;nbsp;!=&amp;nbsp;&amp;quot;&amp;quot;&amp;nbsp;and&amp;nbsp;k&amp;nbsp;!=&amp;nbsp;&amp;quot;sign&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qs&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;.join(f&amp;quot;{k}{v}&amp;quot;&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;filtered)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw&amp;nbsp;=&amp;nbsp;f&amp;quot;{secret}{qs}{secret}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;hashlib.md5(raw.encode(&amp;quot;utf-8&amp;quot;)).hexdigest().upper()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;safe_call(self,&amp;nbsp;method:&amp;nbsp;str,&amp;nbsp;biz:&amp;nbsp;Dict,&amp;nbsp;token:&amp;nbsp;str&amp;nbsp;=&amp;nbsp;None,&amp;nbsp;max_retry=5):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;method:&amp;nbsp;如&amp;nbsp;alibaba.item.get
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;biz:&amp;nbsp;业务参数
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;att&amp;nbsp;in&amp;nbsp;range(max_retry):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i,&amp;nbsp;app,&amp;nbsp;bucket&amp;nbsp;=&amp;nbsp;self._next_app()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bucket.wait()&amp;nbsp;&amp;nbsp;#&amp;nbsp;单Key&amp;nbsp;QPS守护

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;构造1688&amp;nbsp;param2风格或router风格参数（示意，按你网关调整）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;api_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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;method&amp;quot;:&amp;nbsp;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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;app_key&amp;quot;:&amp;nbsp;app[&amp;quot;key&amp;quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;str(int(time.time()&amp;nbsp;*&amp;nbsp;1000)),&amp;nbsp;&amp;nbsp;#&amp;nbsp;1688用毫秒
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;format&amp;quot;:&amp;nbsp;&amp;quot;json&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;v&amp;quot;:&amp;nbsp;&amp;quot;2.0&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sign_method&amp;quot;:&amp;nbsp;&amp;quot;md5&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;**biz
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&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;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;api_params[&amp;quot;access_token&amp;quot;]&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;api_params[&amp;quot;sign&amp;quot;]&amp;nbsp;=&amp;nbsp;self._sign_1688(api_params,&amp;nbsp;app[&amp;quot;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;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;1688&amp;nbsp;param2&amp;nbsp;路径示例:&amp;nbsp;/openapi/param2/1/{method}/{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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url&amp;nbsp;=&amp;nbsp;f&amp;quot;{self.gw}/param2/1/{method}/{app[&amp;#39;key&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;resp&amp;nbsp;=&amp;nbsp;requests.post(url,&amp;nbsp;data=api_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;resp.raise_for_status()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d&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;1688成功通常在顶层，错误在&amp;nbsp;error_response&amp;nbsp;或&amp;nbsp;code!=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;if&amp;nbsp;&amp;quot;error_response&amp;quot;&amp;nbsp;in&amp;nbsp;d:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err&amp;nbsp;=&amp;nbsp;d[&amp;quot;error_response&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;code&amp;nbsp;=&amp;nbsp;str(err.get(&amp;quot;code&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;msg&amp;nbsp;=&amp;nbsp;err.get(&amp;quot;msg&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;限流判定
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;&amp;quot;FLOW_CONTROL&amp;quot;&amp;nbsp;in&amp;nbsp;msg&amp;nbsp;or&amp;nbsp;code&amp;nbsp;==&amp;nbsp;&amp;quot;15&amp;quot;&amp;nbsp;or&amp;nbsp;resp.status_code&amp;nbsp;==&amp;nbsp;429:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.err_streak[i]&amp;nbsp;+=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;back&amp;nbsp;=&amp;nbsp;min(2&amp;nbsp;**&amp;nbsp;self.err_streak[i],&amp;nbsp;8)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;⚠️&amp;nbsp;Key[{i}]&amp;nbsp;限流，冷却&amp;nbsp;{back}s&amp;nbsp;后重试...&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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(back)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;Exception(f&amp;quot;1688[{code}]:&amp;nbsp;{msg}&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;成功重置错误计数
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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.err_streak[i]&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;d

&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;requests.exceptions.HTTPError&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;&amp;quot;429&amp;quot;&amp;nbsp;in&amp;nbsp;str(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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.err_streak[i]&amp;nbsp;+=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(2&amp;nbsp;**&amp;nbsp;att)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;raise

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;RuntimeError(&amp;quot;1688&amp;nbsp;API&amp;nbsp;多次重试仍限流，建议降低QPS或增加AppKey数量&amp;quot;)


#&amp;nbsp;=====================&amp;nbsp;使用示例&amp;nbsp;=====================
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client&amp;nbsp;=&amp;nbsp;Guarded1688Client(APP_KEYS_SECRETS)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;查商品详情（免费接口，受QPS限制）
&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;result&amp;nbsp;=&amp;nbsp;client.safe_call(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;alibaba.item.get&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;quot;item_id&amp;quot;:&amp;nbsp;&amp;quot;612345678901&amp;quot;,&amp;nbsp;&amp;quot;fields&amp;quot;:&amp;nbsp;&amp;quot;title,price,sku_list,amount_on_sale&amp;quot;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;token=None&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;print(&amp;quot;✅&amp;nbsp;1688商品数据:&amp;quot;,&amp;nbsp;result.get(&amp;quot;alibaba_item_get_response&amp;quot;,&amp;nbsp;{}).get(&amp;quot;result&amp;quot;,&amp;nbsp;{}).get(&amp;quot;title&amp;quot;))
&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;print(&amp;quot;❌&amp;quot;,&amp;nbsp;e)&lt;/pre&gt;&lt;h2&gt;关键设计说明&lt;/h2&gt;&lt;ol class=&quot;ybc-ol-component ybc-ol-component_1 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;多Key轮询&lt;/strong&gt;：通过 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;Guarded1688Client&lt;/code&gt; 在多个AppKey间分发请求，理论上N个Key可将总QPS提升至 &lt;strong&gt;N × 10&lt;/strong&gt;。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;令牌桶限速&lt;/strong&gt;：每个Key独立令牌桶，强制单Key ≤ 8~9 QPS，避免触碰官方阈值被拉黑。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;限流自愈&lt;/strong&gt;：捕获 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;FLOW_CONTROL&lt;/code&gt; / 429 后对该Key做指数退避冷却，并自动切换下一个Key重试。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;合规提醒&lt;/strong&gt;：多Key必须是&lt;strong&gt;同一企业主体下合法创建的不同应用&lt;/strong&gt;，用于分散合法业务流量，非绕过封禁。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;如果日调用量极大（&amp;gt;50万次）或对实时性要求高，&lt;strong&gt;首选买官方资源包提单Key QPS至50/100&lt;/strong&gt;，成本远低于维护多应用复杂度；多Key方案更适合初创期零成本扛中等并发的场景。&lt;/div&gt;&lt;/blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;如果你愿意，我可以帮你把这套 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;GuardedClient&lt;/code&gt; 改成 &lt;strong&gt;Redis中心化令牌桶（支持分布式多进程调度）&lt;/strong&gt;，或者补一份 &lt;strong&gt;1688订单增量同步（&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;alibaba.trade.buyer.list&lt;/code&gt;）的完整断点续跑脚本&lt;/strong&gt; 吗？&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Sat, 18 Jul 2026 09:02:34 +0800</pubDate></item><item><title>🔄《京东JOS宙斯迁移实录：jingdong.ware.get → jingdong.ware.read.get 平滑切（2026版）》（附Python源码）</title><link>https://alexob.com/?id=445</link><description>&lt;h1&gt;🔄《京东JOS宙斯迁移实录：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.ware.get&lt;/code&gt; → &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.ware.read.get&lt;/code&gt; 平滑切（2026版）》（附Python源码）&lt;/h1&gt;&lt;div class=&quot;ybc-p&quot;&gt;京东宙斯（JOS）在2024~2026年间持续推进接口标准化，老接口&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.ware.get&lt;/code&gt;（及别名&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;360buy.ware.get&lt;/code&gt;）已进入&lt;strong&gt;维护期，新应用不再支持申请&lt;/strong&gt;，官方推荐统一迁移至&lt;strong&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.ware.read.get&lt;/code&gt;&lt;/strong&gt;（只读商品读取接口，权限更清晰、支持SKU快照字段）。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;迁移只需改method + 微调fields，网关/签名/AccessToken完全不变&lt;/strong&gt;，下面给你一份可直接执行的平滑切换实录。&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;一、老 vs 新接口对照（一目了然）&lt;/h2&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div class=&quot;hyc-common-markdown__table-actions-sticky&quot; id=&quot;tableActionsPanel&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;维度&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;老接口（即将下线）&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;新接口（推荐）&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;Method&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jingdong.ware.get&lt;/code&gt; / &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;360buy.ware.get&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;✅ &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jingdong.ware.read.get&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;网关&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;https://api.jd.com/routerjson&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;完全相同&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;签名算法&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;MD5(AppSecret+KV_ASCII+AppSecret) 秒级timestamp&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;完全相同&lt;/strong&gt;（一行不改）&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;必传参数&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;wareId&lt;/code&gt;, &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;fields&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;完全相同&lt;/strong&gt;（&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;wareId&lt;/code&gt;, &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;fields&lt;/code&gt;）&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;返回根节点&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jingdong_ware_get_response.ware&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jingdong_ware_read_get_response.ware&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;SKU库存可见&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;需传seller token&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;相同&lt;/strong&gt;（传seller token可看&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;stockNum&lt;/code&gt; in &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;skus_json&lt;/code&gt;）&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;权限申请&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;老入口（已关闭新申请）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;应用→接口权限→申请&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jingdong.ware.read.get&lt;/code&gt;（即时生效）&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;✅ &lt;strong&gt;迁移量&lt;/strong&gt;：代码中只改 &lt;strong&gt;method 字符串&lt;/strong&gt; + &lt;strong&gt;fields 补全 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;skus_json,stock_num&lt;/code&gt;&lt;/strong&gt;，其余（Client/签名/网关/token）一行不动。&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;二、Python：老接口 vs 新接口调用对比 + 兼容封装&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;jd_ware_migration_2026.py
&amp;quot;&amp;quot;&amp;quot;
京东JOS宙斯迁移实录
old:&amp;nbsp;jingdong.ware.get&amp;nbsp;&amp;nbsp;→&amp;nbsp;&amp;nbsp;new:&amp;nbsp;jingdong.ware.read.get
同一个&amp;nbsp;JdClient&amp;nbsp;复用，仅&amp;nbsp;method&amp;nbsp;+&amp;nbsp;fields&amp;nbsp;不同
支持&amp;nbsp;沙箱/生产&amp;nbsp;切换
&amp;quot;&amp;quot;&amp;quot;
import&amp;nbsp;hashlib
import&amp;nbsp;json
import&amp;nbsp;requests
import&amp;nbsp;time
from&amp;nbsp;typing&amp;nbsp;import&amp;nbsp;Dict,&amp;nbsp;Optional


class&amp;nbsp;JdWareClient:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;京东JOS商品接口客户端（兼容新旧两套）&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GW_PROD&amp;nbsp;=&amp;nbsp;&amp;quot;https://api.jd.com/routerjson&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GW_SANDBOX&amp;nbsp;=&amp;nbsp;&amp;quot;https://api.sandbox.jd.com/routerjson&amp;quot;

&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;sandbox:&amp;nbsp;bool&amp;nbsp;=&amp;nbsp;False):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.ak&amp;nbsp;=&amp;nbsp;app_key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.ask&amp;nbsp;=&amp;nbsp;app_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.gw&amp;nbsp;=&amp;nbsp;self.GW_SANDBOX&amp;nbsp;if&amp;nbsp;sandbox&amp;nbsp;else&amp;nbsp;self.GW_PROD

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;─────&amp;nbsp;JOS&amp;nbsp;MD5签名（秒级timestamp，紧凑JSON）─────
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_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;filt&amp;nbsp;=&amp;nbsp;sorted(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&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;k&amp;nbsp;!=&amp;nbsp;&amp;quot;sign&amp;quot;&amp;nbsp;and&amp;nbsp;v&amp;nbsp;is&amp;nbsp;not&amp;nbsp;None&amp;nbsp;and&amp;nbsp;str(v).strip()&amp;nbsp;!=&amp;nbsp;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qs&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;.join(f&amp;quot;{k}{v}&amp;quot;&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;filt)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw&amp;nbsp;=&amp;nbsp;f&amp;quot;{self.ask}{qs}{self.ask}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;hashlib.md5(raw.encode(&amp;quot;utf-8&amp;quot;)).hexdigest().upper()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_call(self,&amp;nbsp;method:&amp;nbsp;str,&amp;nbsp;biz:&amp;nbsp;Dict,&amp;nbsp;token:&amp;nbsp;str&amp;nbsp;=&amp;nbsp;None)&amp;nbsp;-&amp;gt;&amp;nbsp;Dict:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&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.ak,
&amp;nbsp;&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;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;str(int(time.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;quot;format&amp;quot;:&amp;nbsp;&amp;quot;json&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;v&amp;quot;:&amp;nbsp;&amp;quot;2.0&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sign_method&amp;quot;:&amp;nbsp;&amp;quot;md5&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;360buy_param_json&amp;quot;:&amp;nbsp;json.dumps(biz,&amp;nbsp;ensure_ascii=False,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;separators=(&amp;#39;,&amp;#39;,&amp;nbsp;&amp;#39;:&amp;#39;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;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;p[&amp;quot;access_token&amp;quot;]&amp;nbsp;=&amp;nbsp;token
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[&amp;quot;sign&amp;quot;]&amp;nbsp;=&amp;nbsp;self._sign(p)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r&amp;nbsp;=&amp;nbsp;requests.post(self.gw,&amp;nbsp;data=p,&amp;nbsp;timeout=15)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r.raise_for_status()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d&amp;nbsp;=&amp;nbsp;r.json()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;提取响应（兼容新旧method对应的resp_key）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp_key&amp;nbsp;=&amp;nbsp;method.replace(&amp;quot;.&amp;quot;,&amp;nbsp;&amp;quot;_&amp;quot;)&amp;nbsp;+&amp;nbsp;&amp;quot;_response&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;resp_key&amp;nbsp;not&amp;nbsp;in&amp;nbsp;d:
&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;k&amp;nbsp;in&amp;nbsp;d:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;k.endswith(&amp;quot;_response&amp;quot;):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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_key&amp;nbsp;=&amp;nbsp;k
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;data&amp;nbsp;=&amp;nbsp;d.get(resp_key,&amp;nbsp;d)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;&amp;quot;error_response&amp;quot;&amp;nbsp;in&amp;nbsp;str(data):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err&amp;nbsp;=&amp;nbsp;d.get(resp_key,&amp;nbsp;{}).get(&amp;quot;error_response&amp;quot;)&amp;nbsp;or&amp;nbsp;d.get(&amp;quot;error_response&amp;quot;)
&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;err:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;code&amp;nbsp;=&amp;nbsp;str(err.get(&amp;quot;code&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;zh&amp;nbsp;=&amp;nbsp;err.get(&amp;quot;zh_desc&amp;quot;)&amp;nbsp;or&amp;nbsp;err.get(&amp;quot;en_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;sub&amp;nbsp;=&amp;nbsp;err.get(&amp;quot;sub_code&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;if&amp;nbsp;&amp;quot;no&amp;nbsp;permission&amp;quot;&amp;nbsp;in&amp;nbsp;zh:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;PermissionError(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f&amp;quot;❌&amp;nbsp;无权限：确认已申请&amp;nbsp;{method}&amp;nbsp;接口，订单类需传卖家AccessToken\n原始:&amp;nbsp;{zh}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;JOS[{code}]:&amp;nbsp;{zh}&amp;nbsp;sub={sub}&amp;quot;)
&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;JOS&amp;nbsp;error:&amp;nbsp;{d}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;data

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;───&amp;nbsp;老接口（不推荐，仅作对比/过渡期兼容）───
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_ware_old(self,&amp;nbsp;ware_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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fields:&amp;nbsp;str&amp;nbsp;=&amp;nbsp;None,&amp;nbsp;token:&amp;nbsp;str&amp;nbsp;=&amp;nbsp;None)&amp;nbsp;-&amp;gt;&amp;nbsp;Dict:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fields&amp;nbsp;=&amp;nbsp;fields&amp;nbsp;or&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;ware_id,title,price,jd_price,stock_num,skus_json,image_path&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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._call(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;jingdong.ware.get&amp;quot;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;←&amp;nbsp;老&amp;nbsp;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;wareId&amp;quot;:&amp;nbsp;ware_id,&amp;nbsp;&amp;quot;fields&amp;quot;:&amp;nbsp;fields},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;token
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;).get(&amp;quot;ware&amp;quot;,&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;get_ware_new(self,&amp;nbsp;ware_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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fields:&amp;nbsp;str&amp;nbsp;=&amp;nbsp;None,&amp;nbsp;token:&amp;nbsp;str&amp;nbsp;=&amp;nbsp;None)&amp;nbsp;-&amp;gt;&amp;nbsp;Dict:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fields&amp;nbsp;=&amp;nbsp;fields&amp;nbsp;or&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;ware_id,title,brand_name,cid,category_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;quot;price,jd_price,market_price,stock_num,&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;skus_json,image_path,desc,outer_id,approve_status&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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._call(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;jingdong.ware.read.get&amp;quot;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;←&amp;nbsp;新&amp;nbsp;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;wareId&amp;quot;:&amp;nbsp;ware_id,&amp;nbsp;&amp;quot;fields&amp;quot;:&amp;nbsp;fields},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;token
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;).get(&amp;quot;ware&amp;quot;,&amp;nbsp;{})


#&amp;nbsp;=========================================================
#&amp;nbsp;使用示例：平滑切换
#&amp;nbsp;=========================================================
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client&amp;nbsp;=&amp;nbsp;JdWareClient(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_key=&amp;quot;YOUR_JD_APP_KEY&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_secret=&amp;quot;YOUR_JD_APP_SECRET&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sandbox=False&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;沙箱测试&amp;nbsp;=&amp;nbsp;True
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WARE_ID&amp;nbsp;=&amp;nbsp;&amp;quot;100012345678&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;←&amp;nbsp;替换真实&amp;nbsp;wareId
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SELLER_TOKEN&amp;nbsp;=&amp;nbsp;None&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;查自己店铺SKU库存需传卖家AccessToken

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;★&amp;nbsp;迁移后只用这一行&amp;nbsp;★
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ware&amp;nbsp;=&amp;nbsp;client.get_ware_new(WARE_ID,&amp;nbsp;token=SELLER_TOKEN)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;✅&amp;nbsp;[新接口]&amp;nbsp;商品标题:&amp;quot;,&amp;nbsp;ware.get(&amp;quot;title&amp;quot;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;京东价:&amp;quot;,&amp;nbsp;ware.get(&amp;quot;jd_price&amp;quot;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;SPU库存:&amp;quot;,&amp;nbsp;ware.get(&amp;quot;stock_num&amp;quot;))

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;skus_json&amp;nbsp;解析（查自己店铺时才有真实库存）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;import&amp;nbsp;json&amp;nbsp;as&amp;nbsp;_j
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;skus_raw&amp;nbsp;=&amp;nbsp;ware.get(&amp;quot;skus_json&amp;quot;)&amp;nbsp;or&amp;nbsp;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;skus_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;skus&amp;nbsp;=&amp;nbsp;_j.loads(skus_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;print(f&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;SKU数:&amp;nbsp;{len(skus)}&amp;quot;)
&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;s&amp;nbsp;in&amp;nbsp;skus[: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;print(f&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;skuId:{s.get(&amp;#39;skuId&amp;#39;)}&amp;nbsp;价:{s.get(&amp;#39;jdPrice&amp;#39;)}&amp;nbsp;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f&amp;quot;库:{s.get(&amp;#39;stockNum&amp;#39;)}&amp;nbsp;商家码:{s.get(&amp;#39;outerId&amp;#39;,&amp;#39;&amp;#39;)}&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;\n→&amp;nbsp;迁移完成！仅需改&amp;nbsp;method=&amp;#39;jingdong.ware.read.get&amp;#39;&amp;nbsp;+&amp;nbsp;fields补skus_json&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;PermissionError&amp;nbsp;as&amp;nbsp;pe:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(pe)
&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;print(&amp;quot;❌&amp;quot;,&amp;nbsp;e)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;→&amp;nbsp;确认:&amp;nbsp;AppKey/Secret正确、接口已申请、wareId有效&amp;quot;)&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;三、迁移 Checklist（照着做，5分钟切完）&lt;/h2&gt;&lt;ol class=&quot;ybc-ol-component ybc-ol-component_1 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;应用后台申请新权限&lt;/strong&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;→ 接口权限 → 勾选 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.ware.read.get&lt;/code&gt; → 提交（通常即时生效）&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;代码改动（极小）&lt;/strong&gt;&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;-&amp;nbsp;method&amp;nbsp;=&amp;nbsp;&amp;quot;jingdong.ware.get&amp;quot;
+&amp;nbsp;method&amp;nbsp;=&amp;nbsp;&amp;quot;jingdong.ware.read.get&amp;quot;
-&amp;nbsp;fields&amp;nbsp;=&amp;nbsp;&amp;quot;ware_id,title,price&amp;quot;
+&amp;nbsp;fields&amp;nbsp;=&amp;nbsp;&amp;quot;ware_id,title,price,jd_price,stock_num,skus_json,image_path&amp;quot;&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;wareId&lt;/code&gt; 参数名不变（驼峰，同老接口）&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;回归测试（5分钟）&lt;/strong&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;ul class=&quot;ybc-ul-component list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;沙箱调通签名 ✓&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;生产比对新旧返回字段一致性（标题/价格/SKU数应一致）&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;自家店铺查 SKU 库存需传 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;access_token&lt;/code&gt;（同旧逻辑）&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;下线老调用&lt;/strong&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;确认所有环境切新 method 后，删除 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;get_ware_old()&lt;/code&gt; 分支&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;hr/&gt;&lt;h2&gt;四、避坑清单&lt;/h2&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div class=&quot;hyc-common-markdown__table-actions-sticky&quot; id=&quot;tableActionsPanel&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;坑&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;现象&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;解决&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;新接口返回 403&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;未申请 &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jingdong.ware.read.get&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;应用→接口权限→申请&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;skus_json&lt;/code&gt; 空&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;公开查询别人商品 / 未传 token&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;查自己店铺商品须传&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;卖家 AccessToken&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;老代码 &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;wareId&lt;/code&gt; 写成 &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;ware_id&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;部分SDK自动映射，推荐用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;wareId&lt;/code&gt;(首字母大写)&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;与文档保持一致&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;返回结构 key 变&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jingdong_ware_get_response&lt;/code&gt; → &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jingdong_ware_read_get_response&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;解析用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;.get(&amp;quot;ware&amp;quot;)&lt;/code&gt; 不依赖外层 key&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;timestamp毫秒&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;Invalid Timestamp&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;JOS用&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;秒级&lt;/strong&gt; &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;int(time.time())&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;沙箱返回 mock 数据&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;正常，沙箱只验签不返真数据&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;切生产验证&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;五、面试/方案一句话&lt;/h2&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;京东JOS宙斯迁移：老接口 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.ware.get&lt;/code&gt; → 新接口 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.ware.read.get&lt;/code&gt;，&lt;strong&gt;只改 method 字符串 + fields 补 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;skus_json,stock_num&lt;/code&gt;，网关/签名/AccessToken 完全不变&lt;/strong&gt;；应用需申请新接口权限，返回值结构外层key变但内层 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;ware&lt;/code&gt; 节点字段一致，解析取 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;.get(&amp;quot;ware&amp;quot;)&lt;/code&gt; 即兼容，5分钟平滑切换。&lt;/div&gt;&lt;/blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;需要我补 &lt;strong&gt;京东订单增量同步(&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.pop.order.search&lt;/code&gt;) 或 库存快照定时校正脚本&lt;/strong&gt; 的完整迁移示例吗？&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 17 Jul 2026 09:41:16 +0800</pubDate></item><item><title>🏯《淘宝TOP API聚石塔内 vs 聚石塔外价差10倍：ERP迁云到底值不值？》（附Python源码）</title><link>https://alexob.com/?id=444</link><description>&lt;h1&gt;&lt;strong style=&quot;font-size: 14px;&quot;&gt;结论先行&lt;/strong&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;：淘宝TOP基础API收费差距确实是&lt;/span&gt;&lt;strong style=&quot;font-size: 14px;&quot;&gt;10倍&lt;/strong&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;（聚石塔内&lt;/span&gt;&lt;strong style=&quot;font-size: 14px;&quot;&gt;¥0.02/百次&lt;/strong&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt; vs 聚石塔外&lt;/span&gt;&lt;strong style=&quot;font-size: 14px;&quot;&gt;¥0.20/百次&lt;/strong&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;），增值API差距更是达&lt;/span&gt;&lt;strong style=&quot;font-size: 14px;&quot;&gt;10倍&lt;/strong&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;（内¥0.06 vs 外¥0.60且外禁止调用）。&lt;/span&gt;&lt;br/&gt;&lt;/h1&gt;&lt;div class=&quot;ybc-p&quot;&gt;对于&lt;strong&gt;日调用量超免费额度（企业通常数万~百万/天）的ERP&lt;/strong&gt;，迁云不仅值，而且是必选项；但对于&lt;strong&gt;极小规模自用（日调用&amp;lt;1万次）&lt;/strong&gt;，外网费用一年也就几十块，迁云的ECS成本反而更高。&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;一、价差账本：10倍差在哪？&lt;/h2&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;维度&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;聚石塔内（ECS/RDS）&lt;/strong&gt;&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;聚石塔外（自建/IDC/公网）&lt;/strong&gt;&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;基础API单价&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;¥0.02 / 百次&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;¥0.20 / 百次&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;增值API单价&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;¥0.06 / 百次&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;¥0.60 / 百次（且禁止调用）&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;网络链路&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;阿里内网（低延迟、免公网带宽费）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;公网出口（高延迟、有带宽成本）&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;隐性成本&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;云主机租赁费（约¥100~数千/月）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;服务器折旧、运维人力、安全风控（御城河）&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;稳定性&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;内网互通，抗大促限流更强&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;易触发跨网限流（isv.rate-limit-exceed）&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;算一笔账&lt;/strong&gt;：&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;假设你的ERP日调用订单接口 &lt;strong&gt;50万次&lt;/strong&gt;（约8333次/小时，中等卖家）：&lt;/div&gt;&lt;ul class=&quot;ybc-ul-component list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;塔内&lt;/strong&gt;：5000百次 × ¥0.02 = &lt;strong&gt;¥100 / 天&lt;/strong&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;塔外&lt;/strong&gt;：5000百次 × ¥0.20 = &lt;strong&gt;¥1000 / 天&lt;/strong&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;月差&lt;/strong&gt;：&lt;strong&gt;(1000-100)×30 = ¥27,000&lt;/strong&gt;。这还没算塔外可能被限流导致的漏单损失。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;二、ERP迁云值不值？决策矩阵&lt;/h2&gt;&lt;h3&gt;✅ 强烈建议迁（ROI极高）&lt;/h3&gt;&lt;ol class=&quot;ybc-ol-component ybc-ol-component_1 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;ISV服务商&lt;/strong&gt;：服务多家店铺，调用量百万级/天，API费省下的钱远超ECS租金。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;中大型卖家（日单&amp;gt;3000）&lt;/strong&gt;：超免费额度后按量计费，内网调用省10倍，且大促弹性扩容不怕崩。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;需敏感数据&lt;/strong&gt;：买家手机号、地址解密等&lt;strong&gt;增值API强制只能在塔内调用&lt;/strong&gt;，塔外根本拿不到。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;❌ 暂时不必迁（没必要）&lt;/h3&gt;&lt;ol class=&quot;ybc-ol-component ybc-ol-component_1 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;微型卖家/个人自用&lt;/strong&gt;：日调用&amp;lt;1万次，还在免费额度内（¥0），迁云反而多花ECS钱。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;纯商品爬取（公开字段）&lt;/strong&gt;：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;taobao.item.get&lt;/code&gt; 等免费接口未超量时不涉及计费，无需为了省不存在的钱迁云。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;hr/&gt;&lt;h2&gt;三、附：Python 探测当前调用环境成本预警脚本&lt;/h2&gt;&lt;div class=&quot;ybc-p&quot;&gt;这个脚本模拟统计你的日调用量，并&lt;strong&gt;自动计算塔内/塔外月费差额&lt;/strong&gt;，当差额覆盖ECS成本时给出迁云预警。&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;top_just_cost_guard.py
&amp;quot;&amp;quot;&amp;quot;
淘宝TOP&amp;nbsp;API&amp;nbsp;聚石塔内&amp;nbsp;vs&amp;nbsp;塔外&amp;nbsp;成本测算器
逻辑：
1.&amp;nbsp;记录日调用量（实际应从Redis/DB读，这里模拟输入）
2.&amp;nbsp;扣除免费额度（假设企业版10万次/天免费，仅示意）
3.&amp;nbsp;计算超额部分的塔内/塔外费用
4.&amp;nbsp;对比ECS最低成本（假设小型ECS&amp;nbsp;¥150/月），给出迁云建议
&amp;quot;&amp;quot;&amp;quot;
import&amp;nbsp;sys
封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex
#&amp;nbsp;=====&amp;nbsp;配置（按2026淘宝官方费率）=====
FREE_DAILY_QUOTA&amp;nbsp;=&amp;nbsp;100_000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;企业应用假设免费额度&amp;nbsp;10万次/天（示意）
BASE_IN_PRICE&amp;nbsp;=&amp;nbsp;0.02&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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_OUT_PRICE&amp;nbsp;=&amp;nbsp;0.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;元/百次
VALUE_IN_PRICE&amp;nbsp;=&amp;nbsp;0.06&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;增值塔内
VALUE_OUT_PRICE&amp;nbsp;=&amp;nbsp;0.60&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;增值塔外（禁）
ECS_MONTH_COST&amp;nbsp;=&amp;nbsp;150&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;聚石塔最小ECS+RDS估算成本/月
DAYS_PER_MONTH&amp;nbsp;=&amp;nbsp;30

def&amp;nbsp;calc_monthly_cost(daily_calls:&amp;nbsp;int,&amp;nbsp;api_ratio=1.0,&amp;nbsp;value_ratio=0.0):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;daily_calls:&amp;nbsp;日均总调用次数
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;api_ratio:&amp;nbsp;其中基础收费API占比&amp;nbsp;(0~1)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value_ratio:&amp;nbsp;其中增值API占比&amp;nbsp;(0~1)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;1.&amp;nbsp;计算超额次数（免费额度按天扣，超了才计费）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;over_daily&amp;nbsp;=&amp;nbsp;max(0,&amp;nbsp;daily_calls&amp;nbsp;-&amp;nbsp;FREE_DAILY_QUOTA)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;over_monthly&amp;nbsp;=&amp;nbsp;over_daily&amp;nbsp;*&amp;nbsp;DAYS_PER_MONTH
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;over_hundred&amp;nbsp;=&amp;nbsp;over_monthly&amp;nbsp;/&amp;nbsp;100.0

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;2.&amp;nbsp;塔内费用
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cost_in&amp;nbsp;=&amp;nbsp;over_hundred&amp;nbsp;*&amp;nbsp;(BASE_IN_PRICE&amp;nbsp;*&amp;nbsp;api_ratio&amp;nbsp;+&amp;nbsp;VALUE_IN_PRICE&amp;nbsp;*&amp;nbsp;value_ratio)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;3.&amp;nbsp;塔外费用（增值禁止，这里仅测算理论价差）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cost_out&amp;nbsp;=&amp;nbsp;over_hundred&amp;nbsp;*&amp;nbsp;(BASE_OUT_PRICE&amp;nbsp;*&amp;nbsp;api_ratio&amp;nbsp;+&amp;nbsp;VALUE_OUT_PRICE&amp;nbsp;*&amp;nbsp;value_ratio)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;cost_in,&amp;nbsp;cost_out,&amp;nbsp;over_monthly

def&amp;nbsp;advise(daily_calls):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cost_in,&amp;nbsp;cost_out,&amp;nbsp;over_m&amp;nbsp;=&amp;nbsp;calc_monthly_cost(daily_calls,&amp;nbsp;api_ratio=0.8,&amp;nbsp;value_ratio=0.2)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;📊&amp;nbsp;日均调用:&amp;nbsp;{daily_calls:,}&amp;nbsp;次&amp;nbsp;|&amp;nbsp;月超额:&amp;nbsp;{over_m:,.0f}&amp;nbsp;次&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;💰&amp;nbsp;聚石塔内月费(超量):&amp;nbsp;¥{cost_in:.2f}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;💸&amp;nbsp;聚石塔外月费(超量):&amp;nbsp;¥{cost_out:._2f}&amp;nbsp;(价差&amp;nbsp;¥{cost_out-cost_in:.2f})&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;diff&amp;nbsp;=&amp;nbsp;cost_out&amp;nbsp;-&amp;nbsp;cost_in
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;daily_calls&amp;nbsp;&amp;lt;=&amp;nbsp;FREE_DAILY_QUOTA:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;✅&amp;nbsp;当前在免费额度内，塔外零费，暂无需迁云&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif&amp;nbsp;diff&amp;nbsp;&amp;gt;&amp;nbsp;ECS_MONTH_COST:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;🚨&amp;nbsp;**建议迁云**：API省下的&amp;nbsp;¥{diff:.0f}/月&amp;nbsp;&amp;gt;&amp;nbsp;ECS成本&amp;nbsp;¥{ECS_MONTH_COST}，净赚&amp;nbsp;¥{diff-ECS_MONTH_COST:.0f}/月&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;+&amp;nbsp;额外收益：增值API可用、内网稳、御城河安全、弹性扩容&amp;quot;)
&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;print(f&amp;quot;⚠️&amp;nbsp;当前差额&amp;nbsp;¥{diff:.0f}/月&amp;nbsp;&amp;lt;&amp;nbsp;ECS成本&amp;nbsp;¥{ECS_MONTH_COST}，微小规模可暂缓，但需承担限流/安全风险&amp;quot;)

if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;模拟几个量级
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;d_calls&amp;nbsp;in&amp;nbsp;[5_000,&amp;nbsp;50_000,&amp;nbsp;100_000,&amp;nbsp;500_000,&amp;nbsp;1_000_000]:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;-&amp;quot;&amp;nbsp;*&amp;nbsp;50)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;advise(d_calls)&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;运行输出逻辑示例（日50万次）：&lt;/strong&gt;&lt;/div&gt;&lt;ul class=&quot;ybc-ul-component list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;月超额约1200万次&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;塔内超量费 ≈ ¥2400/月&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;塔外超量费 ≈ ¥24000/月&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;差额¥21600 &amp;gt; ECS¥150 → 强烈建议迁云&lt;/strong&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;四、迁云不止是省钱，还有3个隐形红利&lt;/h2&gt;&lt;ol class=&quot;ybc-ol-component ybc-ol-component_1 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;数据安全（御城河）&lt;/strong&gt;：塔内有完整的主机安全、访问控制，防止员工离职拖库或黑客爬取买家隐私（违规会被罚巨额）。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;数据推送（RDS）&lt;/strong&gt;：塔内可以用&lt;strong&gt;订单数据同步服务&lt;/strong&gt;（基于RDS Binlog/推送），比硬轮询API稳定10倍，还能规避429限流。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;大促弹性&lt;/strong&gt;：双11流量翻10倍，塔内ECS可分钟级扩容，塔外自建机房容易直接被打挂。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;hr/&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;一句话总结&lt;/strong&gt;：&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;只要你的ERP&lt;strong&gt;日调用超过免费额度（约10万+）或需要增值/解密数据&lt;/strong&gt;，聚石塔内比塔外&lt;strong&gt;省10倍API费+送安全与稳定&lt;/strong&gt;，迁云必值；只有&lt;strong&gt;微型自用且在免费额度内&lt;/strong&gt;才建议苟在塔外。&lt;/div&gt;&lt;/blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;要不要我帮你把这个成本测算脚本改成&lt;strong&gt;读取你真实Redis日调用计数&lt;/strong&gt;，并自动对接淘宝&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;error_response&lt;/code&gt;里的计费码做实时预警呢？&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 17 Jul 2026 08:51:25 +0800</pubDate></item><item><title>《别再被&amp;quot;免费API&amp;quot;误导：五家开放平台真实计费口径拆解（附决策清单）》（附python源码）</title><link>https://alexob.com/?id=443</link><description>&lt;div class=&quot;ybc-p&quot;&gt;市面上常说“淘宝/京东/1688 API 免费”，但&lt;strong&gt;真实计费口径里藏着三层隐形门槛：免费额度上限、超额按量计费、增值/高级接口必须买包&lt;/strong&gt;。一旦日调用量稍大或碰了敏感数据，账单就会悄悄产生。下面把&lt;strong&gt;五大平台（淘宝TOP / 京东JOS / 1688 / 拼多多 / 抖店）&lt;/strong&gt;的真实计费口径拆开，并给你一份&lt;strong&gt;决策清单 + 用量防超脚本&lt;/strong&gt;。&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;一、五大平台真实计费口径拆解（2026版）&lt;/h2&gt;&lt;h3&gt;1. 淘宝 TOP 开放平台&lt;/h3&gt;&lt;ul class=&quot;ybc-ul-component list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;免费层&lt;/strong&gt;：商品查询、基础订单、物流轨迹、淘宝客有&lt;strong&gt;日免费额度&lt;/strong&gt;（企业≈5万~100万次/天，个人≈5000~1万），QPS 免费≈5~20/s。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;基础收费层&lt;/strong&gt;：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;taobao.trades.sold.get&lt;/code&gt;等订单类&lt;strong&gt;超免费额度后计费&lt;/strong&gt;，聚石塔内≈&lt;strong&gt;¥0.02/百次&lt;/strong&gt;，聚石塔外≈&lt;strong&gt;¥0.20/百次&lt;/strong&gt;。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;增值层&lt;/strong&gt;：数据罗盘、CRM高级(RFM)、竞品分析需购&lt;strong&gt;增值包&lt;/strong&gt;，聚石塔内≈¥0.06/百次，且&lt;strong&gt;禁止公网调用&lt;/strong&gt;。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;误区&lt;/strong&gt;：“订单接口完全免费” → 错，超日额度立刻按量扣费；“个人号能查订单” → 错，需企业+卖家 OAuth。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h3&gt;2. 京东 JOS（宙斯）&lt;/h3&gt;&lt;ul class=&quot;ybc-ul-component list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;免费层&lt;/strong&gt;：商品查询、联盟选品、基础物流&lt;strong&gt;有免费额度&lt;/strong&gt;（企业≈30万~100万次/天，个人≈500~2000），QPS≈5~10/s（可购包提至50/100）。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;基础收费层&lt;/strong&gt;：高频订单同步、电子面单取号&lt;strong&gt;超量按基础计费&lt;/strong&gt;≈¥0.02~0.10/百次（聚石塔内远低于公网）。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;增值层&lt;/strong&gt;：会员RFM、数据洞察、无界电子面单按面单/包计费。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;误区&lt;/strong&gt;：“JOS 全免费” → 错，日调用超几十万或提 QPS 必涉及资源包；“联盟接口能看库存” → 错，联盟只返回有货/无货状态。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h3&gt;3. 1688 开放平台&lt;/h3&gt;&lt;ul class=&quot;ybc-ul-component list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;免费层&lt;/strong&gt;：商品搜索、详情、订单、物流&lt;strong&gt;完全免费&lt;/strong&gt;，受 QPS 限制（搜索≈10/s，订单≈20/s），无明确硬顶但异常高频触发风控。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;资源包层&lt;/strong&gt;：提升 QPS、高级实时库存、跨境洞察、数据推送需&lt;strong&gt;买年费资源包&lt;/strong&gt;（几百~几千/年）。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;按量层&lt;/strong&gt;：超资源包后≈¥0.001~0.01/次，极少触发。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;误区&lt;/strong&gt;：“1688 没有任何收费” → 错，&lt;strong&gt;高级实时库存 / 提频才收费&lt;/strong&gt;，普通同步零成本；“日限很低” → 错，企业自用型几十万次/天实测零扣费。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h3&gt;四、拼多多开放平台&lt;/h3&gt;&lt;ul class=&quot;ybc-ul-component list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;无完全免费&lt;/strong&gt;：基础接口有&lt;strong&gt;小额免费额度&lt;/strong&gt;，超额按&lt;strong&gt;调用量计费&lt;/strong&gt;（基础≈¥0.01~0.10/百次），且涉及敏感/加密数据&lt;strong&gt;必须在拼多多云内调用&lt;/strong&gt;（云主机年费约¥2460起）。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;部分场景还有&lt;strong&gt;订单金额技术服务费&lt;/strong&gt;（如0.6%）。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;误区&lt;/strong&gt;：“拼多多 API 和个人号一样免费” → 错，自研对接基本都要预充值或云费用。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h3&gt;五、抖店（抖音）开放平台&lt;/h3&gt;&lt;ul class=&quot;ybc-ul-component list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;免费层&lt;/strong&gt;：自研店铺应用有基础免费额度。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;收费层&lt;/strong&gt;：&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;ul class=&quot;ybc-ul-component list-paddingleft-2&quot; style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;基础 API：&lt;strong&gt;云内≈¥0.018/百次&lt;/strong&gt;，云外≈¥0.18/百次；&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;增值 API：&lt;strong&gt;云内≈¥0.05/百次&lt;/strong&gt;，云外≈¥0.5/百次（增值禁止云外调用）。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;ISV 上架还可能抽成 10~30%。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;误区&lt;/strong&gt;：“抖店接口随便调不花钱” → 错，超额度或走云外成本陡增 10 倍。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;二、别被“免费API”误导的 5 个核心真相&lt;/h2&gt;&lt;ol class=&quot;ybc-ol-component ybc-ol-component_1 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;“免费”通常指“基础接口 + 日额度内 + 云内/聚石塔内”&lt;/strong&gt;，离开这三个条件就可能计费。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;订单 / 库存 / 用户隐私类接口&lt;/strong&gt;，淘宝京东1688 都放在&lt;strong&gt;基础收费或增值层&lt;/strong&gt;，不是永久免费。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;公网调用比云内贵 10 倍&lt;/strong&gt;（淘宝聚石塔外 ¥0.20 vs ¥0.02；抖店云外 ¥0.18 vs ¥0.018）。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;QPS 超限只返回限流码（code=7 / 16），不扣费但业务中断&lt;/strong&gt;，提频就要买包。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;淘宝客 / 京东联盟本身接口免费&lt;/strong&gt;，但成交后&lt;strong&gt;抽佣金&lt;/strong&gt;，不是“零成本”。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;hr/&gt;&lt;h2&gt;三、决策清单：你的场景用哪家、会不会花钱？&lt;/h2&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;你的场景&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;推荐平台&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;是否会花钱&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;关键动作&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;中小卖家商品同步+订单回写&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;淘宝TOP / 京东JOS / 1688&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;大概率零费&lt;/strong&gt;（日&amp;lt;10万次）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;用增量 modified、fields 过滤、聚石塔/云内调用&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;B2B批发找货、分销管理&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;1688&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;零费&lt;/strong&gt;（不碰高级库存）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;企业实名+自用型应用，别手滑买资源包&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;选品比价、CPS推广&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;淘宝客 / 京东联盟&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;接口零费&lt;/strong&gt;（成交抽佣）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;备案推广位，不调订单私有接口&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;高频大卖（&amp;gt;50万次/天）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;淘宝/京东/抖店&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;超量计费&lt;/strong&gt;（几分钱/百次）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;提前算日调用量+买 QPS 包+云内部署&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;敏感数据（手机号/加密地址）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;拼多多 / 抖店增值&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;必花钱&lt;/strong&gt;（云费用+增值费）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;评估是否必须拿明文，能用脱敏就用脱敏&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;四、附：通用 API 用量探测 + 防超阈值脚本（Python）&lt;/h2&gt;&lt;div class=&quot;ybc-p&quot;&gt;不管哪家，都建议在代码里埋一个&lt;strong&gt;日计数器 + 限流保护&lt;/strong&gt;，快触免费额度时主动停任务，避免莫名其妙被扣费或限流。&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;api_cost_guard.py
&amp;quot;&amp;quot;&amp;quot;
五家电商通用：日调用计数&amp;nbsp;+&amp;nbsp;令牌桶限速&amp;nbsp;+&amp;nbsp;超额度抛异常
用法：每次真实请求前先&amp;nbsp;guard.check_and_wait()
&amp;quot;&amp;quot;&amp;quot;
import&amp;nbsp;time
from&amp;nbsp;datetime&amp;nbsp;import&amp;nbsp;datetime
封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex
class&amp;nbsp;ApiCostGuard:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;app_key:&amp;nbsp;str,&amp;nbsp;daily_limit:&amp;nbsp;int&amp;nbsp;=&amp;nbsp;100_000,&amp;nbsp;qps:&amp;nbsp;float&amp;nbsp;=&amp;nbsp;4.0):
&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.daily_limit&amp;nbsp;=&amp;nbsp;daily_limit
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.count&amp;nbsp;=&amp;nbsp;0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.qps&amp;nbsp;=&amp;nbsp;qps
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.tokens&amp;nbsp;=&amp;nbsp;qps
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.ts&amp;nbsp;=&amp;nbsp;time.monotonic()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_bucket_wait(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;now&amp;nbsp;=&amp;nbsp;time.monotonic()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.tokens&amp;nbsp;=&amp;nbsp;min(self.qps,&amp;nbsp;self.tokens&amp;nbsp;+&amp;nbsp;(now&amp;nbsp;-&amp;nbsp;self.ts)&amp;nbsp;*&amp;nbsp;self.qps)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.ts&amp;nbsp;=&amp;nbsp;now
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;self.tokens&amp;nbsp;&amp;lt;&amp;nbsp;1:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep((1&amp;nbsp;-&amp;nbsp;self.tokens)&amp;nbsp;/&amp;nbsp;self.qps&amp;nbsp;+&amp;nbsp;0.005)
&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.tokens&amp;nbsp;=&amp;nbsp;0
&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;self.tokens&amp;nbsp;-=&amp;nbsp;1

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;check_and_wait(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;self.count&amp;nbsp;&amp;gt;=&amp;nbsp;self.daily_limit:
&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;RuntimeError(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f&amp;quot;🚨&amp;nbsp;今日[{self.app_key}]已达{daily_limit}次（免费额度耗尽）\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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f&amp;quot;→&amp;nbsp;再调将触发平台按量计费\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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f&amp;quot;→&amp;nbsp;建议：断点续跑&amp;nbsp;/&amp;nbsp;增量同步&amp;nbsp;/&amp;nbsp;申请提额&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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._bucket_wait()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.count&amp;nbsp;+=&amp;nbsp;1

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;reset_if_new_day(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;简单示例：实际可落文件/Redis按日期重置
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;hasattr(self,&amp;nbsp;&amp;quot;_day&amp;quot;):
&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._day&amp;nbsp;=&amp;nbsp;datetime.now().date()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;datetime.now().date()&amp;nbsp;!=&amp;nbsp;self._day:
&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.count&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;self._day&amp;nbsp;=&amp;nbsp;datetime.now().date()
封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex

#&amp;nbsp;=====&amp;nbsp;使用示例&amp;nbsp;=====
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;guard&amp;nbsp;=&amp;nbsp;ApiCostGuard(&amp;quot;TAOBAO_APP_KEY&amp;quot;,&amp;nbsp;daily_limit=100_000,&amp;nbsp;qps=4)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;range(3):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;guard.reset_if_new_day()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;guard.check_and_wait()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;✅&amp;nbsp;模拟调用成功&amp;nbsp;今日:{guard.count}/{guard.daily_limit}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;这里放真实&amp;nbsp;platform_client.call(...)&lt;/pre&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;怎么用&lt;/strong&gt;：把 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;check_and_wait()&lt;/code&gt;塞进你封装好的 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;TopClient.call()&lt;/code&gt;/ &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;JdClient.call()&lt;/code&gt;里，超限直接抛异常停任务，比后台突然发现被扣费舒服得多。&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;五、一句话总结&lt;/h2&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;所谓“免费API”= 基础接口 + 在日额度内 + 云内/聚石塔内调用 + 不碰增值&lt;/strong&gt;；&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;淘宝TOP/京东JOS/1688 中小规模基本零费，拼多多/抖店自带按量或云费，超额度后各家都是&lt;strong&gt;每百次几分钱但公网贵10倍&lt;/strong&gt;，真要规模化记得&lt;strong&gt;增量同步 + 令牌桶 + 云内部署 + 买QPS包&lt;/strong&gt;，别被“免费”两个字一路冲到账单上。&lt;/div&gt;&lt;/blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;需要我帮你把这套 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;ApiCostGuard&lt;/code&gt;直接嵌进你现有的 &lt;strong&gt;淘宝TOP / 京东JOS / 1688 Client&lt;/strong&gt; 里，按各平台返回码（&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;code=7&lt;/code&gt;/ &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;limited-by-app-access-count&lt;/code&gt;）做自动退避与告警吗？&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;要不要我帮你把这套 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;ApiCostGuard&lt;/code&gt;直接嵌进你现有的 &lt;strong&gt;淘宝TOP / 京东JOS / 1688 Client&lt;/strong&gt; 里，按各平台返回码（&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;code=7&lt;/code&gt;/ &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;limited-by-app-access-count&lt;/code&gt;）做自动退避与告警呢？&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 16 Jul 2026 09:22:58 +0800</pubDate></item><item><title>《2026五大电商API收费全景对照：淘宝TOP/京东JOS/1688/拼多多/抖店，哪家用得起？》（附python源码）</title><link>https://alexob.com/?id=442</link><description>&lt;h1&gt;💰 2026五大电商API收费全景对照：淘宝TOP / 京东JOS / 1688 / 拼多多 / 抖店，哪家用得起？&lt;/h1&gt;&lt;div class=&quot;ybc-p&quot;&gt;做电商ERP、选品系统或自动铺货，&lt;strong&gt;API成本&lt;/strong&gt;往往是隐形的大头。2026年各大平台基本都走了&lt;strong&gt;「基础免费额度 + 超额按量计费 + 增值/资源包收费」&lt;/strong&gt;的路线。下面给你一张能直接拍板的对照表，再附一套通用的&lt;strong&gt;用量探测与限流保护Python源码&lt;/strong&gt;。&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;一、五大平台API收费全景对照表（2026版）&lt;/h2&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;维度&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;淘宝 TOP&lt;/strong&gt;&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;京东 JOS&lt;/strong&gt;&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;1688&lt;/strong&gt;&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;拼多多&lt;/strong&gt;&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;抖店（抖音）&lt;/strong&gt;&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;免费额度&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;企业≈1万~100万次/天&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;个人≈500~5000次/天&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;企业≈30万~100万次/天&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;个人≈500~2000次/天&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;基础接口¥0&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;默认QPS≈10~20/s&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;日量较宽松&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;企业≈10万次/天&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;个人≈2000次/天&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;有QPS限制&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;自研应用有免费额度&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;ISV按量阶梯&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;云内更便宜&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;默认QPS&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;企业5~50/s&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;个人≤2/s&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;企业5~10/s（可购包提至50/100）&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;个人1~2/s&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;搜索≈10/s&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;订单≈20/s&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;基础接口宽松&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;商品≈5/s&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;订单≈2/s&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;基础接口有限额&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;云内调用更稳定&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;超量计费&lt;/strong&gt;&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;&lt;em style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;(聚石塔/云内)&lt;/em&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;基础API：¥0.02/百次&lt;/strong&gt;&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;增值API：¥0.06/百次&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;超免费额度按量计费&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;≈¥0.02~0.10/百次&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;超资源包≈¥0.001~0.01/次&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;基础API：¥0.01/百次&lt;/strong&gt;&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;增值API：¥0.03/百次&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;基础API：¥0.018/百次&lt;/strong&gt;&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;增值API：¥0.05/百次&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;超量计费&lt;/strong&gt;&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;&lt;em style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;(公网/云外)&lt;/em&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;基础API：¥0.20/百&lt;/strong&gt;&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;增值API：¥0.60/百&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;不建议公网超量&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;成本陡增&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;无直接按量&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;需买包提频&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;基础API：¥0.10/百&lt;/strong&gt;&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;增值API：¥0.30/百&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;基础API：¥0.18/百&lt;/strong&gt;&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;增值API：¥0.50/百&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;增值/高级收费&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;数据罗盘、CRM高级、竞品分析&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;需购增值包&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;会员RFM、数据洞察&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;电子面单取号按单算&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;实时库存高级、跨境洞察&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;需购资源包（¥千~万/年）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;敏感数据/加密信息&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;需购云主机+权限&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;数据推送高级、定制分析&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;ISV上架抽成10~30%&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;淘宝客/联盟&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;taobao.tbk.*&lt;/code&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;免费&lt;/strong&gt;&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;成交后扣佣金&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jd.union.*&lt;/code&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;免费备案&lt;/strong&gt;&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;成交抽佣&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;无对应&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;无&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;无&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;认证要求&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;企业最优（订单需OAuth）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;企业实名（订单需卖家Token）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;企业实名（自研免费）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;企业/个人均可&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;企业/个体户（需资质）&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;哪家用得起？&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;中小免费够用&lt;/strong&gt;&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;高频超量也极便宜&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;聚石塔内部署&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;中小免费够用&lt;/strong&gt;&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;日调用&amp;lt;30万次零费&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;买QPS包才花钱&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;B2B最划算&lt;/strong&gt;&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;商品/订单全免费&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;只有提频/高级库存才买包&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;预充值模式&lt;/strong&gt;&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;钱花在调用量+云主机&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;适合已有拼多多店&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;自研店铺零费&lt;/strong&gt;&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;ISV做SaaS才分成&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;云内调用省成本&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;✅ &lt;strong&gt;结论先给&lt;/strong&gt;：&lt;/div&gt;&lt;ul class=&quot;ybc-ul-component list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;预算极紧 / 中小卖家&lt;/strong&gt;：淘宝、京东、1688 的&lt;strong&gt;基础接口免费额度完全够用&lt;/strong&gt;（日几千~几万次同步零成本），拼多多需预充值但单价极低，抖店自研也免费。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;高频大卖 / SaaS服务商&lt;/strong&gt;：淘宝聚石塔内、京东购QPS包、1688买资源包、拼多多/抖店走云内调用，成本都在&lt;strong&gt;每百次几分钱&lt;/strong&gt;级别，远底线性硬件成本。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;千万别踩的坑&lt;/strong&gt;：增值接口（数据洞察/CRM/实时高级库存）&lt;strong&gt;不免费&lt;/strong&gt;，没需求别申请；公网调用比云内/聚石塔内贵10倍。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;二、通用API用量探测 + 限流保护源码（Python）&lt;/h2&gt;&lt;div class=&quot;ybc-p&quot;&gt;不管哪个平台，&lt;strong&gt;签名→调用→捕获限流→退避重试→用量计数&lt;/strong&gt;的逻辑是通用的。下面以&lt;strong&gt;通用REST风格+模拟限流码&lt;/strong&gt;为例，你可把&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;call_api&lt;/code&gt;替换成对应平台的Client。&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;ecom_api_cost_guard.py
&amp;quot;&amp;quot;&amp;quot;
五大电商API通用防护壳：
1.&amp;nbsp;本地日调用计数（防不知不觉超免费额度）
2.&amp;nbsp;令牌桶限速（QPS&amp;nbsp;≤&amp;nbsp;免费上限×0.8）
3.&amp;nbsp;捕获&amp;nbsp;429&amp;nbsp;/&amp;nbsp;code=16(FLOW_CONTROL)&amp;nbsp;指数退避
4.&amp;nbsp;区分&amp;nbsp;免费层&amp;nbsp;/&amp;nbsp;计费层&amp;nbsp;报错提示
依赖:&amp;nbsp;pip&amp;nbsp;install&amp;nbsp;requests
&amp;quot;&amp;quot;&amp;quot;
import&amp;nbsp;hashlib
import&amp;nbsp;time
import&amp;nbsp;requests
from&amp;nbsp;datetime&amp;nbsp;import&amp;nbsp;datetime

封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex
class&amp;nbsp;ApiCostGuard:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;app_key,&amp;nbsp;daily_limit=100_000,&amp;nbsp;qps=4):
&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.daily_limit&amp;nbsp;=&amp;nbsp;daily_limit
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.counter_key&amp;nbsp;=&amp;nbsp;f&amp;quot;api_cnt_{app_key}_{datetime.now().date()}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.today_count&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;&amp;nbsp;self.rate&amp;nbsp;=&amp;nbsp;qps
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.tokens&amp;nbsp;=&amp;nbsp;qps
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.ts&amp;nbsp;=&amp;nbsp;time.monotonic()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_bucket_wait(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;now&amp;nbsp;=&amp;nbsp;time.monotonic()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.tokens&amp;nbsp;=&amp;nbsp;min(self.rate,&amp;nbsp;self.tokens&amp;nbsp;+&amp;nbsp;(now&amp;nbsp;-&amp;nbsp;self.ts)&amp;nbsp;*&amp;nbsp;self.rate)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.ts&amp;nbsp;=&amp;nbsp;now
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;self.tokens&amp;nbsp;&amp;lt;&amp;nbsp;1:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep((1&amp;nbsp;-&amp;nbsp;self.tokens)&amp;nbsp;/&amp;nbsp;self.rate&amp;nbsp;+&amp;nbsp;0.01)
&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.tokens&amp;nbsp;=&amp;nbsp;0
&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;self.tokens&amp;nbsp;-=&amp;nbsp;1

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_check_daily(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;self.today_count&amp;nbsp;&amp;gt;=&amp;nbsp;self.daily_limit:
&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;RuntimeError(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f&amp;quot;🚨&amp;nbsp;今日调用已达&amp;nbsp;{self.daily_limit}&amp;nbsp;次（免费额度耗尽）\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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f&amp;quot;→&amp;nbsp;超量将按平台计费（淘宝¥0.02~0.20/百次&amp;nbsp;京东≈¥0.02~0.10/百次）\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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f&amp;quot;→&amp;nbsp;建议：断点续跑&amp;nbsp;/&amp;nbsp;增量同步&amp;nbsp;/&amp;nbsp;申请提额&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;safe_call(self,&amp;nbsp;platform_name,&amp;nbsp;method,&amp;nbsp;biz_params,&amp;nbsp;sign_func,&amp;nbsp;token=None,&amp;nbsp;max_retry=3):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;platform_name:&amp;nbsp;&amp;quot;淘宝TOP&amp;quot;/&amp;quot;京东JOS&amp;quot;/&amp;quot;1688&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;sign_func:&amp;nbsp;对应平台的签名函数&amp;nbsp;(params,&amp;nbsp;secret)-&amp;gt;sign
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;att&amp;nbsp;in&amp;nbsp;range(max_retry):
&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._check_daily()
&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._bucket_wait()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;=====&amp;nbsp;这里替换为真实平台Client&amp;nbsp;=====
&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;模拟构造参数并签名（示意）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;{&amp;quot;method&amp;quot;:&amp;nbsp;method,&amp;nbsp;&amp;quot;app_key&amp;quot;:&amp;nbsp;self.app_key,&amp;nbsp;**biz_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;nbsp;&amp;nbsp;if&amp;nbsp;token:&amp;nbsp;params[&amp;quot;access_token&amp;quot;]&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;params[&amp;quot;sign&amp;quot;]&amp;nbsp;=&amp;nbsp;sign_func(params,&amp;nbsp;&amp;quot;APP_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;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;requests.post(gateway,&amp;nbsp;data=params,&amp;nbsp;timeout=15)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;d&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;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;fake_status&amp;nbsp;=&amp;nbsp;200&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;fake_status&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;requests.HTTPError(&amp;quot;429&amp;nbsp;Client&amp;nbsp;Error&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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.today_count&amp;nbsp;+=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;✅&amp;nbsp;[{platform_name}]&amp;nbsp;{method}&amp;nbsp;调用成功&amp;nbsp;今日:{self.today_count}/{self.daily_limit}&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;d
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;mock&amp;quot;:&amp;nbsp;&amp;quot;ok&amp;quot;}

&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err_str&amp;nbsp;=&amp;nbsp;str(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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;&amp;quot;429&amp;quot;&amp;nbsp;in&amp;nbsp;err_str&amp;nbsp;or&amp;nbsp;&amp;quot;FLOW_CONTROL&amp;quot;&amp;nbsp;in&amp;nbsp;err_str&amp;nbsp;or&amp;nbsp;&amp;quot;code=16&amp;quot;&amp;nbsp;in&amp;nbsp;err_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;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;att&amp;nbsp;&amp;lt;&amp;nbsp;max_retry&amp;nbsp;-&amp;nbsp;1:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;back&amp;nbsp;=&amp;nbsp;2&amp;nbsp;**&amp;nbsp;att
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;⚠️&amp;nbsp;&amp;nbsp;{platform_name}&amp;nbsp;QPS限流，{back}s后第{att+1}次重试...&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;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(back)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;RuntimeError(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f&amp;quot;❌&amp;nbsp;{platform_name}&amp;nbsp;持续限流，建议：\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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f&amp;quot;&amp;nbsp;&amp;nbsp;1)&amp;nbsp;降低QPS（当前设{self.rate}）\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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f&amp;quot;&amp;nbsp;&amp;nbsp;2)&amp;nbsp;买资源包/提额（京东/1688/淘宝聚石塔）\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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f&amp;quot;&amp;nbsp;&amp;nbsp;3)&amp;nbsp;增量同步减少无效调用&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;RuntimeError(&amp;quot;重试耗尽&amp;quot;)

封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex
#&amp;nbsp;--------&amp;nbsp;示例：一个通用MD5签名（淘宝/京东风格简化）&amp;nbsp;--------
def&amp;nbsp;generic_md5_sign(params:&amp;nbsp;dict,&amp;nbsp;secret:&amp;nbsp;str)&amp;nbsp;-&amp;gt;&amp;nbsp;str:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;from&amp;nbsp;typing&amp;nbsp;import&amp;nbsp;Tuple
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;filtered&amp;nbsp;=&amp;nbsp;sorted((k,&amp;nbsp;v)&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;params.items()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;k&amp;nbsp;!=&amp;nbsp;&amp;quot;sign&amp;quot;&amp;nbsp;and&amp;nbsp;v&amp;nbsp;is&amp;nbsp;not&amp;nbsp;None&amp;nbsp;and&amp;nbsp;str(v).strip()&amp;nbsp;!=&amp;nbsp;&amp;quot;&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qs&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;.join(f&amp;quot;{k}{v}&amp;quot;&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;filtered)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw&amp;nbsp;=&amp;nbsp;f&amp;quot;{secret}{qs}{secret}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;hashlib.md5(raw.encode()).hexdigest().upper()


if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;guard&amp;nbsp;=&amp;nbsp;ApiCostGuard(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_key=&amp;quot;YOUR_APP_KEY&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;daily_limit=100_000,&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;←&amp;nbsp;按平台免费额度填（如淘宝企业10万）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qps=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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;←&amp;nbsp;免费上限5时设4，防超限
&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;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;range(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;guard.safe_call(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;platform_name=&amp;quot;淘宝TOP&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;method=&amp;quot;taobao.item.get&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;biz_params={&amp;quot;num_iid&amp;quot;:&amp;nbsp;&amp;quot;654321098765&amp;quot;,&amp;nbsp;&amp;quot;fields&amp;quot;:&amp;nbsp;&amp;quot;title,price&amp;quot;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign_func=generic_md5_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;except&amp;nbsp;RuntimeError&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(e)&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;三、选型与省钱建议（落地用）&lt;/h2&gt;&lt;ol class=&quot;ybc-ol-component ybc-ol-component_1 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;只用基础商品/订单同步&lt;/strong&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;→ 淘宝（企业）、京东（企业）、1688 &lt;strong&gt;全免费额度内搞定&lt;/strong&gt;，别手滑申请增值接口。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;日调用超50万次&lt;/strong&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;→ 淘宝/京东放&lt;strong&gt;聚石塔/京东云内&lt;/strong&gt;调用（价差10倍）；1688买对应资源包提QPS；拼多多/抖店尽量走各自云内通道。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;做SaaS卖给别人（ISV）&lt;/strong&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;→ 抖店/淘宝要算平台抽成；1688/京东按调用量+资源包；拼多多预充值最稳。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;防超支第一线&lt;/strong&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;→ 代码里加&lt;strong&gt;日计数器 + 断点续跑 + 令牌桶&lt;/strong&gt;，超限直接抛异常停任务，比被扣几百块舒服。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;hr/&gt;&lt;div class=&quot;ybc-p&quot;&gt;一句话总结：&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;2026年做电商API对接，中小玩家淘宝/京东/1688基础接口基本“白嫖”，拼多多几分钱一百次，抖店自研也免；真烧钱的是乱开增值包、公网高频硬冲、不做限流保护。&lt;/strong&gt; 上面的Python防护壳直接套进你现有Client里，就能安心对着账单睡觉。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;要不要我帮你把&lt;strong&gt;某一具体平台（比如淘宝TOP或京东JOS）的签名+令牌桶+断点续跑&lt;/strong&gt;写成完整可落地的同步模块？&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 16 Jul 2026 09:06:34 +0800</pubDate></item><item><title>《多店铺京东订单统一拉取：JOS API + 分布式调度 + 幂等设计实战》（附python源码）</title><link>https://alexob.com/?id=441</link><description>&lt;div class=&quot;ybc-p&quot;&gt;多店铺京东订单统一拉取的核心在于：&lt;strong&gt;每个店铺独立 AccessToken + 增量时间窗拉取 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.pop.order.search&lt;/code&gt;+ 以 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;(tid, shop_id)&lt;/code&gt;为唯一键做数据库幂等 + 分布式锁/Redis NX 防多节点并发重复处理 + 断点续跑防漏单&lt;/strong&gt;。下面给你一套可直接落地的 &lt;strong&gt;Python 实战源码&lt;/strong&gt;。&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;一、整体架构&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;┌────────────────────┐
│&amp;nbsp;分布式调度器&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&amp;nbsp;&amp;nbsp;APScheduler&amp;nbsp;/&amp;nbsp;Celery&amp;nbsp;Beat
│&amp;nbsp;遍历&amp;nbsp;shop_auth&amp;nbsp;表&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│
└───────┬────────────┘
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&amp;nbsp;每店铺独立&amp;nbsp;token
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;▼
┌────────────────────┐
│&amp;nbsp;JdOrderSyncPerShop&amp;nbsp;│
│&amp;nbsp;1.&amp;nbsp;获取分布式锁&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&amp;nbsp;&amp;nbsp;Redis&amp;nbsp;SET&amp;nbsp;shop_id:sync&amp;nbsp;&amp;nbsp;NX&amp;nbsp;EX
│&amp;nbsp;2.&amp;nbsp;增量拉取订单&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&amp;nbsp;&amp;nbsp;start_modified&amp;nbsp;~&amp;nbsp;end_modified
│&amp;nbsp;3.&amp;nbsp;逐单查明细&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&amp;nbsp;&amp;nbsp;jd.order.detail.get
│&amp;nbsp;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;INSERT&amp;nbsp;ON&amp;nbsp;CONFLICT(tid,shop_id)&amp;nbsp;DO&amp;nbsp;NOTHING
│&amp;nbsp;5.&amp;nbsp;更新断点时间&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&amp;nbsp;&amp;nbsp;last_sync_time
│&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;│
└────────────────────┘&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;二、核心源码（Python · 含签名 / 分布式锁 / 幂等 / 断点）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;jd_multi_shop_order_sync.py
&amp;quot;&amp;quot;&amp;quot;
多店铺京东订单统一拉取实战
-&amp;nbsp;JOS&amp;nbsp;MD5签名（秒级timestamp）
-&amp;nbsp;Redis分布式锁（防止多节点同时跑同一店铺）
-&amp;nbsp;增量同步&amp;nbsp;modified&amp;nbsp;时间窗
-&amp;nbsp;幂等入库&amp;nbsp;(tid,&amp;nbsp;shop_id)&amp;nbsp;UNIQUE
-&amp;nbsp;断点续跑（记录&amp;nbsp;last_sync_time）
依赖:
&amp;nbsp;&amp;nbsp;pip&amp;nbsp;install&amp;nbsp;requests&amp;nbsp;redis&amp;nbsp;apscheduler
&amp;quot;&amp;quot;&amp;quot;
import&amp;nbsp;hashlib
import&amp;nbsp;json
import&amp;nbsp;time
import&amp;nbsp;datetime
import&amp;nbsp;requests
import&amp;nbsp;redis
from&amp;nbsp;typing&amp;nbsp;import&amp;nbsp;Dict,&amp;nbsp;List

#&amp;nbsp;==================&amp;nbsp;配置&amp;nbsp;==================
APP_KEY&amp;nbsp;=&amp;nbsp;&amp;quot;YOUR_JD_APP_KEY&amp;quot;
APP_SECRET&amp;nbsp;=&amp;nbsp;&amp;quot;YOUR_JD_APP_SECRET&amp;quot;
REDIS_HOST&amp;nbsp;=&amp;nbsp;&amp;quot;localhost&amp;quot;
REDIS_PORT&amp;nbsp;=&amp;nbsp;6379
REDIS_DB&amp;nbsp;=&amp;nbsp;0
SYNC_INTERVAL_MIN&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;增量窗口分钟数
LOCK_TTL_SEC&amp;nbsp;=&amp;nbsp;300&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;分布式锁过期时间
#&amp;nbsp;==========================================

rds&amp;nbsp;=&amp;nbsp;redis.Redis(host=REDIS_HOST,&amp;nbsp;port=REDIS_PORT,&amp;nbsp;db=REDIS_DB)


#&amp;nbsp;----------&amp;nbsp;JOS&amp;nbsp;Client&amp;nbsp;----------
class&amp;nbsp;JdJosClient:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GW&amp;nbsp;=&amp;nbsp;&amp;quot;https://api.jd.com/routerjson&amp;quot;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;app_key,&amp;nbsp;app_secret):
,&amp;nbsp;self.ask&amp;nbsp;=&amp;nbsp;app_key,&amp;nbsp;app_secret

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_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;filt&amp;nbsp;=&amp;nbsp;sorted(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&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;k&amp;nbsp;!=&amp;nbsp;&amp;quot;sign&amp;quot;&amp;nbsp;and&amp;nbsp;v&amp;nbsp;is&amp;nbsp;not&amp;nbsp;None&amp;nbsp;and&amp;nbsp;str(v).strip()&amp;nbsp;!=&amp;nbsp;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qs&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;.join(f&amp;quot;{k}{v}&amp;quot;&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;filt)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;hashlib.md5(f&amp;quot;{self.ask}{qs}{self.ask}&amp;quot;.encode()).hexdigest().upper()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;call(self,&amp;nbsp;method,&amp;nbsp;biz,&amp;nbsp;token):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&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.ak,
&amp;nbsp;&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;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;str(int(time.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;quot;format&amp;quot;:&amp;nbsp;&amp;quot;json&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;v&amp;quot;:&amp;nbsp;&amp;quot;2.0&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sign_method&amp;quot;:&amp;nbsp;&amp;quot;md5&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;360buy_param_json&amp;quot;:&amp;nbsp;json.dumps(biz,&amp;nbsp;ensure_ascii=False,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;separators=(&amp;#39;,&amp;#39;,&amp;nbsp;&amp;#39;:&amp;#39;)),
&amp;nbsp;&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;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;p[&amp;quot;sign&amp;quot;]&amp;nbsp;=&amp;nbsp;self._sign(p)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r&amp;nbsp;=&amp;nbsp;requests.post(self.GW,&amp;nbsp;data=p,&amp;nbsp;timeout=15)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r.raise_for_status()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d&amp;nbsp;=&amp;nbsp;r.json()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp_key&amp;nbsp;=&amp;nbsp;method.replace(&amp;quot;.&amp;quot;,&amp;nbsp;&amp;quot;_&amp;quot;)&amp;nbsp;+&amp;nbsp;&amp;quot;_response&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;resp_key&amp;nbsp;not&amp;nbsp;in&amp;nbsp;d:
&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;k&amp;nbsp;in&amp;nbsp;d:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;k.endswith(&amp;quot;_response&amp;quot;):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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_key&amp;nbsp;=&amp;nbsp;k
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;data&amp;nbsp;=&amp;nbsp;d.get(resp_key,&amp;nbsp;d)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;&amp;quot;error_response&amp;quot;&amp;nbsp;in&amp;nbsp;str(data):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err&amp;nbsp;=&amp;nbsp;d.get(resp_key,&amp;nbsp;{}).get(&amp;quot;error_response&amp;quot;)&amp;nbsp;or&amp;nbsp;d.get(&amp;quot;error_response&amp;quot;)
&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;err:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;JOS[{err.get(&amp;#39;code&amp;#39;)}]:&amp;nbsp;{err.get(&amp;#39;zh_desc&amp;#39;)}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;data

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;list_orders(self,&amp;nbsp;token,&amp;nbsp;start,&amp;nbsp;end,&amp;nbsp;page=1,&amp;nbsp;page_size=100):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;self.call(&amp;quot;jingdong.pop.order.search&amp;quot;,&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;start_modified&amp;quot;:&amp;nbsp;start,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;end_modified&amp;quot;:&amp;nbsp;end,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;order_state&amp;quot;:&amp;nbsp;&amp;quot;WAIT_SELLER_STOCK_OUT,WAIT_BUYER_CONFIRM_GOODS,FINISHED&amp;quot;,
&amp;nbsp;&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;100)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&amp;nbsp;token)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;order_detail(self,&amp;nbsp;token,&amp;nbsp;order_id):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;self.call(&amp;quot;jd.order.detail.get&amp;quot;,&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;orderId&amp;quot;:&amp;nbsp;str(order_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;fields&amp;quot;:&amp;nbsp;&amp;quot;orderId,status,payment,buyer_nick,receiver_name,&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;receiver_mobile,orders.skuId,orders.outerSkuId,&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;orders.num,orders.price,created,modified&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&amp;nbsp;token)


#&amp;nbsp;----------&amp;nbsp;分布式锁&amp;nbsp;----------
def&amp;nbsp;acquire_lock(shop_id:&amp;nbsp;str)&amp;nbsp;-&amp;gt;&amp;nbsp;str:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;Redis&amp;nbsp;SET&amp;nbsp;NX&amp;nbsp;EX，返回&amp;nbsp;identifier&amp;nbsp;或&amp;nbsp;None&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;identifier&amp;nbsp;=&amp;nbsp;str(time.time())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lock_key&amp;nbsp;=&amp;nbsp;f&amp;quot;jd_sync_lock:{shop_id}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ok&amp;nbsp;=&amp;nbsp;rds.set(lock_key,&amp;nbsp;identifier,&amp;nbsp;nx=True,&amp;nbsp;ex=LOCK_TTL_SEC)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;identifier&amp;nbsp;if&amp;nbsp;ok&amp;nbsp;else&amp;nbsp;None


def&amp;nbsp;release_lock(shop_id:&amp;nbsp;str,&amp;nbsp;identifier:&amp;nbsp;str):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lock_key&amp;nbsp;=&amp;nbsp;f&amp;quot;jd_sync_lock:{shop_id}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;Lua等效：仅当值匹配才删，防误释放
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with&amp;nbsp;rds.pipeline()&amp;nbsp;as&amp;nbsp;pipe:
&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;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pipe.watch(lock_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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;pipe.get(lock_key)&amp;nbsp;==&amp;nbsp;identifier.encode():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pipe.multi()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pipe.delete(lock_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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pipe.execute()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;except&amp;nbsp;redis.WatchError:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;amp;&amp;nbsp;幂等（SQLite示例，生产换&amp;nbsp;MySQL/PG）&amp;nbsp;----------
def&amp;nbsp;init_db(db=&amp;quot;jd_erp.db&amp;quot;):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn&amp;nbsp;=&amp;nbsp;__import__(&amp;quot;sqlite3&amp;quot;).connect(db)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn.execute(&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CREATE&amp;nbsp;TABLE&amp;nbsp;IF&amp;nbsp;NOT&amp;nbsp;EXISTS&amp;nbsp;erp_order(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tid&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;shop_id&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;status&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;payment&amp;nbsp;REAL,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buyer_nick&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;created&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;PRIMARY&amp;nbsp;KEY(tid,&amp;nbsp;shop_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;&amp;quot;&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn.execute(&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CREATE&amp;nbsp;TABLE&amp;nbsp;IF&amp;nbsp;NOT&amp;nbsp;EXISTS&amp;nbsp;shop_sync_point(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;shop_id&amp;nbsp;TEXT&amp;nbsp;PRIMARY&amp;nbsp;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;last_sync_time&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;quot;&amp;quot;&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn.commit()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;conn


def&amp;nbsp;load_last_time(conn,&amp;nbsp;shop_id):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cur&amp;nbsp;=&amp;nbsp;conn.execute(&amp;quot;SELECT&amp;nbsp;last_sync_time&amp;nbsp;FROM&amp;nbsp;shop_sync_point&amp;nbsp;WHERE&amp;nbsp;shop_id=?&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(shop_id,))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;row&amp;nbsp;=&amp;nbsp;cur.fetchone()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;row[0]&amp;nbsp;if&amp;nbsp;row&amp;nbsp;else&amp;nbsp;None


def&amp;nbsp;save_last_time(conn,&amp;nbsp;shop_id,&amp;nbsp;t):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn.execute(&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INSERT&amp;nbsp;INTO&amp;nbsp;shop_sync_point(shop_id,last_sync_time)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VALUES(?,?)&amp;nbsp;ON&amp;nbsp;CONFLICT(shop_id)&amp;nbsp;DO&amp;nbsp;UPDATE&amp;nbsp;SET&amp;nbsp;last_sync_time=excluded.last_sync_time
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;,&amp;nbsp;(shop_id,&amp;nbsp;t))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn.commit()


def&amp;nbsp;upsert_order(conn,&amp;nbsp;shop_id,&amp;nbsp;order):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn.execute(&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INSERT&amp;nbsp;INTO&amp;nbsp;erp_order(tid,shop_id,status,payment,buyer_nick,created)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VALUES(?,?,?,?,?,?)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ON&amp;nbsp;CONFLICT(tid,shop_id)&amp;nbsp;DO&amp;nbsp;NOTHING
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;,&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;str(order.get(&amp;quot;orderId&amp;quot;)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;shop_id,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;order.get(&amp;quot;status&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float(order.get(&amp;quot;payment&amp;quot;)&amp;nbsp;or&amp;nbsp;0),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;order.get(&amp;quot;buyer_nick&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;order.get(&amp;quot;created&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn.commit()


#&amp;nbsp;----------&amp;nbsp;单店铺同步&amp;nbsp;----------
def&amp;nbsp;sync_one_shop(client:&amp;nbsp;JdJosClient,&amp;nbsp;conn,&amp;nbsp;shop:&amp;nbsp;Dict):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;shop_id&amp;nbsp;=&amp;nbsp;shop[&amp;quot;shop_id&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;token&amp;nbsp;=&amp;nbsp;shop[&amp;quot;access_token&amp;quot;]

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lock_id&amp;nbsp;=&amp;nbsp;acquire_lock(shop_id)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;lock_id:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;⚠️&amp;nbsp;&amp;nbsp;店铺[{shop_id}]&amp;nbsp;正在其他节点同步，跳过&amp;quot;)
&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;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;now&amp;nbsp;=&amp;nbsp;datetime.datetime.now()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;last&amp;nbsp;=&amp;nbsp;load_last_time(conn,&amp;nbsp;shop_id)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;last:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start&amp;nbsp;=&amp;nbsp;last
&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;start&amp;nbsp;=&amp;nbsp;(now&amp;nbsp;-&amp;nbsp;datetime.timedelta(minutes=SYNC_INTERVAL_MIN&amp;nbsp;*&amp;nbsp;2)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;).strftime(&amp;quot;%Y-%m-%d&amp;nbsp;%H:%M:%S&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&amp;nbsp;=&amp;nbsp;now.strftime(&amp;quot;%Y-%m-%d&amp;nbsp;%H:%M:%S&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;▶&amp;nbsp;店铺[{shop_id}]&amp;nbsp;增量&amp;nbsp;{start}&amp;nbsp;~&amp;nbsp;{end}&amp;quot;)

&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;rsp&amp;nbsp;=&amp;nbsp;client.list_orders(token,&amp;nbsp;start,&amp;nbsp;end,&amp;nbsp;page=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;order_list&amp;nbsp;=&amp;nbsp;(rsp.get(&amp;quot;popOrderSearch&amp;quot;,&amp;nbsp;{})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.get(&amp;quot;orderSearch&amp;quot;,&amp;nbsp;{})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.get(&amp;quot;orderInfoList&amp;quot;,&amp;nbsp;[]))&amp;nbsp;or&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total&amp;nbsp;=&amp;nbsp;rsp.get(&amp;quot;popOrderSearch&amp;quot;,&amp;nbsp;{}).get(&amp;quot;orderSearch&amp;quot;,&amp;nbsp;{}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;).get(&amp;quot;orderTotal&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;for&amp;nbsp;o&amp;nbsp;in&amp;nbsp;order_list:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tid&amp;nbsp;=&amp;nbsp;str(o.get(&amp;quot;orderId&amp;quot;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;明细（按需，列表已有基础字段可先upsert）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;client.order_detail(token,&amp;nbsp;tid)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;order_data&amp;nbsp;=&amp;nbsp;detail.get(&amp;quot;orderInfo&amp;quot;,&amp;nbsp;o)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;upsert_order(conn,&amp;nbsp;shop_id,&amp;nbsp;order_data)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(order_list)&amp;nbsp;&amp;lt;&amp;nbsp;100&amp;nbsp;or&amp;nbsp;page&amp;nbsp;*&amp;nbsp;100&amp;nbsp;&amp;gt;=&amp;nbsp;total:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(0.15)&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;QPS保护

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;成功更新断点（用当前end，下次从此继续）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;save_last_time(conn,&amp;nbsp;shop_id,&amp;nbsp;end)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;✅&amp;nbsp;店铺[{shop_id}]&amp;nbsp;同步完成，断点更新至&amp;nbsp;{end}&amp;quot;)

&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;print(f&amp;quot;❌&amp;nbsp;店铺[{shop_id}]&amp;nbsp;同步异常:&amp;nbsp;{e}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;finally:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;release_lock(shop_id,&amp;nbsp;lock_id)


#&amp;nbsp;----------&amp;nbsp;多店铺入口&amp;nbsp;----------
def&amp;nbsp;sync_all_shops(shop_list:&amp;nbsp;List[Dict]):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client&amp;nbsp;=&amp;nbsp;JdJosClient(APP_KEY,&amp;nbsp;APP_SECRET)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn&amp;nbsp;=&amp;nbsp;init_db()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;shop&amp;nbsp;in&amp;nbsp;shop_list:
&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;sync_one_shop(client,&amp;nbsp;conn,&amp;nbsp;shop)
&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;❌&amp;nbsp;顶层异常&amp;nbsp;shop={shop.get(&amp;#39;shop_id&amp;#39;)}:&amp;nbsp;{e}&amp;quot;)


#&amp;nbsp;=====================&amp;nbsp;示例&amp;nbsp;shop_list&amp;nbsp;=====================
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SHOP_LIST&amp;nbsp;=&amp;nbsp;[
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;quot;shop_id&amp;quot;:&amp;nbsp;&amp;quot;SHOP001&amp;quot;,&amp;nbsp;&amp;quot;access_token&amp;quot;:&amp;nbsp;&amp;quot;SELLER_TOKEN_A&amp;quot;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;quot;shop_id&amp;quot;:&amp;nbsp;&amp;quot;SHOP002&amp;quot;,&amp;nbsp;&amp;quot;access_token&amp;quot;:&amp;nbsp;&amp;quot;SELLER_TOKEN_B&amp;quot;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sync_all_shops(SHOP_LIST)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;----&amp;nbsp;常驻调度示例（取消注释）----
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;from&amp;nbsp;apscheduler.schedulers.blocking&amp;nbsp;import&amp;nbsp;BlockingScheduler
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;sched&amp;nbsp;=&amp;nbsp;BlockingScheduler()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;sched.add_job(lambda:&amp;nbsp;sync_all_shops(SHOP_LIST),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;interval&amp;#39;,&amp;nbsp;minutes=SYNC_INTERVAL_MIN,&amp;nbsp;id=&amp;#39;jd_multi_shop_sync&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;sched.start()&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;三、关键设计点说明&lt;/h2&gt;&lt;ol class=&quot;ybc-ol-component ybc-ol-component_1 list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;多店铺隔离&lt;/strong&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;每个店铺一条 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;shop_auth&lt;/code&gt;记录，存 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;shop_id / access_token / refresh_token&lt;/code&gt;，同步时按 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;shop_id&lt;/code&gt;独立跑、独立锁、独立断点时间。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;分布式锁（Redis SET NX EX）&lt;/strong&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;防止多节点 / 多进程同时跑同一店铺导致重复调用API、重复入库。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;幂等设计&lt;/strong&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;本地订单表 &lt;strong&gt;PRIMARY KEY &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;(tid, shop_id)&lt;/code&gt;&lt;/strong&gt;，处理前数据库层 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;ON CONFLICT DO NOTHING&lt;/code&gt;，即使重试/重复推送也不重复建单。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;增量 + 断点续跑&lt;/strong&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;记录 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;last_sync_time&lt;/code&gt;，每次用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;start_modified=last_sync_time, end_modified=now&lt;/code&gt;拉取，服务重启从中继续，避免漏单与超日额度。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;QPS保护&lt;/strong&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;分页间 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;time.sleep(0.15)&lt;/code&gt;+ 令牌桶（前文京东限流篇已给），遇 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;code=16 / ISP_FLOW_CONTROL&lt;/code&gt;指数退避重试。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;对账兜底&lt;/strong&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;每日凌晨全量比对一次最近 N 天订单，修正极端情况下漏掉的状态变更（回调丢失/网络抖动）。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;hr/&gt;&lt;h2&gt;四、避坑清单&lt;/h2&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div class=&quot;hyc-common-markdown__table-actions-sticky&quot; id=&quot;tableActionsPanel&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;坑&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;现象&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;解决&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;用毫秒时间戳&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;Invalid Timestamp&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;JOS用&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;秒级&lt;/strong&gt; &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;int(time.time())&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;订单403&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;传买家token / 个人应用&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;企业认证 + &lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;卖家OAuth AccessToken&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;多节点重复入库&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;无幂等/无锁&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;(tid,shop_id)&lt;/code&gt;唯一索引 + Redis锁&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;重启后重复拉全量&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;无断点记录&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;持久化 &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;last_sync_time&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;超日额度&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;limited-by-app-access-count&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;增量同步 + 断点，避免全量翻页&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr/&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;一句话总结&lt;/strong&gt;：多店铺京东订单同步 = &lt;strong&gt;每店铺独立 Seller Token → 增量 modified 时间窗 → Redis NX 锁防并发 → &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;(tid,shop_id)&lt;/code&gt;幂等入库 → 记录 last_sync_time 断点续跑 → 日对账兜底&lt;/strong&gt;，签名/QPS 同单店铺，仅调度与隔离维度不同。&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 15 Jul 2026 09:45:58 +0800</pubDate></item><item><title>《京东联盟API爬坑：不用店铺授权也能拿商品详情，但库存只有“有货/无货”》（附Python源码）</title><link>https://alexob.com/?id=440</link><description>&lt;h1&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;这是京东开放体系里&lt;/span&gt;&lt;strong style=&quot;font-size: 14px;&quot;&gt;最容易混淆、也最容易踩坑&lt;/strong&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;的点之一：&lt;/span&gt;&lt;br/&gt;&lt;/h1&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;京东联盟API（jd.union.*）≠ 京东开放平台JOS（商家ERP接口）&lt;/strong&gt;，两者在数据深度与授权要求上完全不同。&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;一、核心结论先给&lt;/h2&gt;&lt;ul class=&quot;ybc-ul-component list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;京东联盟API（&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jd.union.open.goods.detail.query&lt;/code&gt;）&lt;/strong&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;✅ &lt;strong&gt;不需要店铺授权&lt;/strong&gt;，只要京东联盟实名应用 + AppKey/Secret 就能调&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;❌ &lt;strong&gt;库存只返回状态（有货 / 无货 / 预售），不返回具体可售库存数量&lt;/strong&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;✅ 适合：选品、比价、佣金监控、CPS推广、价格追踪&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;京东开放平台JOS（&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.ware.read.get&lt;/code&gt;/ &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.stock.get&lt;/code&gt;）&lt;/strong&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;✅ &lt;strong&gt;需要企业认证 + 店铺卖家OAuth授权&lt;/strong&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;✅ &lt;strong&gt;返回真实SKU库存数量、区域库存、锁定库存&lt;/strong&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;✅ 适合：ERP商品同步、防超卖、WMS出入库、店铺自营管理&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;如果你做&lt;strong&gt;电商ERP、库存预占、发货回写&lt;/strong&gt;，联盟接口&lt;strong&gt;库存不够用&lt;/strong&gt;，必须走JOS商家接口。&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;二、京东联盟接口“坑点”拆解&lt;/h2&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div class=&quot;hyc-common-markdown__table-actions-sticky&quot; id=&quot;tableActionsPanel&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;坑序号&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;现象&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;真相&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;①&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;以为不用授权就能拿全量数据&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;联盟&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;无店铺权限&lt;/strong&gt;，看不到真实库存、成本价、商家编码&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;②&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;skuList[].stock&lt;/code&gt;要么没有，要么是1/0&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;联盟返回的是 &lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;stockState（1=有货 / 0=无货）&lt;/strong&gt;，不是 &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;stockNum&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;③&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;价格字段和京东前台不一致&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;联盟返回&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;促销价/券后价/佣金价&lt;/strong&gt;，不是商家后台“基准库存价”&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;④&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;调订单/物流接口报403&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;联盟&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;只有商品/推广/订单概览&lt;/strong&gt;，没有 &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jd.order.detail.get&lt;/code&gt;这种商家接口&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;⑤&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;以为AppKey通用&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;联盟应用 ≠ JOS应用，网关不同，权限体系隔离&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;三、Python：京东联盟商品详情调用（含库存状态解析）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;jd_union_detail_demo.py
&amp;quot;&amp;quot;&amp;quot;
京东联盟API&amp;nbsp;商品详情查询
jd.union.open.goods.detail.query
-&amp;nbsp;无需店铺授权
-&amp;nbsp;库存仅返回&amp;nbsp;有货(1)&amp;nbsp;/&amp;nbsp;无货(0)&amp;nbsp;/&amp;nbsp;预售&amp;nbsp;状态
依赖:&amp;nbsp;requests
&amp;quot;&amp;quot;&amp;quot;
import&amp;nbsp;hashlib
import&amp;nbsp;json
import&amp;nbsp;time
import&amp;nbsp;requests
from&amp;nbsp;typing&amp;nbsp;import&amp;nbsp;Dict,&amp;nbsp;List


class&amp;nbsp;JdUnionClient:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GW&amp;nbsp;=&amp;nbsp;&amp;quot;https://api.jd.com/routerjson&amp;quot;

&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.ak&amp;nbsp;=&amp;nbsp;app_key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.ask&amp;nbsp;=&amp;nbsp;app_secret

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;─────&amp;nbsp;JOS/联盟通用&amp;nbsp;MD5签名（秒级timestamp）─────
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_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;filt&amp;nbsp;=&amp;nbsp;sorted(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&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;k&amp;nbsp;!=&amp;nbsp;&amp;quot;sign&amp;quot;&amp;nbsp;and&amp;nbsp;v&amp;nbsp;is&amp;nbsp;not&amp;nbsp;None&amp;nbsp;and&amp;nbsp;str(v).strip()&amp;nbsp;!=&amp;nbsp;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qs&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;.join(f&amp;quot;{k}{v}&amp;quot;&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;filt)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw&amp;nbsp;=&amp;nbsp;f&amp;quot;{self.ask}{qs}{self.ask}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;hashlib.md5(raw.encode(&amp;quot;utf-8&amp;quot;)).hexdigest().upper()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_goods_detail(self,&amp;nbsp;sku_ids:&amp;nbsp;List[int],&amp;nbsp;fields:&amp;nbsp;str&amp;nbsp;=&amp;nbsp;None)&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sku_ids:&amp;nbsp;最多20个SKU&amp;nbsp;ID
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fields&amp;nbsp;建议:&amp;nbsp;skuId,productName,price,promotionPrice,couponInfo,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stockState,commissionInfo,salesCount,shopName
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fields&amp;nbsp;=&amp;nbsp;fields&amp;nbsp;or&amp;nbsp;(
&amp;nbsp;&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,productName,price,promotionPrice,couponInfo,&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;stockState,commissionInfo,salesCount,shopName,logisticsType&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;biz&amp;nbsp;=&amp;nbsp;{&amp;quot;skuIds&amp;quot;:&amp;nbsp;sku_ids,&amp;nbsp;&amp;quot;fields&amp;quot;:&amp;nbsp;fields}

&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.ak,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;method&amp;quot;:&amp;nbsp;&amp;quot;jd.union.open.goods.detail.query&amp;quot;,
&amp;nbsp;&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;str(int(time.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;quot;format&amp;quot;:&amp;nbsp;&amp;quot;json&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;v&amp;quot;:&amp;nbsp;&amp;quot;2.0&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sign_method&amp;quot;:&amp;nbsp;&amp;quot;md5&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;360buy_param_json&amp;quot;:&amp;nbsp;json.dumps(biz,&amp;nbsp;ensure_ascii=False,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;separators=(&amp;#39;,&amp;#39;,&amp;nbsp;&amp;#39;:&amp;#39;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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._sign(params)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r&amp;nbsp;=&amp;nbsp;requests.post(self.GW,&amp;nbsp;data=params,&amp;nbsp;timeout=15)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r.raise_for_status()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d&amp;nbsp;=&amp;nbsp;r.json()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp_key&amp;nbsp;=&amp;nbsp;&amp;quot;jd_union_open_goods_detail_query_response&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data&amp;nbsp;=&amp;nbsp;d.get(resp_key,&amp;nbsp;{})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;&amp;quot;error_response&amp;quot;&amp;nbsp;in&amp;nbsp;str(data):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err&amp;nbsp;=&amp;nbsp;data.get(&amp;quot;error_response&amp;quot;)
&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;Union&amp;nbsp;API&amp;nbsp;Err:&amp;nbsp;{err.get(&amp;#39;code&amp;#39;)}&amp;nbsp;{err.get(&amp;#39;zh_desc&amp;#39;)}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;data

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;─────&amp;nbsp;解析库存状态&amp;nbsp;─────
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;parse_stock(self,&amp;nbsp;item:&amp;nbsp;Dict)&amp;nbsp;-&amp;gt;&amp;nbsp;str:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;联盟接口库存只有状态，不是数量
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stockState:&amp;nbsp;1=有货,&amp;nbsp;0=无货,&amp;nbsp;可能含预售标识
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;state&amp;nbsp;=&amp;nbsp;item.get(&amp;quot;stockState&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;state&amp;nbsp;==&amp;nbsp;1:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;quot;有货&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif&amp;nbsp;state&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;quot;无货&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;f&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;skuList[].stock&amp;nbsp;用&amp;nbsp;1/0&amp;nbsp;表示
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;skus&amp;nbsp;=&amp;nbsp;item.get(&amp;quot;skuList&amp;quot;,&amp;nbsp;[])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;skus:
&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(&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;SKU库存示意:&amp;quot;,&amp;nbsp;[(s.get(&amp;quot;skuId&amp;quot;),&amp;nbsp;s.get(&amp;quot;stock&amp;quot;,&amp;nbsp;&amp;quot;N/A&amp;quot;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;s&amp;nbsp;in&amp;nbsp;skus[:3]])


#&amp;nbsp;=========================================================
#&amp;nbsp;使用示例
#&amp;nbsp;=========================================================
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client&amp;nbsp;=&amp;nbsp;JdUnionClient(&amp;quot;YOUR_JD_APP_KEY&amp;quot;,&amp;nbsp;&amp;quot;YOUR_JD_APP_SECRET&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SKU_IDS&amp;nbsp;=&amp;nbsp;[100012345678,&amp;nbsp;100087654321]&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;←&amp;nbsp;替换真实SKU&amp;nbsp;ID

&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;result&amp;nbsp;=&amp;nbsp;client.get_goods_detail(SKU_IDS)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data_list&amp;nbsp;=&amp;nbsp;result.get(&amp;quot;data&amp;quot;,&amp;nbsp;[])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;isinstance(data_list,&amp;nbsp;dict):
&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_list&amp;nbsp;=&amp;nbsp;data_list.get(&amp;quot;data&amp;quot;)&amp;nbsp;or&amp;nbsp;[]

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;item&amp;nbsp;in&amp;nbsp;(data_list&amp;nbsp;or&amp;nbsp;[]):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;title&amp;nbsp;=&amp;nbsp;item.get(&amp;quot;productName&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;price&amp;nbsp;=&amp;nbsp;item.get(&amp;quot;promotionPrice&amp;quot;)&amp;nbsp;or&amp;nbsp;item.get(&amp;quot;price&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stock_flag&amp;nbsp;=&amp;nbsp;client.parse_stock(item)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;commission&amp;nbsp;=&amp;nbsp;item.get(&amp;quot;commissionInfo&amp;quot;,&amp;nbsp;{}).get(&amp;quot;commission&amp;quot;,&amp;nbsp;&amp;quot;N/A&amp;quot;)

&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;✅&amp;nbsp;SKU:{item.get(&amp;#39;skuId&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;print(f&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;标题:{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;print(f&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;促销价:¥{price}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;库存状态:{stock_flag}&amp;nbsp;&amp;nbsp;←&amp;nbsp;仅状态，无具体库存数&amp;quot;)
&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;预估佣金:{commission}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client.parse_stock(item)&amp;nbsp;&amp;nbsp;#&amp;nbsp;打印sku示意

&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;print(&amp;quot;❌&amp;quot;,&amp;nbsp;e)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;→&amp;nbsp;确认:&amp;nbsp;京东联盟应用已实名、jd.union.open.goods.detail.query&amp;nbsp;已申请&amp;quot;)&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;四、如果你&lt;strong&gt;必须要真实库存数量&lt;/strong&gt;，怎么办？&lt;/h2&gt;&lt;div class=&quot;ybc-p&quot;&gt;走 &lt;strong&gt;京东JOS商家接口&lt;/strong&gt;（需企业+店铺授权）：&lt;/div&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div class=&quot;hyc-common-markdown__table-actions-sticky&quot; id=&quot;tableActionsPanel&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;接口&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;能力&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jingdong.ware.sku.read&lt;/code&gt;/ &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jingdong.ware.stock.get&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;返回 &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;stockNum&lt;/code&gt;（可售库存）、&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;lockStock&lt;/code&gt;（锁定）、&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;hsStockNum&lt;/code&gt;（在途）&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jingdong.stock.get&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;多仓库存、区域库存&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;需 &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;access_token&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;卖家OAuth2授权&lt;/strong&gt;（不是联盟token）&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;这部分代码在之前《京东商品详情API（jingdong.item.read.get）》《京东库存API（jd.stock.get）实时同步方案》中已经给过完整Python封装。&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;五、选型一句话总结（面试/方案）&lt;/h2&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;京东联盟API（&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jd.union.open.goods.detail.query&lt;/code&gt;）不用店铺授权就能拿商品标题/价格/券/佣金/销量，但库存只有“有货/无货”状态；要做ERP库存同步、防超卖、发货回写，必须用京东开放平台JOS商家接口（&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.ware.read.get&lt;/code&gt;/ &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jd.stock.get&lt;/code&gt;）并走企业认证+卖家OAuth授权获取真实&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;stockNum&lt;/code&gt;。&lt;/strong&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;需要我帮你把&lt;strong&gt;“联盟选品监控 + JOS商家库存校正”&lt;/strong&gt;写成一套双通道同步Demo（Python）吗？&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 15 Jul 2026 09:31:28 +0800</pubDate></item><item><title>《京东JOS vs 淘宝TOP vs 1688：接口免费额度、QPS、收费全方位对比》（附python源码）</title><link>https://alexob.com/?id=439</link><description>&lt;div class=&quot;ybc-p&quot;&gt;这是一份基于当前（2026年）三大主流电商平台开放平台政策的&lt;strong&gt;核心维度对比&lt;/strong&gt;。由于各平台费率与额度会随版本迭代调整，以下数据综合了官方文档与近期开发者实测，重点突出差异与选型痛点。&lt;/div&gt;&lt;h2&gt;京东JOS vs 淘宝TOP vs 1688 全方位对比&lt;/h2&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;对比维度&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;京东JOS (宙斯)&lt;/strong&gt;&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;淘宝TOP (开放平台)&lt;/strong&gt;&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;1688 (阿里巴巴中国站)&lt;/strong&gt;&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;适用场景&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;自营/POP订单履约、实时库存、价格同步&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;淘宝/天猫商品、交易、营销、评价全链路&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;B2B批发找货、分销管理、代发库存&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;免费额度&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;个人：500次/天，20万次/年&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;企业：1000次/天，40万次/年&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;基础接口免费（有日调用上限），部分高阶接口需订购应用收费套餐&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;基础查询免费（有日限），批量/深度接口需购买套餐包&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;默认QPS&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;2 QPS&lt;/strong&gt;（免费版）&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;可付费扩容至50/100/500+&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;依应用等级而定，普通应用通常 &lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;5~20 QPS&lt;/strong&gt;&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;高级应用可达数百&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;依应用等级，通常 &lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;5~10 QPS&lt;/strong&gt; 起步，高阶可扩容&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;收费模式&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;预付费资源包 + QPS扩容&lt;/strong&gt;&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;（例：0&amp;lt;QPS≤50 约1000元/QPS/月）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;应用套餐包&lt;/strong&gt;（按月/年）+ 超额流量费&lt;br style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;/&gt;部分接口按成功率计费&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;应用版本套餐&lt;/strong&gt;（基础/高级/旗舰）+ 接口调用包&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;认证要求&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;个人/企业实名（企业额度更高）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;企业认证为主（部分基础接口个人可测）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;企业认证（强B端属性，需营业执照）&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;核心优势&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;响应快（约200ms），库存/价格实时性强&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;生态最成熟，接口超2000个，文档与SDK极全&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;B2B供应链数据权威，支持拿货价、混批条件查询&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;主要坑点&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;免费额度偏低，商用成本高；订单类需OAuth授权&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;风控严，频繁调用易触发限流或验签失败；部分字段脱敏&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;接口返回结构偏重B端逻辑（最小起订量、加工方式等）&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;注：淘宝TOP与1688的具体收费金额随应用标签（如ISV、自研、商家后台）差异极大，自研型应用通常比第三方ISV享有更多免费权益。&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;附：通用Python封装思路（三平台兼容签名请求）&lt;/h2&gt;&lt;div class=&quot;ybc-p&quot;&gt;为了横向对比，你可以写一个通用的&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;OpenClient&lt;/code&gt;，通过切换&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;sign_method&lt;/code&gt;和&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;gateway&lt;/code&gt;来测试三家的限额与QPS表现：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;import&amp;nbsp;hashlib
import&amp;nbsp;time
import&amp;nbsp;requests
from&amp;nbsp;typing&amp;nbsp;import&amp;nbsp;Dict,&amp;nbsp;Literal
封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex
class&amp;nbsp;EcomClient:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;platform:&amp;nbsp;Literal[&amp;quot;jd&amp;quot;,&amp;nbsp;&amp;quot;tb&amp;quot;,&amp;nbsp;&amp;quot;al1688&amp;quot;],&amp;nbsp;app_key:&amp;nbsp;str,&amp;nbsp;app_secret:&amp;nbsp;str,&amp;nbsp;gateway:&amp;nbsp;str):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.platform&amp;nbsp;=&amp;nbsp;platform
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_key&amp;nbsp;=&amp;nbsp;app_key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_secret&amp;nbsp;=&amp;nbsp;app_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.gateway&amp;nbsp;=&amp;nbsp;gateway

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_sign(self,&amp;nbsp;params:&amp;nbsp;Dict)&amp;nbsp;-&amp;gt;&amp;nbsp;str:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;京东MD5(secret+kv+secret)&amp;nbsp;vs&amp;nbsp;淘宝/1688&amp;nbsp;MD5(secret+kv_sorted+secret)&amp;nbsp;细微差异处理&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;filtered&amp;nbsp;=&amp;nbsp;sorted(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;k&amp;nbsp;!=&amp;nbsp;&amp;quot;sign&amp;quot;&amp;nbsp;and&amp;nbsp;v&amp;nbsp;is&amp;nbsp;not&amp;nbsp;None&amp;nbsp;and&amp;nbsp;str(v).strip()&amp;nbsp;!=&amp;nbsp;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;kv&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;.join(f&amp;quot;{k}{v}&amp;quot;&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;filtered)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;self.platform&amp;nbsp;==&amp;nbsp;&amp;quot;jd&amp;quot;:
&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;self.app_secret&amp;nbsp;+&amp;nbsp;kv&amp;nbsp;+&amp;nbsp;self.app_secret
&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;#&amp;nbsp;淘宝/TOP&amp;nbsp;与&amp;nbsp;1688&amp;nbsp;通常也是&amp;nbsp;secret前缀后缀，但部分旧版1688用不同编码，此处演示通用版
&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;self.app_secret&amp;nbsp;+&amp;nbsp;kv&amp;nbsp;+&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;return&amp;nbsp;hashlib.md5(raw.encode(&amp;quot;utf-8&amp;quot;)).hexdigest().upper()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;execute(self,&amp;nbsp;method:&amp;nbsp;str,&amp;nbsp;biz_params:&amp;nbsp;Dict,&amp;nbsp;token:&amp;nbsp;str&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;)&amp;nbsp;-&amp;gt;&amp;nbsp;dict:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;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;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;self._get_timestamp(),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;format&amp;quot;:&amp;nbsp;&amp;quot;json&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;v&amp;quot;:&amp;nbsp;&amp;quot;2.0&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sign_method&amp;quot;:&amp;nbsp;&amp;quot;md5&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;**biz_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;nbsp;&amp;nbsp;if&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;params[&amp;quot;access_token&amp;quot;]&amp;nbsp;=&amp;nbsp;token
&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._sign(params)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;requests.post(self.gateway,&amp;nbsp;data=params,&amp;nbsp;timeout=10)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;resp.json()
&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;error&amp;quot;:&amp;nbsp;str(e)}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_get_timestamp(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;京东用秒(10位)，淘宝/1688用毫秒(13位)&amp;nbsp;——&amp;nbsp;这是最容易踩的坑！&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;self.platform&amp;nbsp;==&amp;nbsp;&amp;quot;jd&amp;quot;:
&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;str(int(time.time()))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;str(int(time.time()&amp;nbsp;*&amp;nbsp;1000))


#&amp;nbsp;=====&amp;nbsp;测试调用示例&amp;nbsp;=====
#&amp;nbsp;jd_client&amp;nbsp;=&amp;nbsp;EcomClient(&amp;quot;jd&amp;quot;,&amp;nbsp;&amp;quot;KEY&amp;quot;,&amp;nbsp;&amp;quot;SEC&amp;quot;,&amp;nbsp;&amp;quot;https://api.jd.com/routerjson&amp;quot;)
#&amp;nbsp;tb_client&amp;nbsp;=&amp;nbsp;EcomClient(&amp;quot;tb&amp;quot;,&amp;nbsp;&amp;quot;KEY&amp;quot;,&amp;nbsp;&amp;quot;SEC&amp;quot;,&amp;nbsp;&amp;quot;https://gw.api.taobao.com/router/rest&amp;quot;)
#&amp;nbsp;ali_client&amp;nbsp;=&amp;nbsp;EcomClient(&amp;quot;al1688&amp;quot;,&amp;nbsp;&amp;quot;KEY&amp;quot;,&amp;nbsp;&amp;quot;SEC&amp;quot;,&amp;nbsp;&amp;quot;https://gw.open.1688.com/openapi/param2/1/com.alibaba.product/alibaba.cps.op.search&amp;quot;)

#&amp;nbsp;print(jd_client.execute(&amp;quot;jingdong.ware.sku.read&amp;quot;,&amp;nbsp;{&amp;quot;sku_id&amp;quot;:&amp;nbsp;&amp;quot;12345&amp;quot;}))&lt;/pre&gt;&lt;h3&gt;⚠️ 源码关键点提醒（对比实测必备）&lt;/h3&gt;&lt;ul class=&quot;ybc-ul-component list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;时间戳差异&lt;/strong&gt;：京东JOS用&lt;strong&gt;10位秒级&lt;/strong&gt;，淘宝TOP与1688用&lt;strong&gt;13位毫秒级&lt;/strong&gt;，混用会直接报“Invalid Signature”。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;QPS压测&lt;/strong&gt;：免费账号建议用&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;time.sleep(1/QPS)&lt;/code&gt;控制频率，京东免费2 QPS，若瞬间并发超了会返回&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;limit frequency&lt;/code&gt;而非扣费。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;额度耗尽&lt;/strong&gt;：淘宝TOP在日额度用完后会返回&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;request count limit&lt;/code&gt;，京东JOS则会阻断调用并提示升级资源包。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;div class=&quot;ybc-p&quot;&gt;如果你愿意，我可以帮你写一个&lt;strong&gt;三平台并行的小脚本&lt;/strong&gt;，用同一个SKU ID分别调京东/淘宝/1688的商品详情接口，直观打印各自的&lt;strong&gt;响应耗时、剩余额度报错、返回字段丰富度&lt;/strong&gt;，方便你做技术选型压测。&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 14 Jul 2026 10:04:33 +0800</pubDate></item><item><title>《仿电商ERP：Spring Boot整合京东JOS实现商品/订单/库存三件套自动同步》（附python源码）</title><link>https://alexob.com/?id=438</link><description>&lt;div class=&quot;ybc-p&quot;&gt;虽然标题是《仿电商ERP：Spring Boot整合京东JOS...》，但你明确要求了&lt;strong&gt;附Python源码&lt;/strong&gt;，下面我给你一套&lt;strong&gt;“架构思路（Spring Boot视角）+ 可直接跑的Python实现”&lt;/strong&gt;，聚焦&lt;strong&gt;商品 / 订单 / 库存三件套自动同步&lt;/strong&gt;，方便你对照理解或先用Python做原型验证。&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;一、仿ERP同步整体架构（对照Spring Boot思路）&lt;/h2&gt;&lt;div class=&quot;ybc-p&quot;&gt;在Java Spring Boot里通常是分层设计，Python这边可以一一对应：&lt;/div&gt;&lt;ul class=&quot;ybc-ul-component list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;配置层&lt;/strong&gt;：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;AppKey / AppSecret / AccessToken&lt;/code&gt;统一管理&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;→ 对应 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;@ConfigurationProperties&lt;/code&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;平台适配层&lt;/strong&gt;：京东JOS签名、网关、鉴权封装&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;→ 对应 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;JdClient / JosTemplate&lt;/code&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;业务同步层&lt;/strong&gt;：商品、订单、库存增量拉取 + 本地落库&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;→ 对应 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;XxxSyncService&lt;/code&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;调度层&lt;/strong&gt;：定时任务（APScheduler / Spring &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;@Scheduled&lt;/code&gt;）&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;→ 对应 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;ScheduledExecutorService&lt;/code&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;幂等与重试&lt;/strong&gt;：订单号去重、异常重试、分页游标&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;→ 对应 数据库唯一索引 + &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;@Retryable&lt;/code&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;二、京东JOS通用API Client（Python，含MD5签名）&lt;/h2&gt;&lt;div class=&quot;ybc-p&quot;&gt;京东JOS特点：&lt;/div&gt;&lt;ul class=&quot;ybc-ul-component list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;网关：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;https://api.jd.com/routerjson&lt;/code&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;签名：&lt;strong&gt;MD5(AppSecret + 排序KV + AppSecret)&lt;/strong&gt; → 大写&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;timestamp&lt;/code&gt;是&lt;strong&gt;秒级（10位）&lt;/strong&gt;，别用毫秒&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;jd_jos_client.py
import&amp;nbsp;hashlib
import&amp;nbsp;time
import&amp;nbsp;requests
from&amp;nbsp;typing&amp;nbsp;import&amp;nbsp;Dict

封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex
class&amp;nbsp;JdJosClient:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GATEWAY&amp;nbsp;=&amp;nbsp;&amp;quot;https://api.jd.com/routerjson&amp;quot;

&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;access_token:&amp;nbsp;str&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_key&amp;nbsp;=&amp;nbsp;app_key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_secret&amp;nbsp;=&amp;nbsp;app_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.access_token&amp;nbsp;=&amp;nbsp;access_token

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_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;剔除&amp;nbsp;sign、空值
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;filtered&amp;nbsp;=&amp;nbsp;sorted(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&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;k&amp;nbsp;!=&amp;nbsp;&amp;quot;sign&amp;quot;&amp;nbsp;and&amp;nbsp;v&amp;nbsp;is&amp;nbsp;not&amp;nbsp;None&amp;nbsp;and&amp;nbsp;str(v).strip()&amp;nbsp;!=&amp;nbsp;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;kv&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;.join(f&amp;quot;{k}{v}&amp;quot;&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;filtered)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw&amp;nbsp;=&amp;nbsp;self.app_secret&amp;nbsp;+&amp;nbsp;kv&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(raw.encode(&amp;quot;utf-8&amp;quot;)).hexdigest().upper()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;execute(self,&amp;nbsp;method:&amp;nbsp;str,&amp;nbsp;biz_params:&amp;nbsp;Dict)&amp;nbsp;-&amp;gt;&amp;nbsp;dict:
&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;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;str(int(time.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;quot;format&amp;quot;:&amp;nbsp;&amp;quot;json&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;v&amp;quot;:&amp;nbsp;&amp;quot;2.0&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sign_method&amp;quot;:&amp;nbsp;&amp;quot;md5&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;**biz_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;nbsp;&amp;nbsp;if&amp;nbsp;self.access_token:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;access_token&amp;quot;]&amp;nbsp;=&amp;nbsp;self.access_token

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;sign&amp;quot;]&amp;nbsp;=&amp;nbsp;self._sign(params)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;requests.post(self.GATEWAY,&amp;nbsp;data=params,&amp;nbsp;timeout=15)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp.raise_for_status()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;resp.json()&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;三、三件套同步示例（商品 / 订单 / 库存）&lt;/h2&gt;&lt;h3&gt;1️⃣ 商品同步（SKU读取）&lt;/h3&gt;&lt;div class=&quot;ybc-p&quot;&gt;对应JOS接口：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.ware.sku.read&lt;/code&gt;&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;def&amp;nbsp;sync_products(client:&amp;nbsp;JdJosClient,&amp;nbsp;sku_ids:&amp;nbsp;str):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sku_ids:&amp;nbsp;逗号分隔的skuId字符串
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;client.execute(&amp;quot;jingdong.ware.sku.read&amp;quot;,&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;sku_ids,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;field&amp;quot;:&amp;nbsp;&amp;quot;sku_id,outer_id,stock_num,price,ware_name&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data&amp;nbsp;=&amp;nbsp;result.get(&amp;quot;jingdong_ware_sku_read_responce&amp;quot;,&amp;nbsp;{})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;skus&amp;nbsp;=&amp;nbsp;data.get(&amp;quot;skus&amp;quot;,&amp;nbsp;[])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;sku&amp;nbsp;in&amp;nbsp;skus:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print({
&amp;nbsp;&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;sku.get(&amp;quot;sku_id&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;name&amp;quot;:&amp;nbsp;sku.get(&amp;quot;ware_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;quot;price&amp;quot;:&amp;nbsp;sku.get(&amp;quot;price&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;stock&amp;quot;:&amp;nbsp;sku.get(&amp;quot;stock_num&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})&lt;/pre&gt;&lt;hr/&gt;&lt;h3&gt;2️⃣ 订单同步（增量分页拉取）&lt;/h3&gt;&lt;div class=&quot;ybc-p&quot;&gt;对应接口：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jd.order.search&lt;/code&gt;/ &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.pop.order.search&lt;/code&gt;&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;def&amp;nbsp;sync_orders(client:&amp;nbsp;JdJosClient,&amp;nbsp;start_time:&amp;nbsp;str,&amp;nbsp;end_time:&amp;nbsp;str,&amp;nbsp;page:&amp;nbsp;int&amp;nbsp;=&amp;nbsp;1):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start_time&amp;nbsp;/&amp;nbsp;end_time:&amp;nbsp;yyyy-MM-dd&amp;nbsp;HH:mm:ss
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;client.execute(&amp;quot;jingdong.pop.order.search&amp;quot;,&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;start_date&amp;quot;:&amp;nbsp;start_time,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;end_date&amp;quot;:&amp;nbsp;end_time,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;order_state&amp;quot;:&amp;nbsp;&amp;quot;WAIT_SELLER_STOCK_OUT,WAIT_BUYER_CONFIRM_GOODS,FINISHED&amp;quot;,
&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;quot;page_size&amp;quot;:&amp;nbsp;100,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;orders&amp;nbsp;=&amp;nbsp;result.get(&amp;quot;jingdong_pop_order_search_responce&amp;quot;,&amp;nbsp;{}).get(&amp;quot;order_list&amp;quot;,&amp;nbsp;[])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;o&amp;nbsp;in&amp;nbsp;orders:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print({
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;order_id&amp;quot;:&amp;nbsp;o.get(&amp;quot;order_id&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;state&amp;quot;:&amp;nbsp;o.get(&amp;quot;order_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;quot;amount&amp;quot;:&amp;nbsp;o.get(&amp;quot;order_total_price&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;len(orders)&lt;/pre&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;ERP实践&lt;/strong&gt;：&lt;/div&gt;&lt;ul class=&quot;ybc-ul-component list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;modified&lt;/code&gt;时间做增量&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;本地表用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;order_id&lt;/code&gt;做唯一索引防重&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;分页直到返回条数为0&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h3&gt;3️⃣ 库存同步（读取 + 回写思路）&lt;/h3&gt;&lt;ul class=&quot;ybc-ul-component list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;读取&lt;/strong&gt;：复用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.ware.sku.read&lt;/code&gt;里的 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;stock_num&lt;/code&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;回写（ERP→京东）&lt;/strong&gt;：用库存更新接口（需对应权限），一般按 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;sku_id + outer_id&lt;/code&gt;映射本地仓库库存&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;ybc-p&quot;&gt;伪代码思路：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;def&amp;nbsp;sync_stock_to_jd(client,&amp;nbsp;sku_id,&amp;nbsp;new_stock):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;实际接口以京东文档为准，示例仅为结构
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client.execute(&amp;quot;jingdong.ware.stock.update&amp;quot;,&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;sku_id,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;quantity&amp;quot;:&amp;nbsp;new_stock,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;四、定时任务（仿 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;@Scheduled&lt;/code&gt;）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;from&amp;nbsp;apscheduler.schedulers.blocking&amp;nbsp;import&amp;nbsp;BlockingScheduler

def&amp;nbsp;job():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client&amp;nbsp;=&amp;nbsp;JdJosClient(&amp;quot;APP_KEY&amp;quot;,&amp;nbsp;&amp;quot;APP_SECRET&amp;quot;,&amp;nbsp;&amp;quot;ACCESS_TOKEN&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sync_products(client,&amp;nbsp;&amp;quot;123456,789012&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sync_orders(client,&amp;nbsp;&amp;quot;2026-07-13&amp;nbsp;00:00:00&amp;quot;,&amp;nbsp;&amp;quot;2026-07-14&amp;nbsp;23:59:59&amp;quot;)

if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scheduler&amp;nbsp;=&amp;nbsp;BlockingScheduler()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scheduler.add_job(job,&amp;nbsp;&amp;quot;interval&amp;quot;,&amp;nbsp;minutes=30,&amp;nbsp;id=&amp;quot;jd_sync_job&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scheduler.start()&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;五、常见坑（京东JOS特有）&lt;/h2&gt;&lt;ul class=&quot;ybc-ul-component list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;时间戳用秒&lt;/strong&gt;：京东是10位秒级，淘宝才是毫秒，混用必报签名错误&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;参数名ASCII排序&lt;/strong&gt;：必须严格排序再拼串&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;订单接口要access_token&lt;/strong&gt;：商品公开读可能不用，但订单/库存一定需要OAuth授权&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;ybc-li-component__dot-wp&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ybc-li-component_content&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;分页+增量&lt;/strong&gt;：不要全量扫历史订单，用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;modified&lt;/code&gt;时间窗口 + 页游标&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;div class=&quot;ybc-p&quot;&gt;如果你愿意，我可以帮你把这套 Python 同步脚本改成&lt;strong&gt;标准 Spring Boot 分层结构（Config / Client / Service / Scheduled）的Java示例代码&lt;/strong&gt;，方便你直接往ERP项目里搬。&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 14 Jul 2026 09:48:14 +0800</pubDate></item></channel></rss>