前言
过年的时候总是少不了红包,不知从何时开始微信红包横空出世,对于网速和手速慢的人只能在一旁观望,做为python的学习者就是要运用编程解决生活和工作上的事情。
于是我用python解决我们的手速问题python实现自动抢微信红包,至于网速慢得那就只能自己花钱提升了。
环境准备
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 Falseelse: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=\'不显示该聊天\']\")))56c.click()# 点击弹出框的删除选项wait.until(EC.element_to_be_clickable((By.ID, \"com.tencent.mm:id/ffp\"))).click()
完整代码如下:
from appium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom appium.webdriver.common.touch_action import TouchActionfrom selenium.webdriver.support import expected_conditions as ECimport timedesired_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 Falseelse: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_b56ce_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(ad8(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(\'隐藏了第一个聊天框\')
此程序可能会清空你得微信聊天对话窗口,对内容消息敏感得请谨慎运行。