快过年了用Python抢红包
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
1. 概述
快过年了刚刚收到了两个消息一个好消息一个坏消息。
先说好消息好消息就是微信群里有人要发红包开心~
不过转念一想前几次的红包一个都没抢到这次不由自主的叹了一口气 ...
过了一会内心的情绪逐渐平复了。
心想“难道就这么放弃了吗晚饭还吃泡面泡面感觉有被冒犯到但是手动抢肯定没戏毕竟手can谁也没办法那就只能试试能不能通过编程的方式实现自动化抢红包了”
现在捋一下思路微信群发红包的基本情况是每一次发红包都会与上一次有一些时间间隔实现自动化抢红包的基本思路如下
手动清空之前微信群中的红包记录
执行自动化抢红包程序进入发红包的微信群可以暂时将其顶置循环检测群中是否有红包发现红包则点击红包
检测红包是否被领取判断点击后的红包是否出现开字如果红包未被领取则点击开字领取红包再返回群聊界面删除已被领取的红包记录如果红包已被领取则返回群聊界面删除已被领取的红包记录之后以此类推
2. 环境
本文主要环境如下
Win7
小米5s
Python3.7
Appium1.5
微信7.0.20
如果对环境搭建不熟悉的话可以看一下Python+Appium自动化操作微信入门 和 我用Python找出了删除自己微信的所有人并将他们自动化删除了。
3. 实现
接下来我们开始手动敲代码下面一起来看一下具体实现。
首先看一下配置信息代码实现如下
desired_caps = {
"platformName": "Android", # 系统
"platformVersion": "8.0.0", # 系统版本号
"deviceName": "m5s", # 设备名
"appPackage": "com.tencent.mm", # 包名
"appActivity": ".ui.LauncherUI", # app 启动时主 Activity
'unicodeKeyboard': True, # 使用自带输入法
'noReset': True # 保留 session 信息可以避免重新登录
}
因为点击红包后需要判断点击后的红包是否被领取即是否有开字如图所示
所以我们定义一个判断元素是否存在的方法代码实现如下
# 判断元素是否存在
def is_element_exist(driver, by, value):
try:
driver.find_element(by=by, value=value)
except Exception as e:
return False
else:
return True
因为红包无论是被自己领取还是被他人领取之后都要删除领取后的红包记录所以我们再来定义一个删除已领取红包的方法代码实现如下
# 删除领取后的红包记录
def del_red_envelope(wait, driver):
# 长按领取过的红包
r8 = wait.until(EC.element_to_be_clickable((By.ID, "com.tencent.mm:id/r8")))
TouchAction(driver).long_press(r8).perform()
# 点击长按后显示的删除
wait.until(EC.element_to_be_clickable((By.ID, "com.tencent.mm:id/gam"))).click()
# 点击弹出框的删除选项
wait.until(EC.element_to_be_clickable((By.ID, "com.tencent.mm:id/doz"))).click()
长按领取后红包的效果图如下
点击长按后显示的删除项之后的效果图如下
我们接着来看一下进入红包群后的主程序实现代码如下
while True:
# 有红包则点击
wait.until(EC.element_to_be_clickable((By.ID, "com.tencent.mm:id/r8"))).click()
print("点击了红包")
# 判断红包是否被领取
is_open = is_element_exist(driver, "id", "com.tencent.mm:id/den");
print("红包是否被领取", is_open)
if is_open == True:
# 红包未被领取打开红包
wait.until(EC.element_to_be_clickable((By.ID, "com.tencent.mm:id/den"))).click()
# 返回群聊
wait.until(EC.element_to_be_clickable((By.ID, "com.tencent.mm:id/dm"))).click()
# 删除领取过的红包记录
del_red_envelope(wait, driver)
else:
# 返回群聊
driver.keyevent(4)
# 删除领取过的红包记录
del_red_envelope(wait, driver)
最后我们通过视频来看一下整体效果
源码在👇公众号 Python小二 后台回复 201123 获取。