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

这个代码实现了一个完整的微信抢红包自动化工具,包含红包检测、自动点击、日志记录等功能。使用时需要安装uiautomator2库并连接Android设备。

import timeimport randomimport uiautomator2 as u2from PIL import Imageimport numpy as npimport cv2import osimport loggingfrom 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()