0 引言
提到抢红包,就不得不提Xposed框架,它简直是个抢红包的神器,但使用Xposed框架有一个前提条件:手机需要root,对于苹果手机的话就需要越狱了。现在的手机想要root或越狱并不容易,同时这会对手机安全性带来一些风险,抢红包本身只是个娱乐活动,这样做就得不偿失了。
为了自动抢红包,python能帮我们实现吗?
答案是肯定的,本文就带大家一起探索下用Python如何实现自动抢红包。
1 环境
操作系统:Windows
Python版本:3.7.2
手机系统:Android
2 需求分析
这里我们的需求是实现自动抢红包。首先要开启微信,进入到指定的群聊,识别微信红包、执行抢红包的动作。这就是关键的步骤,简单清晰。
因为电脑版本的微信没有抢红包的功能,我们只能手机微信,那么就需要把手机连上电脑,通过电脑控制手机来自动抢,那就需要确保“adb”命令可正常执行。
识别微信中的讯息,是红包还是普通的资讯,这里我们通过聊天讯息的元素标识来判断。这里我们借助了“Airtest IDE”工具来实现。
3 前置准备
3.1 开启手机的USB除错
要正常使用“adb”需要开启USB除错,设定项通常出现在手机系统设定中的[开发人员选项]里面。

在手机上开启USB除错后,接下来我们通过Airttest IDE验证 adb 执行是否正常。
3.2 下载安装Airtest IDE
开始之前先,先解释下airttest相关概念:
Airtest 是一个跨平台的、基于影象识别的UI自动化测试框架,适用于游戏和App,支援平台有Windows、Android和iOS。
Poco是一款基于UI控制元件识别的自动化测试框架,目前支援Unity3D/cocos2dx-*/Android原生app/iOS原生app/微信小程式,也可以在其他引擎中自行接入poco-sdk来使用。
AirtestIDE 是一个我们配套推出的跨平台的UI自动化测试编辑器,内建了Airtest和Poco的相关外挂功能,能够使用它快速简单地编写指令码。
下载之后,解压开启就可以使用,Airtest IDE的界面如下:

使用AirtestIDE对Android应用进行自动化操作,第一步就需要连线Android装置。
请使用USB线连线手机,手机上出现的 允许USB除错 弹窗,点选 确定。
点选连接面板中的 refresh ADB 按钮,装置列表将会重新整理。
点选列表内对应装置的 Connect 完成连线。
若装置未刷出,点选 refresh ADB 按钮。

若连线遇到问题,请参考Airtest的官方教程:Android真机连线
4 抢红包流程回顾
开启微信,在最左侧的Tab页,微信讯息列表,我们需要从这里选择指定的群聊来抢红包。
在AirtestIDE中,我们可以通过暂停功能,冻结当前的UI树形结构来精确地检视UI控制元件,我们先来分析下这个页面中元素标识。

▲聊天页面中整体的群聊讯息的元素标识 com.tencent.mm:id/d1v

▲聊天页面中单个群聊讯息的元素标识 com.tencent.mm:id/b6e
接下来进入我们准备要抢红包的群聊中,识别出红包并执行抢红包的动作。
我们先来看看红包的标识:

▲红包标识的示例1 com.tencent.mm:id/aql

▲红包标识的示例2 com.tencent.mm:id/aql
点选红包,记录下弹出的大红包页面中“开”的元素标识
▲大红包页面中”开“的标识 com.tencent.mm:id/d02
这里我们需要判断是红包是否有效,比如已被领完或是已被自己领取的红包就是无效的,我们在执行时可以跳过这些。

▲已领取红包的标识 com.tencent.mm:id/apk

▲已被领完红包的标识 com.tencent.mm:id/apk
我们用的各元素的标识都已取到,接下来就是组织我们的程式码。
5 程式码梳理
首先得开启微信,利用Airtest启动app应用,只须一行程式码即可搞定,如下
# 开启手机微信
poco(text=\'微信\').click
获取当前页面中所有所有群聊的名称
# 群聊讯息的元素标识
Chat_msg = poco(name=\'com.tencent.mm:id/d1v\').offspring(\'com.tencent.mm:id/b6e\')
# 获取当前页面中所有群聊的名称
Chat_names =
Chat_names = list(map(lambda x: x.get_text, Chat_msg))
选择并进入指定的群聊
# 指定抢红包的群聊名称
chat = input(\'请指定群聊名称:\')
if chat in Chat_names:
index = Chat_names.index(chat)
# 点选进入指定的群聊
Chat_msg[index].click
在微信聊天页面中,获取当前页面中的所有讯息元素。
msg_list = poco("android.widget.ListView").children
遍历讯息并查询红包
for msg in msg_list:
# 微信红包的标识
LuckyMoney = msg.offspring(\'com.tencent.mm:id/aql\')
# 已失效红包(比如已领取、已被领完)的标识
Invalid = msg.offspring(\'com.tencent.mm:id/aqk\')
# 判断红包是否有效并抢起来!
if LuckyMoney:
pass
在LuckyMoney中定义抢红包的动作
if Invalid.exists and (Invalid.get_text==\'已领取\' or Invalid.get_text==\'已被领完\'):
print(f\'红包已无效,跳过……\')
continue
else:
print(f\'发现一个新红包,抢起来!\')
poco("com.tencent.mm:id/d1v")
msg.click
click_open = poco("com.tencent.mm:id/d02")
if click_open.exists:
click_open.click
keyevent(\'BACK\')
6 后记
若我们在一台电脑上并不想安装Airtest IDE,还能执行这个指令码吗?
当然可以,只需要安装好“pocoui”这个第三方库就可以“抛弃”它了!
pip install pocoui
利用 AirtestIDE 建立一个专案时,装置型别选中 Android,就会在编码区生成一段初始化的程式码。
from airtest.core.api import *
auto_setup(__file__)
from poco.drivers.android.uiautomation import AndroidUiautomationPoco
poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)
我们自己编写的Python程式码中也需要加上这段初始化的程式码。
再次强调,在执行指令码时要确保手机连上电脑,并确保“adb”命令正常执行。
对Airtest有兴趣的小伙伴,可以参考airtest官方教程:AirtestIDE官方文件





























