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


Posted in Python onMay 21, 2021

环境准备

  • 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基础教程之常用运算符
Aug 29 Python
Python中常用操作字符串的函数与方法总结
Feb 04 Python
利用Python批量生成任意尺寸的图片
Aug 29 Python
python 寻找优化使成本函数最小的最优解的方法
Dec 28 Python
django用户登录和注销的实现方法
Jul 16 Python
8种用Python实现线性回归的方法对比详解
Jul 10 Python
对Django url的几种使用方式详解
Aug 06 Python
Python3和pyqt5实现控件数据动态显示方式
Dec 13 Python
pytorch实现mnist分类的示例讲解
Jan 10 Python
Django-xadmin+rule对象级权限的实现方式
Mar 30 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
Feb 07 Python
Python爬取科目四考试题库的方法实现
Mar 30 Python
写好Python代码的几条重要技巧
windows安装python超详细图文教程
python如何正确使用yield
May 21 #Python
详细总结Python常见的安全问题
May 21 #Python
Pycharm 如何设置HTML文件自动补全代码或标签
Python源码解析之List
Python手拉手教你爬取贝壳房源数据的实战教程
You might like
php5编程中的异常处理详细方法介绍
2008/07/29 PHP
smarty的保留变量问题
2008/10/23 PHP
php后台多用户权限组思路与实现程序代码分享
2012/02/13 PHP
二招解决php乱码问题
2012/03/25 PHP
详解WordPress中简码格式标签编写的基本方法
2015/12/22 PHP
PHP自定义多进制的方法
2016/11/03 PHP
Yii2框架实现登陆添加验证码功能示例
2018/07/12 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
PHP7 list() 函数修改
2021/03/09 PHP
新页面打开实际尺寸的图片
2006/08/25 Javascript
学习ExtJS(二) Button常用方法
2009/10/07 Javascript
Javascript结合css实现网页换肤功能
2009/11/02 Javascript
简洁Ajax函数处理(示例代码)
2013/11/15 Javascript
深入分析JSONP跨域的原理
2014/12/10 Javascript
JavaScript操作HTML元素和样式的方法详解
2015/10/21 Javascript
浅谈Nodejs应用主文件index.js
2016/08/28 NodeJs
jQuery Autocomplete简介_动力节点Java学院整理
2017/07/17 jQuery
bootstrap table表格客户端分页实例
2017/08/07 Javascript
Node.js中使用mongoose操作mongodb数据库的方法
2017/09/12 Javascript
react-redux中connect的装饰器用法@connect详解
2018/01/13 Javascript
详解Angular系列之变化检测(Change Detection)
2018/02/26 Javascript
js实现一个页面多个倒计时的3种方法
2019/02/25 Javascript
微信小程序实现写入读取缓存详解
2019/08/30 Javascript
[01:02]2014 DOTA2国际邀请赛中国区预选赛 现场抢先看
2014/05/22 DOTA
python的类变量和成员变量用法实例教程
2014/08/25 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
2018/07/19 Python
win10下安装Anaconda的教程(python环境+jupyter_notebook)
2019/10/23 Python
Python生成词云的实现代码
2020/01/14 Python
纯CSS3实现鼠标悬停提示气泡效果
2014/02/28 HTML / CSS
全球高级音频和视频专家:HiDef Lifestyle
2019/08/02 全球购物
德国玩具商店:Planet Happy DE
2021/01/16 全球购物
2014年机关党委工作总结
2014/12/11 职场文书
2014年生活老师工作总结
2014/12/23 职场文书
工作违纪检讨书范文
2015/01/26 职场文书
Nginx+Tomcat负载均衡集群的实现示例
2021/10/24 Servers
uniapp 微信小程序 自定义tabBar 导航
2022/04/22 Javascript