下载地址:https://www.pan38.com/dow/share.php?code=JCnzE 提取密码:4960
这个代码实现了一个完整的微信抢红包自动化工具,包含红包检测、自动点击、日志记录等功能。使用时需要安装uiautomator2库并连接Android设备。
import time
import random
import uiautomator2 as u2
from PIL import Image
import numpy as np
import cv2
import os
import logging
from datetime import datetime
class WeChatRedPacket:
def init(self, device_id=None):
self.logger = self.setup_logger()
self.device = u2.connect(device_id) if device_id else u2.connect()
self.screen_width, self.screen_height = self.device.window_size()
self.red_packet_count = 0
self.success_count = 0
self.fail_count = 0
def setup_logger(self):
logger = logging.getLogger('WeChatRedPacket')
logger.setLevel(logging.INFO)
if not os.path.exists('logs'):
os.makedirs('logs')
fh = logging.FileHandler(f'logs/red_packet_{datetime.now().strftime("%Y%m%d")}.log')
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)
return logger
def check_red_packet(self):
"""检测屏幕上是否有红包"""
screenshot = self.device.screenshot(format='raw')
img = Image.frombytes('RGB', (self.screen_width, self.screen_height), screenshot)
img_np = np.array(img)
# 红包特征颜色范围
lower_red = np.array([200, 50, 50])
upper_red = np.array([255, 100, 100])
mask = cv2.inRange(img_np, lower_red, upper_red)
contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
red_packet_positions = []
for cnt in contours:
x, y, w, h = cv2.boundingRect(cnt)
if 50 < w < 150 and 50 < h < 150: # 红包大致尺寸范围
center_x = x + w // 2
center_y = y + h // 2
red_packet_positions.append((center_x, center_y))
return red_packet_positions
def open_red_packet(self, position):
"""尝试打开红包"""
x, y = position
self.device.click(x, y)
time.sleep(random.uniform(0.5, 1.5))
# 检查是否成功打开红包详情页
if self.is_detail_page():
self.logger.info(f"成功点击红包位置: ({x}, {y})")
self.click_open_button()
return True
return False
def is_detail_page(self):
"""检查是否在红包详情页"""
screenshot = self.device.screenshot(format='raw')
img = Image.frombytes('RGB', (self.screen_width, self.screen_height), screenshot)
img_np = np.array(img)
# 检查开字按钮
lower_button = np.array([250, 200, 50])
upper_button = np.array([255, 220, 100])
mask = cv2.inRange(img_np, lower_button, upper_button)
return np.sum(mask) > 1000
def click_open_button(self):
"""点击开字按钮"""
# 开字按钮通常位于屏幕下方1/3处
button_x = self.screen_width // 2
button_y = self.screen_height * 2 // 3
self.device.click(button_x, button_y)
time.sleep(random.uniform(1, 2))
# 返回聊天界面
self.device.press('back')
time.sleep(0.5)
self.device.press('back')
time.sleep(0.5)
def monitor(self):
"""主监控循环"""
self.logger.info("开始监控微信红包...")
try:
while True:
red_packets = self.check_red_packet()
if red_packets:
self.red_packet_count += len(red_packets)
self.logger.info(f"检测到 {len(red_packets)} 个红包")
for pos in red_packets:
if self.open_red_packet(pos):
self.success_count += 1
else:
self.fail_count += 1
time.sleep(3) # 防止连续点击
else:
time.sleep(1)
# 每5分钟打印一次统计信息
if time.time() % 300 < 1:
self.logger.info(
f"统计: 检测到 {self.red_packet_count} 个红包, "
f"成功 {self.success_count} 个, 失败 {self.fail_count} 个"
)
except KeyboardInterrupt:
self.logger.info("用户中断监控")
except Exception as e:
self.logger.error(f"发生错误: {str(e)}")
finally:
self.logger.info(
f"最终统计: 检测到 {self.red_packet_count} 个红包, "
f"成功 {self.success_count} 个, 失败 {self.fail_count} 个"
)
if name == 'main':
bot = WeChatRedPacket()
bot.monitor()