基于Python的闲鱼急速退款一键脚本

📅 2026/7/15 3:59:56
基于Python的闲鱼急速退款一键脚本
项目结构textxianyu_refund_bot/ ├── main.py # 主程序入口 ├── config.yaml # 配置文件 ├── requirements.txt # 依赖 └── README.md # 说明文档安装依赖bashpip install -r requirements.txt配置文件 (config.yaml)yaml# 闲鱼开放平台 API 密钥 app_key: 你的APP_KEY app_secret: 你的APP_SECRET partner_id: apidoc # 退款策略 auto_agree: true # 是否自动同意退款 auto_agree_return: true # 是否自动同意退货 refund_timeout: 24 # 退款超时处理时间小时 # 日志配置 log_level: INFO log_file: refund_bot.log主程序代码 (main.py)#!/usr/bin/env python3 # -*- coding: utf-8 -*- 闲鱼急速退款一键脚本 扫码登录闲鱼后批量同意所有待处理退款 import os import sys import time import logging import yaml import asyncio from datetime import datetime from typing import Optional, Dict, Any, List # 第三方库 import requests import hmac import hashlib # 配置加载 sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from config import config # 日志配置 def setup_logging(): 配置日志 logger logging.getLogger(XianYuRefundBot) logger.setLevel(getattr(logging, config.log_level)) # 控制台输出 console_handler logging.StreamHandler() console_formatter logging.Formatter( %(asctime)s - %(levelname)s - %(message)s, datefmt%Y-%m-%d %H:%M:%S ) console_handler.setFormatter(console_formatter) logger.addHandler(console_handler) # 文件输出 file_handler logging.FileHandler(config.log_file, encodingutf-8) file_handler.setFormatter(console_formatter) logger.addHandler(file_handler) return logger # 签名工具 def generate_sign(params: Dict[str, Any], app_secret: str) - str: 生成 API 签名 Args: params: 请求参数字典不含 sign app_secret: 应用密钥 Returns: 十六进制签名字符串 # 拼接所有参数按 key 排序 sorted_items sorted(params.items()) sign_str .join([f{k}{v} for k, v in sorted_items]) sign_str fapp_key{config.app_key}formatjsonmethodalibaba.idle.isv.order.dealrefundpartner_id{config.partner_id}sign_methodhmactimestamp{int(time.time())}v2.0 sign_str fbiz_order_id{params.get(biz_order_id)} sign_str foperation{params.get(operation, AGREE_REFUND)} # HMAC-SHA1 签名 signature hmac.new( app_secret.encode(utf-8), sign_str.encode(utf-8), hashlib.sha1 ).hexdigest().upper() return signature # 闲鱼 API 客户端 class XianYuAPI: 闲鱼 API 客户端 TOP_URL https://gw.api.taobao.com/router/rest PRE_URL https://pre-gw.api.taobao.com/top/router/rest def __init__(self, session: Optional[str] None): self.session session self.logger logging.getLogger(XianYuRefundBot.API) self.app_key config.app_key self.app_secret config.app_secret self.partner_id config.partner_id def query_order(self, biz_order_id: str) - Dict[str, Any]: 查询订单信息 params { method: alibaba.idle.isv.order.query, app_key: self.app_key, format: json, partner_id: self.partner_id, sign_method: hmac, timestamp: str(int(time.time())), v: 2.0, biz_order_id: biz_order_id, } params[sign] generate_sign(params, self.app_secret) params[session] self.session response requests.post( self.TOP_URL, dataparams, headers{Content-Type: application/x-www-form-urlencoded} ) return response.json() def dealrefund(self, biz_order_id: str, operation: str AGREE_REFUND) - Dict[str, Any]: 同意退款 Args: biz_order_id: 订单号 operation: 操作类型 - AGREE_REFUND: 同意退款并执行打款 - REFUSE_REFUND: 拒绝退款 - AGREE_RETURN: 同意退货并提供退货地址 Returns: API 响应结果 params { method: alibaba.idle.isv.order.dealrefund, app_key: self.app_key, format: json, partner_id: self.partner_id, sign_method: hmac, timestamp: str(int(time.time())), v: 2.0, operation: operation, biz_order_id: biz_order_id, session: self.session, } params[sign] generate_sign(params, self.app_secret) response requests.post( self.TOP_URL, dataparams, headers{Content-Type: application/x-www-form-urlencoded} ) return response.json() def query_refund_status(self, dispute_id: str) - Dict[str, Any]: 查询退款单状态 params { method: alibaba.idle.isv.refund.query, app_key: self.app_key, format: json, partner_id: self.partner_id, sign_method: hmac, timestamp: str(int(time.time())), v: 2.0, dispute_id: dispute_id, } params[sign] generate_sign(params, self.app_secret) response requests.post( self.TOP_URL, dataparams, headers{Content-Type: application/x-www-form-urlencoded} ) return response.json() # 退款处理器 class RefundProcessor: 退款处理核心逻辑 def __init__(self, api_client: XianYuAPI): self.api api_client self.logger logging.getLogger(XianYuRefundBot.Processor) def can_agree_refund(self, order_info: Dict[str, Any]) - bool: 判断是否可以同意退款 Args: order_info: 订单信息查询结果 Returns: 是否可同意退款 refund_info order_info.get(refund, {}) # 检查订单状态 if refund_info.get(order_status) not in [2, 3]: # 已付款/已发货 return False # 检查退款单状态 refund_status refund_info.get(refund_status) if refund_status 9: # 已关闭/已超时 return False if refund_status 5: # 退款已同意 return False if refund_status 6: # 等待卖家处理 return False if refund_status 1: # 仅退款待卖家同意 return True if refund_status 3: # 退货退款待卖家同意 return True if refund_status 4: # 退货退款待买家寄回 return False # 此时应先同意退货AGREE_RETURN return refund_status in [1, 3] async def process_refund(self, biz_order_id: str) - Dict[str, Any]: 处理单个订单退款 Args: biz_order_id: 订单号 Returns: 处理结果 self.logger.info(f开始处理退款{biz_order_id}) # 1. 查询订单信息 order_info self.api.query_order(biz_order_id) if not order_info.get(api_success, False): self.logger.error(f查询订单失败{order_info}) return {success: False, reason: query_failed, info: order_info} refund_info order_info.get(module, {}).get(refund, {}) # 2. 判断是否可以同意退款 if not self.can_agree_refund(order_info): reason refund_info.get(refund_status) if reason 4: # 退货退款已同意退货等待买家寄回 self.logger.info(f订单 {biz_order_id} 已同意退货等待买家寄回) return {success: False, reason: await_return, info: refund_info} self.logger.warning(f订单 {biz_order_id} 当前状态无法同意退款) return {success: False, reason: not_eligible, info: refund_info} # 3. 同意退款 result self.api.dealrefund(biz_order_id, operationAGREE_REFUND) if not result.get(api_success, False): self.logger.error(f同意退款失败{result}) return {success: False, reason: agree_failed, info: result} # 4. 检查退款状态 dispute_id result.get(module, {}).get(dispute_id) if dispute_id: status self.api.query_refund_status(dispute_id) if status.get(api_success, False): self.logger.info(f退款单 {dispute_id} 状态{status.get(module, {}).get(refund_status)}) self.logger.info(f订单 {biz_order_id} 退款同意成功{result}) return {success: True, info: result} # 主程序 async def main(): 主程序入口 logger setup_logging() logger.info( * 50) logger.info(闲鱼急速退款一键脚本启动) logger.info( * 50) # 初始化 API 客户端 api_client XianYuAPI() processor RefundProcessor(api_client) # 查询所有待处理退款 logger.info(正在查询待处理退款...) orders api_client.query_order() if not orders.get(api_success, False): logger.error(查询订单失败请检查 API 密钥和 session) return # 筛选可同意退款的订单 refund_orders [] for order in orders.get(module, {}).get(list, []): if processor.can_agree_refund(order): refund_orders.append(order.get(biz_order_id)) if not refund_orders: logger.info(没有找到需要处理的退款订单) return logger.info(f找到 {len(refund_orders)} 个可同意退款的订单) logger.info(- * 50) # 批量处理退款 for i, order_id in enumerate(refund_orders, 1): result await processor.process_refund(order_id) if result[success]: logger.info(f✓ [ {i}/{len(refund_orders)} ] {order_id} 同意退款成功) else: reason result.get(reason, unknown) logger.warning(f✗ [ {i}/{len(refund_orders)} ] {order_id} 处理失败{reason}) # 输出汇总 logger.info(- * 50) logger.info(处理完成) logger.info(f成功同意{sum(1 for r in [await processor.process_refund(o) for o in refund_orders] if r[success])}) logger.info(f失败{len(refund_orders) - sum(1 for r in [await processor.process_refund(o) for o in refund_orders] if r[success])}) logger.info( * 50) logger.info(闲鱼急速退款一键脚本执行完毕) logger.info( * 50) if __name__ __main__: asyncio.run(main())使用说明bash# 1. 将上面代码保存为 main.py # 2. 将 API 密钥填入 config.yaml # 3. 运行脚本 python main.py注意事项TOP API 环境必须使用闲鱼开放平台的 TOP 环境预发或正式Session 权限订单相关接口需要使用卖家授权的 accessToken获取Cookie可查看相关教程服务商权限需要在闲鱼开放平台申请服务商权限