当前位置: 首页 > news >正文

闲鱼API

用 pyxianyu 打通闲鱼商品、搜索、消息能力

GitHub 仓库:DoLovya/pyxianyu

前言:闲鱼自动化先别急着写业务,先把签名、登录态和接口入口封稳定。

一、问题

直接调闲鱼 Web 端接口,基本都会卡在这 3 个点:

  • 请求参数里有sign,不能裸调
  • Cookie 会刷新,常驻进程容易失效
  • 商品、搜索、消息能力分散,业务代码很快写乱

目标:做一个可复用的 Python 库,把签名、请求、鉴权、业务 API统一起来。

二、方案

1. 统一签名和请求

所有业务 API 都走同一套签名链路,这层一定先收口。

importtimeimportrequestsfrompyxianyu.utils.xianyu_utilsimportgenerate_signclassXianyuClient:def__init__(self,cookies,device_id):self.session=requests.Session()self.session.cookies.update(cookies)# 登录态注入self.device_id=device_iddefbuild_mtop_params(self,api):return{"jsv":"2.7.2","appKey":"34839810","t":str(int(time.time())*1000),"sign":"","api":api,"type":"originaljson","dataType":"json",}defbuild_signed_form(self,params,data_val):token=self.session.cookies.get("_m_h5_tk","").split("_")[0]params["sign"]=generate_sign(params["t"],token,data_val)# 生成 signreturn{"data":data_val}defensure_api_success(self,payload):ret=payload.get("ret")or[]ifretandnotret[0].startswith("SUCCESS"):raiseRuntimeError(ret[0])# 统一失败出口returnpayload

后面所有接口只管组装data,不用重复处理签名和异常。

2. 业务 API 模块化

登录态、商品、搜索、媒体分模块,对外只暴露一个入口。

classXianyuApis:def__init__(self,cookies,device_id):self.client=XianyuClient(cookies,device_id)self.auth_api=AuthApi(self.client)self.item_api=ItemApi(self.client)self.search_api=SearchApi(self.client)defget_token(self):returnself.auth_api.get_token()defget_item_info(self,item_id):returnself.item_api.get_item_info(item_id)defsearch_items(self,keyword,page_number=1,rows_per_page=20):returnself.search_api.search_items(keyword,page_number=page_number,rows_per_page=rows_per_page)

调用层只面向XianyuApis,不用关心底层 URL 和签名细节。

3. 先安装再调用

1.0.0版本开始,对外入口已经统一为xianyu命名,直接安装即可。

# 方式1:安装正式版pipinstall-Upyxianyu# 方式2:uv 安装uv pipinstall-Upyxianyu

如果你是本地调试仓库源码,也可以直接安装当前项目:

cdthird_party/pyxianyu pipinstall-e.

环境变量准备:

exportXIANYU_COOKIE='你的完整Cookie'

可直接运行的示例:

importosfrompyxianyu.xianyu_apisimportXianyuApisfrompyxianyu.utils.xianyu_utilsimportgenerate_device_id,trans_cookiesdefmain():cookie_str=os.environ["XIANYU_COOKIE"]# 完整 Cookiecookies=trans_cookies(cookie_str)user_id=cookies.get("unb","0")# 从 Cookie 中拿当前用户标识device_id=generate_device_id(user_id)api=XianyuApis(cookies,device_id)token_result=api.get_token()nav_result=api.get_user_page_nav()print("token ok:",bool(token_result.get("data")))print(nav_result)# 直接看接口原始返回if__name__=="__main__":main()

运行方式:

python demo.py

这个示例只依赖XIANYU_COOKIE,更适合先验证登录态和基础调用链路;如果字段结构有变化,先看print(nav_result)的原始结果最稳。

完整功能清单:

模块功能方法
鉴权获取登录 tokenget_token()
鉴权刷新登录态refresh_token()
商品获取商品详情get_item_info(item_id)
商品获取用户商品分页列表get_user_items(user_id, ...)
商品自动翻页拉取全部商品get_all_user_items(user_id, page_size=20)
商品下架商品downshelf_item(item_id)
商品发布前校验prepublish_check(item_id=None)
商品获取发布/编辑预置参数preget(item_id=None, source_id=None, publish_scene=None, bizcode=None)
商品获取商品编辑详情get_item_edit_detail(item_id)
商品编辑商品edit_item(payload)
商品发布全新商品publish_item(payload)
商品构造重新上架 payloadbuild_reshelf_payload(edit_detail_result, item_id=None, source_id=None)
商品一步重新上架商品reshelf_item(item_id, source_id=None)
搜索按关键词搜索商品search_items(keyword, page_number=1, rows_per_page=20, ...)
用户获取当前登录用户信息get_user_page_nav()
媒体上传图片/视频/音频upload_media(media_path)
消息创建单聊会话create_chat(ws, toid, item_id)
消息发送文本/图片消息send_msg(ws, cid, toid, message)
消息单次发送消息send_msg_once(toid, item_id, send_message)
消息拉取指定会话历史消息list_all_conversations(cid)
消息WebSocket 初始化注册init(ws)
消息心跳保活heart_beat(ws)
消息HTTP 登录态保活user_alive()
消息启动消息监听主循环main()
消息处理收到的消息handle_message(message, websocket)
消息类型构造文本消息make_text(text)
消息类型构造图片消息make_image(url, width=0, height=0)
消息类型构造音频消息make_audio(url, duration_ms=0)

如果只想记住一件事,XianyuApis负责 HTTP 能力聚合,XianyuLive负责 WebSocket 消息收发。

三、踩坑

  • ⚠️sign依赖_m_h5_tk,Cookie 缺这个字段就会直接失败。
  • ⚠️get_token()要限制重试次数,别把“令牌过期”写成死循环。
  • ⚠️ 编辑商品时部分布尔值是字符串,提交前要先归一化。
  • ⚠️XIANYU_COOKIE走环境变量,别写死在代码里。

四、总结

  • pyxianyu先解决的是签名、请求、鉴权,不是先堆接口数量。
  • 模块拆开,对外聚合成XianyuApis,业务代码会干净很多。
  • 底层库先封稳,后面接 MCP、机器人、运营脚本才省事。
http://www.jsqmd.com/news/1371191/

相关文章:

  • Cocos Creator消除游戏开发实战:数据结构、算法与性能优化
  • 聚合收款 - GrowthUME
  • 保温胶水哪个服务好? - 中媒介
  • Maven构建中资源文件丢失的排查与解决指南
  • XNB文件处理终极指南:轻松解包打包Stardew Valley游戏资源
  • 绵阳卫生间壁龛设计的施工条件与步骤
  • 河间汽车配件批发哪家质量好? - 中媒介
  • JMeter接口自动化测试:CSV数据驱动与批量执行实战指南
  • 互动教学App开发的好处和相关功能介绍
  • 加宽减震轮儿童平衡车制造商 - 中媒介
  • 好消息--------目前网站已经有少数人开始访问了
  • 零基础学SQL 03:ORDER BY / GROUP BY / HAVING——查询收尾三件套,别再写错顺序
  • 实拍图片一键找货源!详解 1688 图搜 API 六大落地应用场景
  • Unity关卡编辑器开发避坑指南:数据、撤销与协作架构实战
  • 室内水培设备推荐哪家 - 中媒介
  • 内存地址与空间:从底层原理到实战调优的深度解析
  • 传统工艺零食哪家好? - 中媒介
  • 【单片机课程设计/毕业设计】单片机驱动的农田湿度光照阈值声光报警控制系统设计 基于 STM32/51 单片机继电器控制水泵补光灯智能硬件开发(020602)
  • JetBrains IDE试用重置终极指南:简单三步无限延长开发工具使用时间
  • AI Agent:不是只会聊天的百科,而是能动手办事的AI助手,程序员必学的核心能力!
  • Unity ShaderGraph沙盒环境搭建:高效可视化着色器开发指南
  • SpringBoot格式化器原理与实战应用
  • Community Over Code Asia 2026 在北京圆满落幕!
  • 护眼仪蓝牙连接哪家好? - 中媒介
  • 高校实验室智能管理系统:Java+SSM与Flask混合架构实践
  • 单片机毕设选题推荐:基于继电器控制的酒驾车辆动力切断单片机系统设计 基于 MQ-3 传感器的多模式声光语音酒精报警硬件系统开发(020502)
  • 断桥铝系统窗哪家效果好? - 中媒介
  • C#开发者必备:dotnet命令行工具全指南
  • Spring AI Graph实战:构建集成RAG与Supervisor路由的智能体工作流
  • 北京旅游必吃融合菜餐厅 - 中媒介