前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python实现自动抢红包功能

Python实现自动抢红包功能

作者头像
axiomxs
发布2021-11-26 13:00:01
2K0
发布2021-11-26 13:00:01
举报
文章被收录于专栏:曦 月曦 月

目 标 场 景

可能有人每天都忙碌于各类微信群中,专注抢红包。那是否可以利用 Python 实现自动抢红包呢?

答案是肯定的。这篇文章的目的是利用「Airtest」实现全自动抢群红包。

ps:红包只是图个乐呵,希望本篇文章仅仅用于学习。

准 备 工 作

首先需要在本机上配置好 Airtest 环境,配置及基本的使用方法查看下面链接。

https://juejin.im/post/5c42fd6251882525153c325a

其次,由于我使用的 Android 手机,所以需要提前配置好 Android 开发环境,保证「adb」命令正常运行。

打开 AirtestIDE,用数据线连上 PC后,就可以点击右上角的 connect 连接设备。

设备连接成功之后,紧接着滑动手机界面到包含「微信图标」的页面,就可以正式进入下面的操作了。

利用 AirtestIDE 新建一个项目,设备类型选中 Android,就会在编码区生成一段初始化的代码。

代码语言:javascript
复制
# -*- encoding=utf8 -*-__author__ = "xingag"from airtest.core.api import *auto_setup(__file__)from poco.drivers.android.uiautomation import AndroidUiautomationPocopoco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)
__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」库。

代码语言:javascript
复制
pip3 install pocoui

ps:注意 Mac OS 安装会提示 adb 没有运行权限,只需要授予响应的权限即可。

代码语言:javascript
复制
# chmod +x /Users/xingag/anaconda3/lib/python3.7/site-packages/airtest/core/android/static/adb/mac/adbchmod +x [本机adb路径] [本机adb路径]

这里我新建了一个名称为「抢红包」微信群,便于后面的测试。

分 析 思 路

首先我们需要打开微信 App。

相比 Appium 需要通过包名和启动 Activity 的形式,Airtest 通过一行代码就可以实现打开应用。

代码语言:javascript
复制
指定当前界面text内容为【微信】的控件,执行点击操作poco(text='微信').click()text='微信').click()

第一个 Tab 就是微信消息列表,这里显示了所有的群聊、单聊及一些消息。

代码语言:javascript
复制
通过「元素 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))
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))

找到目标群元素,就可以执行点击操作,进入群聊。

代码语言:javascript
复制
# 群名称target = '抢红包'index = names.index(target)# 点击进入群聊item_elements[index].click()
target = '抢红包'

index = names.index(target)
# 点击进入群聊
item_elements[index].click()

然后获取到当前群聊的所有消息元素。

代码语言:javascript
复制
# 1.获取消息列表元素msg_list_elements_pre = poco("android.widget.ListView").children()
msg_list_elements_pre = poco("android.widget.ListView").children()

抢红包需要从最近的一个红包开始抢,所有需要反转群聊消息。

代码语言:javascript
复制
msg_list_elements = []for item in msg_list_elements_pre: msg_list_elements.insert(0, item) for item in msg_list_elements_pre: msg_list_elements.insert(0, item)

接下来就可以遍历消息列表,获取到有「微信红包」微信红包标识并且还没有抢的红包「包含自己发的」消息元素。

代码语言:javascript
复制
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('红包元素不存在')            continuein 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

抢红包的操作就很简单了。点击还未抢过的红包,到抢红包对话框界面,点击「」按钮,就可以模拟抢一个红包的操作了。

抢完红包之后,需要模拟点击手机上的返回按键到消息列表页面,接着执行下一个抢红包的操作。

代码语言:javascript
复制
msg_element.click()click_element = poco("com.tencent.mm:id/cv0")if click_element.exists():       click_element.click()              # 返回       keyevent('BACK')
click_element = poco("com.tencent.mm:id/cv0")
if click_element.exists():
       click_element.click()
       
       # 返回
       keyevent('BACK')

最后,把上面抢红包的操作定义为一个方法,循环来获取消息列表,获取到新的红包后,马上执行「抢红包」的操作。

代码语言:javascript
复制
while True:     get_red_package()     print('休眠1秒钟,继续刷新页面,开始抢红包。')     sleep(1)
     get_red_package()
     print('休眠1秒钟,继续刷新页面,开始抢红包。')
     sleep(1)

结 果 总 结

执行程序,手机会自动打开微信,找到对应的群聊,进入消息列表页面,「定时」检查列表中的信息,如果发现有红包,就开始抢红包。

当然,消息列表页可以通过 swipe 函数向上滑动,获取更多的红包,原理类似。

原创文章,作者:宏 错误,如若转载,请注明出处:https://cloud.tencent.com/developer/article/1906716

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目 标 场 景
  • 准 备 工 作
  • 分 析 思 路
  • 结 果 总 结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档