拼多多批量下单软件,拼多多无限账号下单软件,python框架仅供学习参考

简介: 完整的拼多多自动化下单框架,包含登录、搜索商品、获取商品列表、下单等功能。

下载地址:https://www.pan38.com/dow/share.php?code=JCnzE 提取密码:1133

完整的拼多多自动化下单框架,包含登录、搜索商品、获取商品列表、下单等功能。代码使用了Selenium进行网页自动化操作,并加入了随机延迟、多账号支持等功能。请注意这仅用于技术学习。

import time
import random
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from fake_useragent import UserAgent
from bs4 import BeautifulSoup
import json
import csv
import os
import logging
from multiprocessing import Pool

配置日志

logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filename='pdd_automation.log'
)
logger = logging.getLogger(name)

class PDDAutomation:
def init(self, headless=True, proxy=None):
self.options = Options()
if headless:
self.options.add_argument('--headless')
if proxy:
self.options.add_argument(f'--proxy-server={proxy}')

    self.options.add_argument('--disable-gpu')
    self.options.add_argument('--no-sandbox')
    self.options.add_argument('--disable-dev-shm-usage')
    self.options.add_argument('--window-size=1920,1080')

    # 随机User-Agent
    ua = UserAgent()
    self.options.add_argument(f'user-agent={ua.random}')

    self.driver = webdriver.Chrome(options=self.options)
    self.wait = WebDriverWait(self.driver, 20)

def login(self, username, password):
    """模拟登录拼多多"""
    try:
        self.driver.get('https://mobile.yangkeduo.com/login.html')

        # 等待登录页面加载
        phone_input = self.wait.until(
            EC.presence_of_element_located((By.XPATH, '//input[@type="tel"]'))
        )

        # 输入用户名和密码
        phone_input.send_keys(username)
        time.sleep(random.uniform(0.5, 1.5))

        # 点击获取验证码
        get_code_btn = self.driver.find_element(By.XPATH, '//button[contains(text(),"获取验证码")]')
        get_code_btn.click()
        time.sleep(random.uniform(2, 3))

        # 这里需要实际处理验证码,示例中跳过
        logger.warning("需要手动处理验证码")
        time.sleep(30)  # 留出时间手动输入验证码

        # 模拟点击登录按钮
        login_btn = self.driver.find_element(By.XPATH, '//button[contains(text(),"登录")]')
        login_btn.click()

        # 等待登录成功
        self.wait.until(
            EC.presence_of_element_located((By.XPATH, '//div[contains(@class,"user-center")]'))
        )

        logger.info(f"登录成功: {username}")
        return True

    except Exception as e:
        logger.error(f"登录失败: {str(e)}")
        return False

def search_product(self, keyword):
    """搜索商品"""
    try:
        search_input = self.wait.until(
            EC.presence_of_element_located((By.XPATH, '//input[@type="search"]'))
        )

        search_input.clear()
        for char in keyword:
            search_input.send_keys(char)
            time.sleep(random.uniform(0.1, 0.3))

        search_input.send_keys(Keys.RETURN)
        time.sleep(random.uniform(2, 3))

        logger.info(f"成功搜索商品: {keyword}")
        return True

    except Exception as e:
        logger.error(f"搜索商品失败: {str(e)}")
        return False

def get_product_list(self, pages=1):
    """获取商品列表"""
    products = []
    try:
        for page in range(pages):
            # 滚动页面加载更多商品
            self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            time.sleep(random.uniform(3, 5))

            # 解析商品列表
            soup = BeautifulSoup(self.driver.page_source, 'html.parser')
            items = soup.find_all('div', class_='goods-item')

            for item in items:
                try:
                    product = {
                        'title': item.find('div', class_='goods-name').get_text(strip=True),
                        'price': item.find('span', class_='price').get_text(strip=True),
                        'sales': item.find('span', class_='sales').get_text(strip=True) if item.find('span', class_='sales') else '0',
                        'link': 'https://mobile.yangkeduo.com' + item.find('a')['href']
                    }
                    products.append(product)
                except Exception as e:
                    logger.warning(f"解析商品失败: {str(e)}")
                    continue

            logger.info(f"已获取第 {page+1} 页商品列表,共 {len(products)} 个商品")

            # 如果有下一页则点击
            next_page = self.driver.find_elements(By.XPATH, '//a[contains(text(),"下一页")]')
            if next_page and page < pages - 1:
                next_page[0].click()
                time.sleep(random.uniform(3, 5))

        return products

    except Exception as e:
        logger.error(f"获取商品列表失败: {str(e)}")
        return products

def place_order(self, product_url, quantity=1):
    """下单商品"""
    try:
        self.driver.get(product_url)
        time.sleep(random.uniform(3, 5))

        # 选择规格
        spec_btn = self.wait.until(
            EC.presence_of_element_located((By.XPATH, '//button[contains(text(),"选择规格")]'))
        )
        spec_btn.click()
        time.sleep(random.uniform(1, 2))

        # 随机选择规格
        specs = self.driver.find_elements(By.XPATH, '//div[contains(@class,"spec-option")]')
        if specs:
            random.choice(specs).click()
            time.sleep(random.uniform(0.5, 1.5))

        # 输入购买数量
        qty_input = self.driver.find_element(By.XPATH, '//input[@type="number"]')
        qty_input.clear()
        qty_input.send_keys(str(quantity))
        time.sleep(random.uniform(0.5, 1.5))

        # 点击确定
        confirm_btn = self.driver.find_element(By.XPATH, '//button[contains(text(),"确定")]')
        confirm_btn.click()
        time.sleep(random.uniform(1, 2))

        # 点击立即购买
        buy_btn = self.wait.until(
            EC.presence_of_element_located((By.XPATH, '//button[contains(text(),"立即购买")]'))
        )
        buy_btn.click()
        time.sleep(random.uniform(2, 3))

        # 提交订单
        submit_btn = self.wait.until(
            EC.presence_of_element_located((By.XPATH, '//button[contains(text(),"提交订单")]'))
        )
        submit_btn.click()
        time.sleep(random.uniform(3, 5))

        logger.info(f"成功下单商品: {product_url}")
        return True

    except Exception as e:
        logger.error(f"下单失败: {str(e)}")
        return False

def batch_order(self, keyword, quantity=1, pages=1, accounts=[]):
    """批量下单"""
    results = []

    # 先搜索商品
    if not self.search_product(keyword):
        return results

    # 获取商品列表
    products = self.get_product_list(pages)
    if not products:
        return results

    # 对每个账号下单
    for account in accounts:
        username, password = account

        # 登录
        if not self.login(username, password):
            continue

        # 对每个商品下单
        for product in random.sample(products, min(3, len(products))):
            result = {
                'account': username,
                'product': product['title'],
                'status': self.place_order(product['link'], quantity)
            }
            results.append(result)

            # 随机间隔
            time.sleep(random.uniform(10, 30))

    return results

def close(self):
    """关闭浏览器"""
    self.driver.quit()
    logger.info("浏览器已关闭")

def load_accounts(filename='accounts.csv'):
"""从CSV加载账号"""
accounts = []
try:
with open(filename, mode='r', encoding='utf-8') as file:
reader = csv.DictReader(file)
for row in reader:
accounts.append((row['username'], row['password']))
except Exception as e:
logger.error(f"加载账号失败: {str(e)}")
return accounts

def save_results(results, filename='results.json'):
"""保存结果到JSON"""
try:
with open(filename, mode='w', encoding='utf-8') as file:
json.dump(results, file, ensure_ascii=False, indent=2)
except Exception as e:
logger.error(f"保存结果失败: {str(e)}")

if name == 'main':

# 示例用法
accounts = load_accounts()
if not accounts:
    accounts = [('13800138000', 'password123')]  # 示例账号

automation = PDDAutomation(headless=False)

try:
    results = automation.batch_order(
        keyword='手机',
        quantity=1,
        pages=2,
        accounts=accounts[:3]  # 测试前3个账号
    )

    save_results(results)
    logger.info(f"批量下单完成,共处理 {len(results)} 个订单")

except Exception as e:
    logger.error(f"主程序出错: {str(e)}")
finally:
    automation.close()
相关文章
|
8天前
|
算法 API 数据安全/隐私保护
拼多多 item_search_best 接口深度分析及 Python 实现
拼多多开放平台 item_search_best 接口是用于精准商品搜索的核心接口,按商品销量、价格、评分及商家资质等多维度排序,适用于爆款挖掘、竞品分析与市场监控。本文详解其接口特性、参数配置、签名生成逻辑、返回结构及 Python 实现方案。
|
23天前
|
机器学习/深度学习 算法 PyTorch
【Pytorch框架搭建神经网络】基于DQN算法、优先级采样的DQN算法、DQN + 人工势场的避障控制研究(Python代码实现)
【Pytorch框架搭建神经网络】基于DQN算法、优先级采样的DQN算法、DQN + 人工势场的避障控制研究(Python代码实现)
|
16天前
|
机器学习/深度学习 算法 PyTorch
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
|
1月前
|
JSON API 数据安全/隐私保护
【干货满满】分享拼多多API接口到手价,用python脚本实现
拼多多开放平台提供商品价格查询API,通过“pdd.ddk.goods.detail”接口可获取商品基础价、优惠券、拼团价等信息。结合client_id、client_secret及签名机制实现身份认证,支持推广位ID获取专属优惠。本文提供完整Python实现,涵盖签名生成、接口调用与价格解析逻辑,适用于比价工具、导购平台等场景。
|
1月前
|
API 数据安全/隐私保护 Python
拼多多批量上架软件, 电商一键上货发布工具,python电商框架分享
多线程批量上传架构,支持并发处理商品数据 完整的拼多多API签名和token管理机制
|
1月前
|
安全 API 数据安全/隐私保护
|
1月前
|
Java API 数据安全/隐私保护
淘宝一键上货发布软件,淘宝批量发布上架工具, 淘宝批量上架脚本【python】
这个Python脚本实现了以下功能: 完整的淘宝API调用封装
|
1月前
|
Java API 数据处理
淘宝批量上架软件脚本,电商一键上货软件, 淘宝一键铺货软件【python】
核心功能:实现淘宝商品批量上传,包含登录认证、商品数据处理、图片处理和API调用 多线程处理
|
1月前
|
机器人 数据安全/隐私保护 Python
淘宝批量发货发布工具, 淘宝批量上传商品软件, 淘宝批量上架软件【python】
使用Selenium实现自动化操作淘宝卖家后台 支持三种核心功能
|
1月前
|
Linux 数据安全/隐私保护 Python
一键修改电脑机器码, 软件机器码一键修改工具, 机器码重置工具【python】
该工具实现了完整的机器码生成、加密、验证功能 使用系统硬件信息生成唯一机器码

推荐镜像

更多