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函数帮助查询小工具
Mar 13 Python
python的id()函数解密过程
Dec 25 Python
Python中用pycurl监控http响应时间脚本分享
Feb 02 Python
python压缩文件夹内所有文件为zip文件的方法
Jun 20 Python
Python用zip函数同时遍历多个迭代器示例详解
Nov 14 Python
Python+matplotlib绘制不同大小和颜色散点图实例
Jan 19 Python
opencv转换颜色空间更改图片背景
Aug 20 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
Apr 13 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
May 10 Python
python主要用于哪些方向
Jul 05 Python
在Pycharm中安装Pandas库方法(简单易懂)
Feb 20 Python
Python机器学习三大件之一numpy
May 10 Python
写好Python代码的几条重要技巧
windows安装python超详细图文教程
python如何正确使用yield
May 21 #Python
详细总结Python常见的安全问题
May 21 #Python
Pycharm 如何设置HTML文件自动补全代码或标签
Python源码解析之List
Python手拉手教你爬取贝壳房源数据的实战教程
You might like
基于PHP array数组的教程详解
2013/06/05 PHP
解析php addslashes()与addclashes()函数的区别和比较
2013/06/24 PHP
php检查日期函数checkdate用法实例
2015/03/19 PHP
PHP连接MYSQL数据库的3种常用方法
2017/02/27 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
PHP编程实现的TCP服务端和客户端功能示例
2018/04/13 PHP
redis+php实现微博(一)注册与登录功能详解
2019/09/23 PHP
一个js导致的jquery失效问题的解决方法
2013/11/27 Javascript
node.js中使用q.js实现api的promise化
2014/09/17 Javascript
JavaScript中逗号运算符介绍及使用示例
2015/03/13 Javascript
jQuery实现HTML表格单元格的合并功能
2016/04/06 Javascript
jQuery的promise与deferred对象在异步回调中的作用
2016/05/03 Javascript
jQuery中选择器的基础使用教程
2016/05/23 Javascript
js与applet相互调用的方法
2016/06/22 Javascript
vue指令以及dom操作详解
2017/03/04 Javascript
JS自定义滚动条效果简单实现代码
2020/10/27 Javascript
基于iScroll实现下拉刷新和上滑加载效果
2017/07/18 Javascript
使用 Node.js 开发资讯爬虫流程
2018/01/07 Javascript
vue+webpack 打包文件 404 页面空白的解决方法
2018/02/28 Javascript
使用Karma做vue组件单元测试的实现
2020/01/16 Javascript
使用JavaScript和MQTT开发物联网应用示例解析
2020/08/07 Javascript
使用Typescript开发微信小程序的步骤详解
2021/01/12 Javascript
pandas dataframe添加表格框线输出的方法
2019/02/08 Python
django-rest-swagger对API接口注释的方法
2019/08/29 Python
python jenkins 打包构建代码的示例代码
2019/11/29 Python
Python模块/包/库安装的六种方法及区别
2020/02/24 Python
pyCharm 实现关闭代码检查
2020/06/09 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
2020/06/24 Python
css3动画 小球滚动 js控制动画暂停
2019/11/29 HTML / CSS
html5播放视频且动态截图实现步骤与代码(支持safari其他未测试)
2013/01/06 HTML / CSS
英国知名的护肤彩妆与时尚配饰大型综合零售电商:Unineed
2016/11/21 全球购物
Java中的基本数据类型所占存储空间大小固定的吗
2012/02/15 面试题
马云北大演讲完整版:真心话,什么才是阿里的核心竞争力?
2014/04/04 职场文书
公司经理任命书
2014/06/05 职场文书
音乐学专业求职信
2014/07/22 职场文书
医院合作协议书
2014/08/19 职场文书