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实现将不规范的英文名字首字母大写
Nov 15 Python
python制作小说爬虫实录
Aug 14 Python
tensorflow学习教程之文本分类详析
Aug 07 Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
Feb 22 Python
Python实现密码薄文件读写操作
Dec 16 Python
pytorch如何冻结某层参数的实现
Jan 10 Python
Python warning警告出现的原因及忽略方法
Jan 31 Python
Python flask框架端口失效解决方案
Jun 04 Python
python 实现图像快速替换某种颜色
Jun 04 Python
Python 捕获代码中所有异常的方法
Aug 03 Python
django中cookiecutter的使用教程
Dec 03 Python
Python开发五子棋小游戏
Apr 28 Python
写好Python代码的几条重要技巧
windows安装python超详细图文教程
python如何正确使用yield
May 21 #Python
详细总结Python常见的安全问题
May 21 #Python
Pycharm 如何设置HTML文件自动补全代码或标签
Python源码解析之List
Python手拉手教你爬取贝壳房源数据的实战教程
You might like
PHP 和 MySQL 基础教程(一)
2006/10/09 PHP
[原创]PHP中通过ADODB库实现调用Access数据库之修正版本
2006/12/31 PHP
CI框架自动加载session出现报错的解决办法
2014/06/17 PHP
PHP生成等比缩略图类和自定义函数分享
2014/06/25 PHP
使用php-timeit估计php函数的执行时间
2015/09/06 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
PHP封装请求类实例分析【基于Yii框架】
2019/10/17 PHP
PHP连接MySQL数据库操作代码实例解析
2020/07/11 PHP
Javascript操作select方法大全[新增、修改、删除、选中、清空、判断存在等]
2008/09/26 Javascript
javascript返回顶部效果(自写代码)
2013/01/06 Javascript
js实现二代身份证号码验证详解
2014/11/20 Javascript
谈谈Jquery中的children find 的区别有哪些
2015/10/19 Javascript
jQuery+css实现的换页标签栏效果
2016/01/27 Javascript
JavaScript实现相册弹窗功能(zepto.js)
2016/06/21 Javascript
JS排序之快速排序详解
2017/04/08 Javascript
vue中使用vee-validator完成表单校验方案
2019/11/01 Javascript
element el-table表格的二次封装实现(附表格高度自适应)
2021/01/19 Javascript
[04:46]2018年度玩家喜爱的电竞媒体-完美盛典
2018/12/16 DOTA
Python基于dom操作xml数据的方法示例
2018/05/12 Python
Python使用progressbar模块实现的显示进度条功能
2018/05/31 Python
在Python中给Nan值更改为0的方法
2018/10/30 Python
CSS3条纹背景制作的实战攻略
2016/05/31 HTML / CSS
Canvas与Image互相转换示例代码
2013/08/09 HTML / CSS
挪威手表购物网站:Klokker
2016/09/19 全球购物
澳大利亚头发和美容产品购物网站:OZ Hair & Beauty
2020/03/27 全球购物
如果有两个类A,B,怎么样才能使A在发生一个事件的时候通知B
2016/03/12 面试题
新学期校长寄语
2014/01/18 职场文书
2014年元旦联欢会活动策划方案
2014/02/16 职场文书
年终总结会主持词
2014/03/25 职场文书
大学生就业策划书范文
2014/04/04 职场文书
房产继承公证书
2014/04/09 职场文书
推荐信格式要求
2014/05/09 职场文书
人大代表选举标语
2014/10/07 职场文书
推荐信范文大全
2015/03/27 职场文书
解决SpringBoot文件上传临时目录找不到的问题
2021/07/01 Java/Android
聊聊基于pytorch实现Resnet对本地数据集的训练问题
2022/03/25 Python