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中用altzone()方法处理时区的教程
May 22 Python
python中常用的九种预处理方法分享
Sep 11 Python
python 中random模块的常用方法总结
Jul 08 Python
python中map的基本用法示例
Sep 10 Python
Python中format()格式输出全解
Apr 12 Python
python基于递归解决背包问题详解
Jul 03 Python
解决Python中pandas读取*.csv文件出现编码问题
Jul 12 Python
Python实现图像去噪方式(中值去噪和均值去噪)
Dec 18 Python
解决Pycharm的项目目录突然消失的问题
Jan 20 Python
python手写均值滤波
Feb 19 Python
基于Python下载网络图片方法汇总代码实例
Jun 24 Python
python实现批量提取指定文件夹下同类型文件
Apr 05 Python
写好Python代码的几条重要技巧
windows安装python超详细图文教程
python如何正确使用yield
May 21 #Python
详细总结Python常见的安全问题
May 21 #Python
Pycharm 如何设置HTML文件自动补全代码或标签
Python源码解析之List
Python手拉手教你爬取贝壳房源数据的实战教程
You might like
修改php.ini实现Mysql导入数据库文件最大限制的修改方法
2007/12/11 PHP
PHP一些常用的正则表达式字符的一些转换
2008/07/29 PHP
PHP高级OOP技术演示
2009/08/27 PHP
PHP常用技术文之文件操作和目录操作总结
2014/09/27 PHP
php中current、next与reset函数用法实例
2014/11/17 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
2015/12/21 PHP
fireworks菜单生成器mm_menu.js在 IE 7.0 显示问题的解决方法
2009/10/20 Javascript
JavaScript中两种链式调用实现代码
2011/01/12 Javascript
jquery插件开发注意事项小结
2013/06/04 Javascript
js+div实现图片滚动效果代码
2014/02/10 Javascript
js上传图片及预览功能实例分析
2015/04/24 Javascript
JQuery查找DOM节点的方法
2015/06/11 Javascript
小议JavaScript中Generator和Iterator的使用
2015/07/29 Javascript
AngularJS实现单一页面内设置跳转路由的方法
2017/06/28 Javascript
详解vue-cli 接口代理配置
2017/12/13 Javascript
vue自定义一个v-model的实现代码
2018/06/21 Javascript
JavaScript字符串转数字的5种方法及遇到的坑
2018/07/16 Javascript
微信小程序实现弹出菜单
2018/07/19 Javascript
js中位运算的运用实例分析
2018/12/11 Javascript
vue在线动态切换主题色方案
2020/03/26 Javascript
浅谈JavaScript节流和防抖函数
2020/08/25 Javascript
[01:25]DOTA2自定义游戏灵园鬼域等你踏足
2015/10/30 DOTA
python输出数组中指定元素的所有索引示例
2019/12/06 Python
Python 测试框架unittest和pytest的优劣
2020/09/26 Python
HTML5制作3D爱心动画教程 献给女友浪漫的礼物
2014/11/05 HTML / CSS
世界领先的在线地板和建筑材料批发商:BuildDirect
2017/02/26 全球购物
数组越界问题
2015/10/21 面试题
Python里面如何实现tuple和list的转换
2012/06/13 面试题
学生自我鉴定范文
2013/10/04 职场文书
军训学生自我鉴定
2014/02/12 职场文书
开学季活动策划方案
2014/02/28 职场文书
售后前台接待岗位职责
2015/04/03 职场文书
党员志愿者服务倡议书
2015/04/29 职场文书
幸福终点站观后感
2015/06/04 职场文书
优秀团员主要事迹范文
2015/11/05 职场文书
详解JVM系列之内存模型
2021/06/10 Javascript