相信这两天你们都忙碌于各种微信群中,专一抢红包。那是否能够利用 Python 实现自动抢红包呢?python
答案是确定的。这篇文章的目的是利用「Airtest」实现全自动抢群红包。android
ps:红包只是图个乐呵,但愿本篇文章仅仅用于学习。spring
首先须要在本机上配置好 Airtest 环境,配置及基本的使用方法查看「原文连接」查看。api
其次,因为我使用的 Android 手机,因此须要提早配置好 Android 开发环境,保证「adb」命令正常运行。bash
打开 AirtestIDE,用数据线连上 PC后,就能够点击右上角的 connect 链接设备。微信
设备链接成功以后,紧接着滑动手机界面到包含「微信图标」的页面,就能够正式进入下面的操做了。函数
利用 AirtestIDE 新建一个项目,设备类型选中 Android,就会在编码区生成一段初始化的代码。学习
# -*- encoding=utf8 -*-
__author__ = "xingag"
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)
复制代码
拷贝上面的代码到 Pycharm 中,并安装「pocoui」库。测试
pip3 install pocoui
复制代码
ps:注意 Mac OS 安装会提示 adb 没有运行权限,只须要授予响应的权限便可。ui
# chmod +x /Users/xingag/anaconda3/lib/python3.7/site-packages/airtest/core/android/static/adb/mac/adb
chmod +x [本机adb路径]
复制代码
这里我新建了一个名称为「抢红包」微信群,便于后面的测试。
首先咱们须要打开微信 App。
相比 Appium 须要经过包名和启动 Activity 的形式,Airtest 经过一行代码就能够实现打开应用。
# 指定当前界面text内容为【微信】的控件,执行点击操做
poco(text='微信').click()
复制代码
第一个 Tab 就是微信消息列表,这里显示了全部的群聊、单聊及一些消息。
经过「元素 name」找到全部的消息列表元素,而后就能够全部消息的内容。
# 消息列表
item_elements = poco(name='com.tencent.mm:id/b4m').offspring('com.tencent.mm:id/b4o')
# 获取全部消息列表的名称
names = list(map(lambda x: x.get_text(), item_elements))
复制代码
找到目标群元素,就能够执行点击操做,进入群聊。
# 群名称
target = '抢红包'
index = names.index(target)
# 点击进入群聊
item_elements[index].click()
复制代码
而后获取到当前群聊的全部消息元素。
# 1.获取消息列表元素
msg_list_elements_pre = poco("android.widget.ListView").children()
复制代码
抢红包须要从最近的一个红包开始抢,全部须要反转群聊消息。
msg_list_elements = []
for item in msg_list_elements_pre:
msg_list_elements.insert(0, item)
复制代码
接下来就能够遍历消息列表,获取到有「微信红包」微信红包标识而且尚未抢的红包「包含本身发的」消息元素。
for msg_element in msg_list_elements:
# 2.1 微信红包标识元素
red_key_element = msg_element.offspring('com.tencent.mm:id/apf')
# 2.2 是否已经领取元素
has_click_element = msg_element.offspring('com.tencent.mm:id/ape')
# 2.3 红包【包含:收到的红包和本身发出去的红包】
if red_key_element:
print('发现一个红包')
if has_click_element.exists() and (
has_click_element.get_text() == '已领取' or has_click_element.get_text() == '已被领完'):
print('已经领取过了,略过~')
continue
else:
print('立刻抢红包')
else:
print('红包元素不存在')
continue
复制代码
抢红包的操做就很简单了。点击还未抢过的红包,到抢红包对话框界面,点击「抢」按钮,就能够模拟抢一个红包的操做了。
抢完红包以后,须要模拟点击手机上的返回按键到消息列表页面,接着执行下一个抢红包的操做。
msg_element.click()
click_element = poco("com.tencent.mm:id/cv0")
if click_element.exists():
click_element.click()
# 返回
keyevent('BACK')
复制代码
最后,把上面抢红包的操做定义为一个方法,循环来获取消息列表,获取到新的红包后,立刻执行「抢红包」的操做。
while True:
get_red_package()
print('休眠1秒钟,继续刷新页面,开始抢红包。')
sleep(1)复制代码
执行程序,手机会自动打开微信,找到对应的群聊,进入消息列表页面,「定时」检查列表中的信息,若是发现有红包,就开始抢红包。
固然,消息列表页能够经过 swipe 函数向上滑动,获取更多的红包,原理相似。
本文首发于公众号「 AirPython 」,后台回复「 抢红包 」便可获取完整代码。