按键精灵实现一键抢单,外卖网约车抢单脚本插件,python即可实现

109 阅读2分钟

下载地址:www.pan38.com/dow/share.p… 提取密码:7497

这个项目包含四个主要模块:主抢单程序、配置文件、工具函数和网页自动化模块。主程序使用图像识别技术检测订单按钮,工具模块提供加密和日志功能,网页自动化模块使用Selenium实现浏览器控制。

import pyautogui import time import random import requests from PIL import ImageGrab import cv2 import numpy as np import pytesseract from bs4 import BeautifulSoup

class OrderGrabber: def init(self): self.screen_width, self.screen_height = pyautogui.size() self.order_region = (self.screen_width//4, self.screen_height//4, self.screen_width3//4, self.screen_height3//4) self.refresh_interval = 1.5 self.click_delay = 0.2 self.last_order_time = 0

def capture_screen(self):
    screenshot = ImageGrab.grab(bbox=self.order_region)
    return cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR)

def find_order_button(self, img):
    template = cv2.imread('order_button_template.png')
    result = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
    
    if max_val > 0.8:
        return max_loc
    return None

def parse_order_info(self, img):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    text = pytesseract.image_to_string(gray)
    return text

def click_position(self, pos):
    x, y = pos
    pyautogui.moveTo(x, y, duration=random.uniform(0.1, 0.3))
    pyautogui.click()
    time.sleep(self.click_delay)
    
def refresh_page(self):
    pyautogui.hotkey('f5')
    time.sleep(1)
    
def run(self):
    while True:
        try:
            current_time = time.time()
            if current_time - self.last_order_time > 10:
                self.refresh_page()
                
            screen_img = self.capture_screen()
            button_pos = self.find_order_button(screen_img)
            
            if button_pos:
                order_info = self.parse_order_info(screen_img)
                if self.filter_order(order_info):
                    self.click_position(button_pos)
                    self.last_order_time = time.time()
                    print(f"成功抢单: {order_info}")
                    
            time.sleep(self.refresh_interval)
            
        except Exception as e:
            print(f"发生错误: {e}")
            time.sleep(5)
            
def filter_order(self, order_info):
    # 这里可以添加订单过滤逻辑
    return True

if name == "main": grabber = OrderGrabber() grabber.run()

抢单平台配置

PLATFORM_CONFIG = { 'driver': { 'login_url': 'driver.example.com/login', 'order_url': 'driver.example.com/orders', 'refresh_interval': 2, 'username': 'your_username', 'password': 'your_password' }, 'food': { 'login_url': 'food.example.com/login', 'order_url': 'food.example.com/orders', 'refresh_interval': 1.5, 'username': 'your_username', 'password': 'your_password' } }

图像识别配置

IMAGE_CONFIG = { 'template_path': './templates/', 'threshold': 0.8, 'tesseract_path': 'C:/Program Files/Tesseract-OCR/tesseract.exe' }

抢单策略配置

STRATEGY_CONFIG = { 'min_distance': 3, # 最小接单距离(公里) 'max_distance': 15, # 最大接单距离 'min_price': 20, # 最小订单金额 'preferred_areas': ['朝阳区', '海淀区'] # 优先接单区域 }

json import hashlib import base64 from Crypto.Cipher import AES

class ConfigLoader: @staticmethod def load_config(file_path): with open(file_path, 'r', encoding='utf-8') as f: return json.load(f)

@staticmethod
def save_config(file_path, config):
    with open(file_path, 'w', encoding='utf-8') as f:
        json.dump(config, f, indent=4)

class Encryptor: def init(self, key): self.key = hashlib.sha256(key.encode()).digest() self.iv = b'1234567890123456'

def encrypt(self, data):
    cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
    padded_data = self._pad(data.encode())
    encrypted = cipher.encrypt(padded_data)
    return base64.b64encode(encrypted).decode()
    
def decrypt(self, encrypted_data):
    cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
    decrypted = cipher.decrypt(base64.b64decode(encrypted_data))
    return self._unpad(decrypted).decode()
    
def _pad(self, s):
    return s + (AES.block_size - len(s) % AES.block_size) * \
           chr(AES.block_size - len(s) % AES.block_size).encode()
           
def _unpad(self, s):
    return s[:-ord(s[len(s)-1:])]

class Logger: def init(self, log_file='order_grabber.log'): self.log_file = log_file

def log(self, message, level='INFO'):
    timestamp = time.strftime('%Y-%m-%d %H:%M:%S')
    log_entry = f"[{timestamp}] [{level}] {message}\n"
    with open(self.log_file, 'a', encoding='utf-8') as f:
        f.write(log_entry)