下载地址: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)