zoukankan      html  css  js  c++  java
  • Python+Appium实现自动抢微信红包

    前言

    过年的时候总是少不了红包,不知从何时开始微信红包横空出世,对于网速和手速慢的人只能在一旁观望,做为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 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二维数组切片
    [转载]MIPS常用指令及实例
    使用vim编程步骤
    数组指针和指针数组
    线程基础
    顶层const和底层const
    递归调用
    输出流
    C++代码规范
    I/O流
  • 原文地址:https://www.cnblogs.com/huny/p/14395348.html
Copyright © 2011-2022 走看看