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

2021-07-09 0 712

环境准备

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

实现思路

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

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

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 信息,可以避免重新登录
}

因为点击红包后需要判断点击后的红包是否被领取,即是否有开字,如图所示:

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

所以我们定义一个判断元素是否存在的方法,代码实现如下:

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()

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

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

# 删除第一个聊天框
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 抢微信红包的资料请关注自学编程网其它相关文章!

遇见资源网 Python Python+Appium实现自动抢微信红包 http://www.ox520.com/28886.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务