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使用pil生成缩略图的方法
Mar 26 Python
Python探索之爬取电商售卖信息代码示例
Oct 27 Python
Python格式化日期时间操作示例
Jun 28 Python
Python 实现「食行生鲜」签到领积分功能
Sep 26 Python
python 3.3 下载固定链接文件并保存的方法
Dec 18 Python
pandas数据集的端到端处理
Feb 18 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
Aug 10 Python
Python 内置变量和函数的查看及说明介绍
Dec 25 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
Mar 16 Python
Python Dataframe常见索引方式详解
May 27 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
Mar 03 Python
OpenCV全景图像拼接的实现示例
Jun 05 Python
写好Python代码的几条重要技巧
windows安装python超详细图文教程
python如何正确使用yield
May 21 #Python
详细总结Python常见的安全问题
May 21 #Python
Pycharm 如何设置HTML文件自动补全代码或标签
Python源码解析之List
Python手拉手教你爬取贝壳房源数据的实战教程
You might like
php更新修改excel中的内容实例代码
2014/02/26 PHP
基于PHP实现的多元线性回归模拟曲线算法
2018/01/30 PHP
JavaScript的Function详细
2006/11/14 Javascript
jQuery checkbox全选/取消全选实现代码
2009/11/14 Javascript
JQuery操作表格(隔行着色,高亮显示,筛选数据)
2012/02/23 Javascript
基于JQuery实现的图片自动进行缩放和裁剪处理
2014/01/31 Javascript
jQuery实现图片预加载效果
2015/11/27 Javascript
20分钟轻松创建自己的Bootstrap站点
2016/05/12 Javascript
Angular 开发学习之Angular CLI的安装使用
2017/12/31 Javascript
vue2.0 父组件给子组件传递数据的方法
2018/01/15 Javascript
Vue 框架之动态绑定 css 样式实例分析
2018/11/14 Javascript
nodejs使用async模块同步执行的方法
2019/03/02 NodeJs
node静态服务器实现静态读取文件或文件夹
2019/12/03 Javascript
vue开发中遇到的问题总结
2020/04/07 Javascript
[01:13]DOTA2群星解读国服召集令 一起说出回归的理由
2013/07/17 DOTA
[03:46]DAC趣味视频-中文考试.mp4
2017/04/02 DOTA
合并百度影音的离线数据( with python 2.3)
2015/08/04 Python
python 字典(dict)按键和值排序
2016/06/28 Python
Python和C/C++交互的几种方法总结
2017/05/11 Python
pandas DataFrame 警告(SettingWithCopyWarning)的解决
2019/07/23 Python
Python实现ElGamal加密算法的示例代码
2020/06/19 Python
python 通过 pybind11 使用Eigen加速代码的步骤
2020/12/07 Python
师范生自我鉴定
2014/03/20 职场文书
怎样填写就业意向
2014/04/02 职场文书
领导班子作风建设剖析材料
2014/10/11 职场文书
民主生活会发言材料
2014/10/20 职场文书
2014年初中班主任工作总结
2014/11/08 职场文书
颐和园导游词400字
2015/01/30 职场文书
三行辞职书范文
2015/02/26 职场文书
经理岗位职责范本
2015/04/15 职场文书
2015年会计年终工作总结
2015/05/26 职场文书
男方家长婚礼答谢词
2015/09/29 职场文书
比赛口号霸气押韵
2015/12/24 职场文书
公务员爱岗敬业心得体会
2016/01/25 职场文书
MySQL下使用Inplace和Online方式创建索引的教程
2021/05/26 MySQL
Elasticsearch 基本查询和组合查询
2022/04/19 Python