通过 API 实现商品管理自动化,核心是用闲鱼官方开放平台 API 打通「商品创建→上架→维护→下架」全生命周期,替代人工重复操作(如批量上新、定时上下架、动态调价、库存同步)。结合实战场景,可按「基础准备→核心功能实现→自动化调度→风控优化」四步落地,以下是具体方案:
一、基础准备:打通 API 接入与数据底座
在实现自动化前,需完成「API 接入环境搭建」和「商品数据源标准化」,确保自动化流程可落地:
1. 核心前置条件
- 已完成闲鱼开放平台开发者账号注册、应用创建、接口权限申请(需申请「商品发布、商品编辑、商品上下架、图片上传」等核心权限);
- 已封装基础 API 客户端(含签名、Token 自动刷新、请求重试,参考前文「核心接口封装」方案);
- 准备商品数据源:统一格式的商品信息(如 Excel/CSV/ERP 数据),包含「标题、价格、分类 ID、描述、本地图片路径、库存、发货地址」等必填字段。
2. 数据标准化示例(Excel 模板)
| 商品标题(title) | 价格(price) | 分类 ID(category_id) | 商品描述(description) | 本地图片路径(local_image_paths) | 发货地址(location) | 库存(stock) | 商品类型(item_type) | 定时上架时间(online_time) | 定时下架时间(offline_time) |
|---|---|---|---|---|---|---|---|---|---|
| 二手 iPhone 13 128G | 3999.99 | 12345(需真实分类 ID) | 95 新无划痕,电池 88% | ./images/iphone1.jpg,./images/iphone2.jpg | 深圳南山 | 1 | 1(二手) | 2025-11-19 09:00:00 | 2025-11-19 23:00:00 |
| 全新 AirPods Pro 2 | 1799.00 | 67890(需真实分类 ID) | 未拆封,全国联保 | ./images/airpods.jpg | 广州天河 | 3 | 2(全新) | 2025-11-19 10:00:00 | 2025-11-19 22:00:00 |
3. 核心依赖补充
- 数据读取:
pandas(解析 Excel/CSV); - 定时调度:
APScheduler(实现定时上下架); - 数据存储:
MySQL/Redis(存储商品 ID、状态、调价记录,避免重复操作)。
二、核心自动化功能实现(实战代码)
基于标准化数据和 API 封装,聚焦「批量上新、定时上下架、动态调价、库存同步、批量下架」5 个高频场景,实现端到端自动化:
1. 批量上新自动化(从 Excel/ERP 导入)
业务逻辑
- 读取标准化商品数据源(Excel/ERP);
- 自动上传本地图片到闲鱼,获取合法 URL;
- 调用商品发布 API 批量创建商品;
- 记录发布结果(商品 ID、状态)到数据库,失败时告警。
代码实现
python
运行
# service/item_automation.py
import pandas as pd
from typing import List, Dict
from api.upload import upload_image # 图片上传接口(前文封装)
from api.item import publish_item # 商品发布接口(前文封装)
from db.item_db import ItemDB # 商品数据库操作(自定义)
from utils.logger import logger
from notification.dingtalk import send_dingtalk_msg # 钉钉告警工具
def batch_publish_from_excel(excel_path: str) -> Dict[str, any]:
"""从 Excel 批量发布商品"""
# 1. 读取并校验 Excel 数据
try:
df = pd.read_excel(excel_path)
# 过滤必填项为空的商品
required_cols = ["title", "price", "category_id", "local_image_paths", "location"]
df = df.dropna(subset=required_cols)
item_list = df.to_dict("records")
logger.info(f"读取到 {len(item_list)} 个有效商品,开始批量发布")
except Exception as e:
logger.error(f"读取 Excel 失败:{str(e)}")
send_dingtalk_msg(f"闲鱼批量上新失败:{str(e)}")
raise
db = ItemDB()
results = {
"total": len(item_list),
"success_count": 0,
"fail_count": 0,
"fail_details": []
}
# 2. 逐个发布商品(避免高频请求触发限流,添加 1-2 秒延迟)
for idx, item in enumerate(item_list):
try:
# 解析本地图片路径(Excel 中用逗号分隔)
local_image_paths = item["local_image_paths"].split(",")
if len(local_image_paths) > 9:
raise ValueError("图片数量不能超过 9 张")
# 3. 自动上传图片
logger.info(f"正在上传第 {idx+1} 个商品图片:{local_image_paths}")
image_urls = upload_image(local_image_paths)
item["images"] = ",".join(image_urls) # 替换为闲鱼图片 URL
# 4. 构造商品发布参数(匹配接口要求)
publish_params = {
"title": item["title"],
"price": item["price"],
"category_id": item["category_id"],
"description": item.get("description", ""),
"images": item["images"],
"location": item["location"],
"stock": item.get("stock", 1),
"item_type": item.get("item_type", 1)
}
# 5. 调用发布 API
publish_result = publish_item(publish_params)
item_id = publish_result["item_id"]
logger.info(f"第 {idx+1} 个商品发布成功,商品 ID:{item_id}")
# 6. 记录到数据库(关联商品 ID 与原始数据,便于后续维护)
db.save_item({
"item_id": item_id,
"title": item["title"],
"price": item["price"],
"stock": item["stock"],
"online_time": item.get("online_time"),
"offline_time": item.get("offline_time"),
"status": 1 # 1=已上架
})
results["success_count"] += 1
except Exception as e:
fail_msg = f"第 {idx+1} 个商品(标题:{item['title']})失败:{str(e)}"
logger.error(fail_msg)
results["fail_count"] += 1
results["fail_details"].append(fail_msg)
# 7. 推送发布结果通知
notify_msg = f"""闲鱼批量上新完成!
总数量:{results['total']} | 成功:{results['success_count']} | 失败:{results['fail_count']}
失败详情:{'; '.join(results['fail_details'])}"""
send_dingtalk_msg(notify_msg)
return results
2. 定时上下架自动化(提升商品曝光)
业务逻辑
- 从数据库读取商品的「定时上架时间」「定时下架时间」;
- 用
APScheduler定时触发上下架任务; - 调用闲鱼「商品上架 API」(
xiaoyuxianyu.item.online)/「商品下架 API」(xiaoyuxianyu.item.offline); - 更新商品状态到数据库,失败时重试并告警。
代码实现
python
运行
# service/task_scheduler.py
from datetime import datetime
from apscheduler.schedulers.background import BackgroundScheduler
from api.item import update_item_status # 商品状态更新接口(自定义封装)
from db.item_db import ItemDB
from utils.logger import logger
from notification.dingtalk import send_dingtalk_msg
def auto_online_items():
"""自动上架:按商品配置的 online_time 触发"""
db = ItemDB()
# 查询当前时间需上架的商品(status=0=待上架,online_time ≤ 当前时间)
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
pending_items = db.query_items({
"status": 0,
"online_time_lte": current_time
})
if not pending_items:
logger.info("无待上架商品")
return
fail_ids = []
for item in pending_items:
item_id = item["item_id"]
try:
# 调用上架 API(status=1 表示上架)
update_item_status(item_id, status=1)
# 更新数据库状态
db.update_item_status(item_id, status=1, online_time_actual=current_time)
logger.info(f"商品 {item_id}({item['title']})自动上架成功")
except Exception as e:
logger.error(f"商品 {item_id} 上架失败:{str(e)}")
fail_ids.append(item_id)
if fail_ids:
send_dingtalk_msg(f"自动上架失败商品 ID:{fail_ids},请手动处理")
def auto_offline_items():
"""自动下架:按商品配置的 offline_time 触发"""
db = ItemDB()
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 查询当前时间需下架的商品(status=1=已上架,offline_time ≤ 当前时间)
pending_items = db.query_items({
"status": 1,
"offline_time_lte": current_time
})
if not pending_items:
logger.info("无待下架商品")
return
fail_ids = []
for item in pending_items:
item_id = item["item_id"]
try:
# 调用下架 API(status=0 表示下架)
update_item_status(item_id, status=0)
db.update_item_status(item_id, status=0, offline_time_actual=current_time)
logger.info(f"商品 {item_id}({item['title']})自动下架成功")
except Exception as e:
logger.error(f"商品 {item_id} 下架失败:{str(e)}")
fail_ids.append(item_id)
if fail_ids:
send_dingtalk_msg(f"自动下架失败商品 ID:{fail_ids},请手动处理")
def start_item_scheduler():
"""启动商品定时任务调度器"""
scheduler = BackgroundScheduler()
# 每 5 分钟检查一次待上架/待下架商品(避免时间偏差)
scheduler.add_job(auto_online_items, trigger="interval", minutes=5)
scheduler.add_job(auto_offline_items, trigger="interval", minutes=5)
scheduler.start()
logger.info("商品定时上下架调度器启动成功")
3. 动态调价自动化(保持价格竞争力)
业务逻辑
- 配置调价规则(如「库存≤3 件涨价 5%」「竞品价低于当前价 10 元降价 8 元」);
- 定时(每小时)查询商品当前库存、当前价格;
- 调用闲鱼「商品价格更新 API」(
xiaoyuxianyu.item.update.price)执行调价; - 记录调价日志,避免 24 小时内频繁调价触发风控。
代码实现
python
运行
# service/price_automation.py
from typing import Dict
from datetime import datetime, timedelta
from api.item import get_item_detail, update_item_price # 商品详情/调价接口
from db.item_db import ItemDB
from utils.logger import logger
# 全局调价规则(可存储在数据库,支持动态配置)
PRICE_ADJUST_RULES = {
"min_stock_for_increase": 3, # 库存≤3 件涨价
"increase_rate": 0.05, # 涨价比例 5%
"competitor_price_source": "xianyu_search", # 竞品价来源(闲鱼搜索/第三方)
"price_diff_threshold": 10, # 竞品价低于当前价 10 元触发降价
"decrease_amount": 8, # 降价金额 8 元
"max_adjust_times_per_day": 2 # 24 小时内最多调价 2 次
}
def get_competitor_price(item_title: str) -> float:
"""获取竞品价格(示例:调用闲鱼搜索 API 或第三方工具)"""
# 实际场景需封装闲鱼搜索 API,查询同类商品低价
# 此处简化为模拟竞品价(可替换为真实查询逻辑)
import random
return random.uniform(3800, 3950) # 以 iPhone 13 为例,模拟竞品价
def adjust_item_price(item_id: str) -> bool:
"""单个商品动态调价"""
db = ItemDB()
# 1. 获取商品当前信息
item_detail = get_item_detail(item_id)
current_price = item_detail.get("price")
current_stock = item_detail.get("stock")
item_title = item_detail.get("title")
logger.info(f"商品 {item_id} 当前价格:{current_price} 元,库存:{current_stock} 件")
# 2. 检查 24 小时内调价次数(避免频繁调价)
adjust_logs = db.query_price_adjust_logs({
"item_id": item_id,
"create_time_gte": (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d %H:%M:%S")
})
if len(adjust_logs) >= PRICE_ADJUST_RULES["max_adjust_times_per_day"]:
logger.info(f"商品 {item_id} 24 小时内已调价 {len(adjust_logs)} 次,跳过本次")
return True
# 3. 计算目标价格
target_price = current_price
competitor_price = get_competitor_price(item_title) # 获取竞品价
if current_stock <= PRICE_ADJUST_RULES["min_stock_for_increase"]:
# 库存不足,涨价
target_price = round(current_price * (1 + PRICE_ADJUST_RULES["increase_rate"]), 2)
logger.info(f"库存不足,涨价 5% → 目标价:{target_price} 元(竞品价:{competitor_price} 元)")
elif competitor_price < (current_price - PRICE_ADJUST_RULES["price_diff_threshold"]):
# 竞品价更低,降价
target_price = round(current_price - PRICE_ADJUST_RULES["decrease_amount"], 2)
logger.info(f"竞品价更低,降价 8 元 → 目标价:{target_price} 元(竞品价:{competitor_price} 元)")
else:
logger.info(f"无需调价(当前价:{current_price} 元,竞品价:{competitor_price} 元)")
return True
# 4. 执行调价
try:
update_item_price(item_id, target_price)
# 记录调价日志到数据库
db.save_price_adjust_log({
"item_id": item_id,
"old_price": current_price,
"new_price": target_price,
"adjust_reason": "库存不足" if current_stock <= 3 else "竞品价更低",
"competitor_price": competitor_price,
"create_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
})
logger.info(f"商品 {item_id} 调价成功")
return True
except Exception as e:
logger.error(f"商品 {item_id} 调价失败:{str(e)}")
return False
def batch_adjust_item_prices():
"""批量调价(每小时执行一次)"""
db = ItemDB()
# 查询已上架的商品(status=1)
online_items = db.query_items({"status": 1})
logger.info(f"开始批量调价,共 {len(online_items)} 个已上架商品")
success_count = 0
fail_ids = []
for item in online_items:
if adjust_item_price(item["item_id"]):
success_count += 1
else:
fail_ids.append(item["item_id"])
logger.info(f"批量调价完成:成功 {success_count} 个,失败 {len(fail_ids)} 个(失败 ID:{fail_ids})")
4. 库存同步自动化(避免超卖 / 库存不一致)
业务逻辑
- 监听闲鱼订单状态变更(如 “订单付款成功”“订单取消”);
- 订单付款成功 → 扣减对应商品库存;
- 订单取消 / 退款成功 → 回补商品库存;
- 同步库存变更到闲鱼平台(调用「商品库存更新 API」)和本地数据库。
代码实现
python
运行
# service/stock_automation.py
from typing import Dict
from api.item import update_item_stock # 库存更新接口
from db.item_db import ItemDB
from db.order_db import OrderDB
from utils.logger import logger
def sync_stock_after_order_change(order_data: Dict[str, any]):
"""订单状态变更后同步库存"""
order_id = order_data["order_id"]
order_status = order_data["order_status"]
item_id = order_data["item_id"] # 闲鱼订单关联的商品 ID
order_quantity = order_data["quantity"] # 订单购买数量
db = ItemDB()
order_db = OrderDB()
try:
# 1. 获取商品当前库存
item = db.get_item_by_id(item_id)
current_stock = item["stock"]
logger.info(f"订单 {order_id} 状态变更为 {order_status},商品 {item_id} 当前库存:{current_stock}")
# 2. 根据订单状态调整库存
if order_status == "PAID": # 订单付款成功 → 扣减库存
new_stock = current_stock - order_quantity
if new_stock < 0:
raise ValueError(f"库存不足:当前 {current_stock} 件,需扣减 {order_quantity} 件")
adjust_type = "扣减"
elif order_status == "CANCELLED" or order_status == "REFUNDED": # 订单取消/退款 → 回补库存
new_stock = current_stock + order_quantity
adjust_type = "回补"
else:
logger.info(f"订单 {order_id} 状态 {order_status} 无需调整库存")
return True
# 3. 同步库存到闲鱼平台
update_item_stock(item_id, new_stock)
# 4. 同步库存到本地数据库
db.update_item_stock(item_id, new_stock)
# 5. 记录库存变更日志
db.save_stock_change_log({
"item_id": item_id,
"old_stock": current_stock,
"new_stock": new_stock,
"adjust_type": adjust_type,
"related_order_id": order_id,
"create_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
})
logger.info(f"商品 {item_id} 库存{adjust_type}成功:{current_stock} → {new_stock}(关联订单:{order_id})")
return True
except Exception as e:
logger.error(f"订单 {order_id} 库存同步失败:{str(e)}")
# 记录异常订单,便于人工处理
order_db.mark_order_exception(order_id, exception_msg=str(e))
send_dingtalk_msg(f"订单 {order_id} 库存同步失败:{str(e)}")
return False
5. 批量下架自动化(滞销品 / 违规商品处理)
业务逻辑
- 配置批量下架规则(如「30 天无销量商品」「违规预警商品」);
- 定时(每周日)查询符合规则的商品;
- 调用闲鱼「商品下架 API」批量下架;
- 记录下架原因,推送通知给运营者。
代码实现
python
运行
# service/item_automation.py(扩展)
from datetime import datetime, timedelta
from api.item import update_item_status
from db.item_db import ItemDB
from utils.logger import logger
from notification.dingtalk import send_dingtalk_msg
def batch_offline_stagnant_items():
"""批量下架滞销商品(30 天无销量)"""
db = ItemDB()
# 查询 30 天无销量且当前已上架的商品
thirty_days_ago = (datetime.now() - timedelta(days=30)).strftime("%Y-%m-%d")
stagnant_items = db.query_items({
"status": 1,
"last_sale_time_lte": thirty_days_ago,
"sale_count": 0
})
if not stagnant_items:
logger.info("无滞销商品需下架")
return
logger.info(f"开始下架滞销商品,共 {len(stagnant_items)} 个")
success_count = 0
fail_ids = []
for item in stagnant_items:
item_id = item["item_id"]
try:
update_item_status(item_id, status=0) # 下架
db.update_item_status(item_id, status=0, offline_reason="30 天无销量(滞销)")
logger.info(f"滞销商品 {item_id}({item['title']})下架成功")
success_count += 1
except Exception as e:
logger.error(f"商品 {item_id} 下架失败:{str(e)}")
fail_ids.append(item_id)
# 推送结果通知
notify_msg = f"""滞销商品批量下架完成!
总数量:{len(stagnant_items)} | 成功:{success_count} | 失败:{len(fail_ids)}
失败 ID:{fail_ids}"""
send_dingtalk_msg(notify_msg)
三、自动化调度:整合所有功能并启动
通过「主程序」整合上述自动化功能,统一启动调度器,实现全流程无人干预:
python
运行
# main.py(商品管理自动化入口)
from service.item_automation import batch_publish_from_excel, batch_offline_stagnant_items
from service.task_scheduler import start_item_scheduler
from service.price_automation import batch_adjust_item_prices
from service.stock_automation import sync_stock_after_order_change
from apscheduler.schedulers.background import BackgroundScheduler
from utils.logger import logger
if __name__ == "__main__":
# 1. 手动触发:从 Excel 批量上新(可通过脚本/定时任务执行)
logger.info("=== 开始执行批量上新 ===")
batch_publish_from_excel("./data/商品列表.xlsx")
# 2. 启动定时任务调度器
logger.info("=== 启动自动化调度器 ===")
start_item_scheduler() # 定时上下架
# 3. 添加其他定时任务
scheduler = BackgroundScheduler()
scheduler.add_job(batch_adjust_item_prices, trigger="cron", hour=12) # 每天 12 点批量调价
scheduler.add_job(batch_offline_stagnant_items, trigger="cron", day_of_week=6) # 每周日下架滞销品
scheduler.start()
# 4. 监听订单状态变更(实际场景需对接闲鱼订单推送 API 或定时查询)
# 此处简化为模拟订单状态变更(真实场景需替换为消息队列/API 回调)
# mock_order_data = {"order_id": "123456", "order_status": "PAID", "item_id": "789012", "quantity": 1}
# sync_stock_after_order_change(mock_order_data)
# 保持程序运行
logger.info("商品管理自动化系统启动成功,持续运行中...")
try:
while True:
pass
except KeyboardInterrupt:
scheduler.shutdown()
logger.info("系统已关闭")
四、关键优化:风控规避与稳定性保障
商品管理自动化的核心是「合规 + 稳定」,需重点关注以下几点:
1. 规避闲鱼平台风控
- 控制请求频率:批量操作(如批量上新)需添加 1-2 秒随机延迟,避免触发 QPS 限流;
- 模拟真实行为:调价频率≤2 次 / 天,上下架避免 “秒上秒下”,间隔≥1 小时;
- 参数合规:商品标题、描述需符合闲鱼规则(如不包含敏感词),价格、库存需为合理数值(避免 0 元、99999 元等异常价);
- 官方 API 唯一来源:严禁使用逆向接口,否则可能导致账号封禁。
2. 稳定性保障技巧
- 重试机制:对网络超时、接口临时报错,使用
tenacity重试(最多 3 次,间隔 1 秒); - 异常兜底:每个自动化任务都需捕获异常,记录日志并推送告警,避免 “静默失败”;
- 数据备份:本地数据库存储商品 ID、状态、调价 / 库存日志,便于回滚和排查问题;
- 降级方案:API 调用失败时,自动切换为 “手动处理” 模式,推送通知给运营者。
3. 效率优化
- 增量操作:批量上新 / 同步时,通过商品标题、SKU 去重,避免重复创建商品;
- 缓存高频数据:商品分类 ID、快递公司列表等静态数据缓存到 Redis,减少接口调用;
- 动态配置规则:将调价规则、下架规则存储在数据库,支持在线修改,无需重启系统。
五、效果量化
以「小微商家(100 件商品)」为例,落地后效果对比:
| 操作类型 | 人工操作耗时 | 自动化操作耗时 | 效率提升 |
|---|---|---|---|
| 批量上新 100 件 | 3-4 小时 | 5-10 分钟 | 95%+ |
| 定时上下架(50 件) | 30-60 分钟 | 自动执行 | 100% |
| 动态调价(100 件) | 1-2 小时 / 天 | 自动执行(1 分钟) | 99%+ |
| 库存同步(50 单 / 天) | 30-60 分钟 | 实时自动同步 | 95%+ |
最终实现:运营者从 “商品上下架、价格调整、库存核对” 等重复劳动中解放,聚焦 “选品、优化商品详情” 等核心工作,同时减少 80% 以上的人工操作失误(如价格输错、库存漏改)。
总结
通过 API 实现商品管理自动化,核心是「标准化数据 + 模块化功能 + 自动化调度」:先通过 Excel/ERP 统一商品数据源,再封装批量上新、定时上下架、动态调价等核心功能,最后通过调度器整合全流程,结合风控规则和稳定性保障,实现 “少干预、高效率、低误差” 的商品管理模式。


被折叠的 条评论
为什么被折叠?



