Python+Appium实现自动抢微信红包

1|0前言

过年的时候总是少不了红包,不知从何时开始微信红包横空出世,对于网速和手速慢的人只能在一旁观望,做为python的学习者就是要运用编程解决生活和工作上的事情。
于是我用python解决我们的手速问题python实现自动抢微信红包,至于网速慢得那就只能自己花钱提升了。

2|0环境准备

appium环境
安卓手机
usb数据线
python环境

3|0实现思路

我们收到红包和消息都是自动置顶到第一个,于是我们打开第一个判断是否有红包,没有则隐藏此窗口。如果有则判断红包是否可以领取,如果有则领取红包,否则删除此红包(不然会影响后面的判断)
然后再进行循环运行和判断。

4|0CODE

首先看一下配置信息,因为我使用得是真机小米9安卓10的系统,代码实现如下具体的信息填写请根据自己的真实情况修改:

desired_caps = {
"platformName": "Android", # 系统
"platformVersion": "10.0", # 系统版本号
"deviceName": "b68548ed", # 设备名
"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/ahs")))
TouchAction(driver).long_press(r8).perform()
time.sleep(1)
# 点击长按后显示的删除
wait.until(EC.element_to_be_clickable(
(By.ID, "com.tencent.mm:id/dt5"))).click()
# 点击弹出框的删除选项
wait.until(EC.element_to_be_clickable(
(By.ID, "com.tencent.mm:id/ffp"))).click()

同时有可能第一个是公众号推送的消息,这样会导致无法判断,所以我们判断只要进去的里面没有红包就把它隐藏掉,然后等新的红包发生过来。

# 删除第一个聊天框
def del_red_public(wait, driver):
# 长按第一个聊天框
r8 = wait.until(EC.element_to_be_clickable(
(By.ID, "com.tencent.mm:id/fzg")))
TouchAction(driver).long_press(r8).perform()
time.sleep(1)
# 点击长按后显示的删除
wait.until(EC.element_to_be_clickable((By.XPATH, "//android.widget.TextView[@text='不显示该聊天']"))).click()
# 点击弹出框的删除选项
wait.until(EC.element_to_be_clickable(
(By.ID, "com.tencent.mm:id/ffp"))).click()

完整代码如下:

from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from appium.webdriver.common.touch_action import TouchAction
from selenium.webdriver.support import expected_conditions as EC
import time
desired_caps = {
"platformName": "Android", # 系统
"platformVersion": "10.0", # 系统版本号
"deviceName": "b68548ed", # 设备名
"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/ahs")))
TouchAction(driver).long_press(r8).perform()
time.sleep(1)
# 点击长按后显示的删除
wait.until(EC.element_to_be_clickable(
(By.ID, "com.tencent.mm:id/dt5"))).click()
# 点击弹出框的删除选项
wait.until(EC.element_to_be_clickable(
(By.ID, "com.tencent.mm:id/ffp"))).click()
# 删除第一个聊天框
def del_red_public(wait, driver):
# 长按第一个聊天框
r8 = wait.until(EC.element_to_be_clickable(
(By.ID, "com.tencent.mm:id/fzg")))
TouchAction(driver).long_press(r8).perform()
time.sleep(1)
# 点击长按后显示的删除
wait.until(EC.element_to_be_clickable((By.XPATH, "//android.widget.TextView[@text='不显示该聊天']"))).click()
# 点击弹出框的删除选项
wait.until(EC.element_to_be_clickable(
(By.ID, "com.tencent.mm:id/ffp"))).click()
if __name__ == '__main__':
driver = webdriver.Remote("http://localhost:4723/wd/hub", desired_caps)
# 设置等待
wait = WebDriverWait(driver, 500)
while True:
# 进入第一个聊天窗口
g73 = wait.until(EC.element_to_be_clickable(
(By.ID, "com.tencent.mm:id/fzg")))
g73.click()
print("进入了第一个聊天窗口")
# 判断聊天窗是否是公众号
is_weichat = is_element_exist(driver, "id", "com.tencent.mm:id/u1")
if is_weichat == True:
# while True:
# 有红包则点击
wait.until(EC.element_to_be_clickable(
(By.ID, "com.tencent.mm:id/u1"))).click()
print("点击了红包")
# 判断红包是否被领取
is_open = is_element_exist(driver, "id", "com.tencent.mm:id/f4f")
print("红包是否被领取:", is_open)
if is_open == True:
# 红包未被领取,点击开红包
wait.until(EC.element_to_be_clickable(
(By.ID, "com.tencent.mm:id/f4f"))).click()
print('已经领取红包')
# 返回群聊
driver.keyevent(4)
# 删除领取过的红包记录
del_red_envelope(wait, driver)
print('···删除已经领取的红包,等待新的红包')
driver.keyevent(4)
else:
# 返回群聊
driver.keyevent(4)
# 删除领取过的红包记录
del_red_envelope(wait, driver)
print('···删除无法领取的红包,等待新的红包')
driver.keyevent(4)
else:
print('没有红包则隐藏此聊天框')
# 返回群聊
driver.keyevent(4)
# 删除第一个公众号窗口
del_red_public(wait, driver)
print('隐藏了第一个聊天框')

此程序可能会清空你得微信聊天对话窗口,对内容消息敏感得请谨慎运行。


__EOF__

本文作者Harry
本文链接https://www.cnblogs.com/harry66/p/14395348.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Harry_666  阅读(896)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示