新闻动态

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

发布日期:2022-04-26 14:42 | 文章来源:gibhub

环境准备

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

实现思路

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

code

首先看一下配置信息,因为我使用得是真机小米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('隐藏了第一个聊天框')

以上就是Python+Appium实现自动抢微信红包的详细内容,更多关于Python 抢微信红包的资料请关注本站其它相关文章!

香港服务器租用

版权声明:本站文章来源标注为YINGSOO的内容版权均为本站所有,欢迎引用、转载,请保持原文完整并注明来源及原文链接。禁止复制或仿造本网站,禁止在非www.yingsoo.com所属的服务器上建立镜像,否则将依法追究法律责任。本站部分内容来源于网友推荐、互联网收集整理而来,仅供学习参考,不代表本站立场,如有内容涉嫌侵权,请联系alex-e#qq.com处理。

相关文章

实时开通

自选配置、实时开通

免备案

全球线路精选!

全天候客户服务

7x24全年不间断在线

专属顾问服务

1对1客户咨询顾问

在线
客服

在线客服:7*24小时在线

客服
热线

400-630-3752
7*24小时客服服务热线

关注
微信

关注官方微信
顶部