前言 转转作为主流二手交易平台,商品数据和全新电商平台存在明显区别。网上多数示例仅提取标题、标价,忽略二手场景关键信息:商品成色、验机报告标识、是否支持平台质保、个人卖家与商家区分、实际到手价等业务字段。在做二手比价、商品监控业务时,如果直接拿原始返回字段,很容易出现价格错乱、成色识别错误、无法区分验机机器等问题。 本文不从简单请求调用入手,重点聚焦二手业务层的数据清洗、状态映射、异常兜底逻辑,封装可直接用于业务系统的工具函数,同时增加分级异常捕获,避免接口波动导致整个程序中断。 前置准备 对接开放接口需要提前申请应用凭证,获取 app_key、app_secret。接口返回为 JSON 格式,二手商品会存在部分字段为空的情况,例如未走验机服务则验机相关字段全部为空,代码必须做好空值兼容。 完整示例代码 核心逻辑解读 1. 签名封装:按照平台规则对参数排序拼接密钥生成 md5 签名,时间戳用来防重放攻击。 实战踩坑总结 第一,大量二手商品没有原始市场价字段,代码不能直接强取值,必须设置默认 0,否则会触发 KeyError。
依赖库仅需要 requests,执行安装:pip install requests
import requests
import hashlib
import time
class ZhuanZhuanItemClient:
def __init__(self, app_key, app_secret):
self.app_key = app_key
self.app_secret = app_secret
self.base_url = "https://open.zhuanzhuan.com/api/item/detail"
def _gen_sign(self, params):
"""生成接口签名"""
sorted_items = sorted(params.items())
raw_str = "".join([f"{k}{v}" for k, v in sorted_items]) + self.app_secret
return hashlib.md5(raw_str.encode("utf‑8")).hexdigest()
def get_item_detail(self, item_id):
params = {
"app_key": self.app_key,
"timestamp": str(int(time.time())),
"item_id": item_id
}
params["sign"] = self._gen_sign(params)
try:
resp = requests.get(self.base_url, params=params, timeout=10)
resp.raise_for_status()
res_json = resp.json()
if res_json.get("code") != 0:
return {"success": False, "msg": res_json.get("msg"), "data": None}
raw_data = res_json["data"]
# 二手数据归一化处理
result = {
"item_id": raw_data.get("item_id"),
"title": raw_data.get("title", ""),
"price": float(raw_data.get("price", 0)),
"market_price": float(raw_data.get("original_price", 0)),
"condition_text": self._parse_condition(raw_data.get("condition")),
"is_official_verify": bool(raw_data.get("has_verify_report", False)),
"seller_type": "merchant" if raw_data.get("is_business") else "personal",
"support_warranty": bool(raw_data.get("support_warranty", False)),
"pic_list": raw_data.get("images", []),
"desc": raw_data.get("description", "")
}
return {"success": True, "data": result}
except requests.exceptions.RequestException as e:
return {"success": False, "msg": f"网络异常:{str(e)}", "data": None}
def _parse_condition(self, val):
"""成色编码映射,把数字编码转为业务可读文本"""
mapping = {1:"全新",2:"99新",3:"95新",4:"9成新",5:"8成新及以下"}
return mapping.get(val, "未知成色")
if __name__ == "__main__":
client = ZhuanZhuanItemClient("your_app_key","your_app_secret")
ret = client.get_item_detail("1234567890")
print(ret)
2. 成色状态映射:平台返回数字编码,内部做字典映射转换为业务可读成色文本,方便后续统计筛选。
3. 卖家身份、验机标识提取:区分个人卖家与商家,识别是否附带转转验机报告,这是二手业务非常关键的维度。
4. 多层异常捕获:区分 HTTP 异常、业务错误码、网络超时,统一返回结构化结果,上层业务不需要大量 try‑except。
第二,验机报告、质保字段不是所有商品都存在,直接强转布尔可以兼容 key 不存在场景。
第三,接口存在访问频率限制,循环批量拉取详情时需要增加延时,短时间高频调用会触发限流返回错误码。
第四,部分下架商品接口不会直接返回 404,而是业务 code 非 0,要优先判断业务返回码,不能只依靠 HTTP 状态码。