淘宝一键上货发布软件,淘宝批量发布上架工具, 淘宝批量上架脚本【python】

简介: 这个Python脚本实现了以下功能:完整的淘宝API调用封装

文章附件下载:https://www.pan38.com/dow/share.php?code=JCnzE 提取密码:5035

这个Python脚本实现了以下功能:

完整的淘宝API调用封装,包括签名生成和错误处理
支持单商品上传和批量并发上传
包含商品基本信息、图片、SKU等完整属性设置
自动重试机制和频率控制
详细的日志记录功能
从CSV文件加载商品数据的工具函数
多线程并发处理提高上传效率

import requests
import json
import time
import hashlib
import random
import os
from datetime import datetime
from concurrent.futures import ThreadPoolExecutor

class TaobaoBatchUploader:
def init(self, app_key, app_secret, session_key):
self.app_key = app_key
self.app_secret = app_secret
self.session_key = session_key
self.api_url = "https://eco.taobao.com/router/rest"
self.max_retries = 3
self.retry_delay = 2
self.log_file = "taobao_upload.log"

def _generate_sign(self, params):
    """生成API签名"""
    param_str = ""
    for key in sorted(params.keys()):
        param_str += key + str(params[key])
    sign_str = self.app_secret + param_str + self.app_secret
    return hashlib.md5(sign_str.encode('utf-8')).hexdigest().upper()

def _call_api(self, method, params):
    """调用淘宝API"""
    base_params = {
        'method': method,
        'app_key': self.app_key,
        'session': self.session_key,
        'timestamp': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
        'format': 'json',
        'v': '2.0',
        'sign_method': 'md5',
        'partner_id': 'top-sdk-python-20200801'
    }
    params.update(base_params)
    params['sign'] = self._generate_sign(params)

    for attempt in range(self.max_retries):
        try:
            response = requests.post(self.api_url, data=params)
            result = response.json()

            if 'error_response' in result:
                error = result['error_response']
                self._log_error(f"API Error: {error.get('code')} - {error.get('msg')}")
                if error.get('code') == '27':  # 请求频繁
                    time.sleep(10)
                    continue
                return None
            return result

        except Exception as e:
            self._log_error(f"API Request Failed: {str(e)}")
            if attempt < self.max_retries - 1:
                time.sleep(self.retry_delay * (attempt + 1))
            continue
    return None

def _log_error(self, message):
    """记录错误日志"""
    timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    log_message = f"[{timestamp}] {message}\n"
    with open(self.log_file, 'a', encoding='utf-8') as f:
        f.write(log_message)

def upload_single_item(self, item_data):
    """上传单个商品"""
    params = {
        'num': item_data.get('quantity', 1),
        'price': item_data['price'],
        'type': 'fixed',
        'stuff_status': 'new',
        'title': item_data['title'],
        'desc': item_data.get('description', ''),
        'cid': item_data['category_id'],
        'location.state': item_data.get('province', ''),
        'location.city': item_data.get('city', ''),
        'postage_id': item_data.get('postage_id', '0'),
        'has_invoice': item_data.get('has_invoice', 'false'),
        'has_warranty': item_data.get('has_warranty', 'false'),
        'approve_status': 'onsale',
        'list_time': datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    }

    # 处理图片
    if 'images' in item_data:
        params['image'] = item_data['images'][0]
        if len(item_data['images']) > 1:
            for i, img in enumerate(item_data['images'][1:6], start=1):
                params[f'image_{i}'] = img

    # 处理SKU
    if 'skus' in item_data:
        for i, sku in enumerate(item_data['skus'], start=1):
            params[f'sku_properties_{i}'] = sku['properties']
            params[f'sku_quantities_{i}'] = sku['quantity']
            params[f'sku_prices_{i}'] = sku['price']
            params[f'sku_outer_ids_{i}'] = sku.get('outer_id', '')

    result = self._call_api('taobao.item.add', params)
    if result and 'item_add_response' in result:
        item_id = result['item_add_response']['item']['item_id']
        self._log_error(f"Successfully uploaded item: {item_id}")
        return item_id
    return None

def batch_upload(self, items_data, max_workers=5):
    """批量上传商品"""
    success_count = 0
    failed_count = 0
    results = []

    with ThreadPoolExecutor(max_workers=max_workers) as executor:
        futures = []
        for item in items_data:
            futures.append(executor.submit(self.upload_single_item, item))

        for future in futures:
            try:
                result = future.result()
                if result:
                    success_count += 1
                    results.append(result)
                else:
                    failed_count += 1
            except Exception as e:
                self._log_error(f"Upload failed: {str(e)}")
                failed_count += 1

    summary = {
        'total': len(items_data),
        'success': success_count,
        'failed': failed_count,
        'item_ids': results
    }

    self._log_error(f"Batch upload completed. Success: {success_count}, Failed: {failed_count}")
    return summary

def load_item_data_from_csv(file_path):
"""从CSV文件加载商品数据"""
import csv
items = []

with open(file_path, 'r', encoding='utf-8') as f:
    reader = csv.DictReader(f)
    for row in reader:
        item = {
            'title': row['title'],
            'price': float(row['price']),
            'quantity': int(row.get('quantity', 1)),
            'category_id': row['category_id'],
            'description': row.get('description', ''),
            'images': row['images'].split('|') if 'images' in row else []
        }

        if 'skus' in row:
            skus = []
            for sku_str in row['skus'].split(';'):
                sku_parts = sku_str.split(':')
                if len(sku_parts) >= 3:
                    skus.append({
                        'properties': sku_parts[0],
                        'quantity': int(sku_parts[1]),
                        'price': float(sku_parts[2]),
                        'outer_id': sku_parts[3] if len(sku_parts) > 3 else ''
                    })
            item['skus'] = skus

        items.append(item)

return items

def main():

# 配置淘宝开放平台应用信息
app_key = "your_app_key"
app_secret = "your_app_secret"
session_key = "your_session_key"

# 初始化上传器
uploader = TaobaoBatchUploader(app_key, app_secret, session_key)

# 从CSV加载商品数据
try:
    items_data = load_item_data_from_csv("items_to_upload.csv")
    print(f"Loaded {len(items_data)} items for upload.")

    # 批量上传
    result = uploader.batch_upload(items_data)
    print(f"Upload completed. Success: {result['success']}, Failed: {result['failed']}")
    print(f"Uploaded item IDs: {result['item_ids']}")

except Exception as e:
    print(f"Error: {str(e)}")

if name == "main":
main()

相关文章
|
5月前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南
|
5月前
|
JSON API 数据安全/隐私保护
Python采集淘宝拍立淘按图搜索API接口及JSON数据返回全流程指南
通过以上流程,可实现淘宝拍立淘按图搜索的完整调用链路,并获取结构化的JSON商品数据,支撑电商比价、智能推荐等业务场景。
|
6月前
|
JSON 缓存 开发者
淘宝商品详情接口(item_get)企业级全解析:参数配置、签名机制与 Python 代码实战
本文详解淘宝开放平台taobao.item_get接口对接全流程,涵盖参数配置、MD5签名生成、Python企业级代码实现及高频问题排查,提供可落地的实战方案,助你高效稳定获取商品数据。
|
6月前
|
JSON API 数据安全/隐私保护
Python采集淘宝评论API接口及JSON数据返回全流程指南
Python采集淘宝评论API接口及JSON数据返回全流程指南
|
6月前
|
机器学习/深度学习 编解码 Python
Python图片上采样工具 - RealESRGANer
Real-ESRGAN基于深度学习实现图像超分辨率放大,有效改善传统PIL缩放的模糊问题。支持多种模型版本,推荐使用魔搭社区提供的预训练模型,适用于将小图高质量放大至大图,放大倍率越低效果越佳。
490 3
缓存 监控 数据挖掘
133 0
|
6月前
|
算法 安全 数据安全/隐私保护
Python随机数函数全解析:5个核心工具的实战指南
Python的random模块不仅包含基础的随机数生成函数,还提供了如randint()、choice()、shuffle()和sample()等实用工具,适用于游戏开发、密码学、统计模拟等多个领域。本文深入解析这些函数的用法、底层原理及最佳实践,帮助开发者高效利用随机数,提升代码质量与安全性。
1061 0
|
6月前
|
存储 缓存 测试技术
理解Python装饰器:简化代码的强大工具
理解Python装饰器:简化代码的强大工具
|
5月前
|
Python
Python编程:运算符详解
本文全面详解Python各类运算符,涵盖算术、比较、逻辑、赋值、位、身份、成员运算符及优先级规则,结合实例代码与运行结果,助你深入掌握Python运算符的使用方法与应用场景。
385 3
|
5月前
|
数据处理 Python
Python编程:类型转换与输入输出
本教程介绍Python中输入输出与类型转换的基础知识,涵盖input()和print()的使用,int()、float()等类型转换方法,并通过综合示例演示数据处理、错误处理及格式化输出,助你掌握核心编程技能。
611 3

推荐镜像

更多