【Android】基于Airtest实现大麦网app自动抢票程序

news2024/10/2 6:33:02

0x01 缘起

疫情结束的2023年5月,大家对出去玩都有点疯狂,歌手们也扎堆开演唱会。但演唱会多,票一点也不好抢,抢五月天的门票难度不亚于买五一的高铁票。所以想尝试找一些脚本来辅助抢票,之前经常用selenium和request做一些小爬虫来搞定自动化的工作,所以在 MakiNaruto/Automatic_ticket_purchase 的基础上改了改,实现抢票功能。但是大麦网实在太狡猾了,改完爬虫才发现几乎所有的热门演唱会只允许在app购买,所以就需要利用APP实现接口自动化。

0x02 Airtest自动化测试

首先想到的是利用对UI的操作实现此功能,目前比较流行的框架是网易的poco和appium,对比了一下发现poco比较简单好上手,而且也基于python语法,因此笔者选择了此框架。

运行环境搭建

  • Airtest IDE: poco运行基于网易的Airtest IDE,官网下载解包安装即可
  • adb调试: 打开安卓手机的设置中开发者选项的usb调试功能。对于小米和华为手机,还应当允许通过USB安装应用。

配置好后,点击connect即可连接到手机
连接设备

操作录制

我认为Airtest IDE最方便的地方莫过于自动分析apk窗口的控件,并录制操作,生成代码。如下图,点击poco辅助窗的右上角按钮,即可开始录制。

image

此时点击设备窗的中对应的控件,即可在左侧的代码窗中自动生成代码。

image

生成的代码示例

# 点击操作
poco("cn.damai:id/project_poster_mask_iv").click()
poco("cn.damai:id/rich_text_tv").click()
poco("cn.damai:id/tv_left_main_text").click()
poco("cn.damai:id/title_back_btn").click()

# 滑动操作
poco("cn.damai:id/rich_text_tv").swipe([-0.0254, -0.3666])

除此之外,还可以支持inspector模式。点击下图红色按钮的部分即可打开inspector,类似chrome浏览器控制台的inspector。然后在设备窗中移动鼠标,并在目标位置点击右键,也可以看到控件的名称。

inspector模式:
image

另外,还可以在poco辅助窗中点开窗口的树结构的节点,分析具体的控件名称和类型

其他控件操作

  1. 等待控件出现wait(timeout=1),如果控件在timeout时间内出现,则返回控件,否则返回None

如下面的代码等待sku_contanier出现,如果未出现,则证明本页面非选择票档的页面:

    if not poco("cn.damai:id/sku_contanier").wait(timeout=1):
        logger.debug("未在票档页")
        return False
  1. 获取子控件offspring()用于获取某控件所有的子孙节点的控件。.child()获取下级节点。

如:

# 遍历控件,返回第一个的item_text节点
poco("cn.damai:id/project_detail_perform_flowlayout").offspring("cn.damai:id/item_text")

# 遍历子节点,并单击子节点的checkbox
    for viewer_widget in  poco("cn.damai:id/recycler_view").offspring("cn.damai:id/recycler_main").child():
        viewer_widget.offspring("cn.damai:id/checkbox").click()
  1. 获取属性get_text()用于获取文字内容,attr()可获取其他属性。
#获取tv_tag的文字
tag_str=tv_tag.get_text() 

# 判断复选框是否已被选中
viewer_widget.offspring("cn.damai:id/checkbox").attr("checked") 
  1. 点击click()
viewer_widget.offspring("cn.damai:id/checkbox").click()

代码开发

基于上述poco提供的api,即可像搭积木一样组合出自动化测试工具,实现自动化抢票。
完整代码贴在: https://gist.github.com/m2kar/4f4c1cabe047ac77d5ca0a3b35fad4e1

但本方法需要通过adb和App UI交互,调用的框架较重,因此运行起来很慢,实测需要17s,比人慢很多,因此在实际抢票中不是很实用。

因此作者又深入分析了大麦网app的接口实现,后续会写在了博客的 ”[Android逆向] 某麦网抢票接口分析及抢票工具开发“ 文章中。

参考

更多poco操作可以参考官方文档: https://airtest.doc.io.netease.com/tutorial/3_Poco_introduction/

欢迎star我的GitHub,博客文章默认在GitHub首发。

本文章原链接: https://github.com/m2kar/m2kar.github.io/issues/20

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/544716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索未来智能交通:网联汽车与汽车互联

网联汽车是指配备多种传感器和通信设备,并且能够接入互联网的汽车。这种汽车可以与外部环境进行交互,并利用各种技术(如 GPS 导航、娱乐系统、诊断传感器和通信工具等)实现数据的传输和接收。 网联汽车能够与其他车辆、交通基础设…

ChatGPT 引发AI服务器霸屏?AI服务器和普通服务器不同在哪?

​  近阶段,由于 ChatGPT 的横空问世,引发 AI 服务器再一次热潮来袭。随之而来的是,越来越多的企业和机构开始关注 AI 服务器和普通服务器之间的区别和对比。那么AI服务器到底是什么意思,它与普通服务器相比又有哪些差异呢? AI…

MySQL高级——第15章_锁

第15章_锁 1. 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在程序开发中会存在多线程同步的问题,当多个线程并发访问某个数据的时候,尤其是针对一-些敏感的数据(比如订单、金额等),我们就需要保证这个数据在任何 时刻最多只…

动态规划进阶

文章目录 状压dp小国王玉米田炮兵阵地 状压dp 小国王 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter;public class Main{static BufferedReader br new Bu…

Day25力扣刷題

131.分割回文串 此題思維和前幾題不一樣,思維容量更大,主要在於返回的時候,還是會取值。 運行代碼: class Solution:def partition(self, s: str) -> List[List[str]]:result[]tt[]def backtrack(s,index):if len(s)index:res…

node.js PM2部署项目

pm2 是什么 pm2 是一个守护进程管理工具,它能帮你守护和管理你的应用程序。通常一般会在服务上线的时候使用 pm2 进行管理。本文围绕以下重点进行讲解:安装pm2;命令行部署到PM2;PM2查看日志等命令;PM2进行负载均衡;PM…

Python心经(4)

这节记录一些内置模块的使用 目录 hashlib模块,,加密用 json模块 os模块 一个实用的案例: os模块的找文件的操作 随机生成random模块 时间相关模块 time,datetime hashlib模块,,加密用 以md5加密…

什么是Spring Cache?Spring项目如何使用?

前言 目前Spring Cloud微服务在Web项目中占据了主流地位,如果去面试关于Spring Cloud的岗位时,面试官一般都会提问你的项目是如何优化的,从哪些方面入手去优化。而缓存技术绝对是项目必不可少的,所以我们必须掌握好Java项目的缓存…

unity 3种办法实现血条效果并实现3d世界血条一直看向摄像机

普通血条栏: 渐变色血条栏: 缓冲血条栏: 3D场景血条栏跟随玩家移动: 普通血条栏: 在Canvas下创建一个空物体HP bar,在空物体下方创建3个Image,分别为血条框bar 黑色,最大HP maxHP 白色,和当前HP currentHP 红色。(PS:注意先后顺序以调整显示的图层) 效果: …

java中排序

1.传统比较器格式 2.stream 3.结果 4.源码 List<String> list Arrays.asList("201305", "200305", "199009", "200208");Collections.sort(list, new Comparator<String>() {Overridepublic int compare(String o1, Stri…

SpringMVC 万字通关

文章目录 1. 什么是 Spring MVC?1.1 MVC 定义1.2 MVC 和 Spring MVC 的关系 2. Spring MVC 有什么用 ?3. 如何学 Spring MVC ?3.1 Spring MVC 的创建3.2 实现连接功能3.2.1 RquestMapping 详解1. RequestMapping 支持什么请求?2. 请求限定3. GetMapping 和 PostMapping4. c…

Sharding-Sphere系列-主从配置和分库分表

主从配置和分库分表 Sharding-Sphere组成 Sharding-JDBC Sharding-Proxy Sharding-Sidecar&#xff08;TODO&#xff09; Sharding-JDBC表的概念 逻辑表 广播表 绑定表 Sharding-JDBC中的分片策略 自动分片算法 标准分片算法 复合分片算法 自定义分片算法 分布式…

Mybatis-Plus 自动属性填充与自定义Insert into语句顺序

前言&#xff1a;系统中使用了Mybatis-Plus 自动属性填充为实体统一进行属性的填值&#xff0c;在Mapper的xml 文件中 insert into 语句 使用 <if test"id ! null">id,</if> 进行判断会发现该属性是空的&#xff0c;明明已经为改字段进行了属性的自动填充…

百度2023年Q1财报解析:AI+生态战略加速助推

原创 | 文 BFT机器人 01 百度靠AI实现翻身 &#xff08;一&#xff09;盈利能力 百度凭借着强大的AI能力&#xff0c;成功地实现了从依赖搜索业务的互联网公司到AI公司的转型。 从盈利能力层面上看&#xff0c;在第一季度&#xff0c;百度实现了营收311.44亿元&#xff0c;同比…

unity愤怒的小鸟学习制作(二)

终于又开始了啦啦啦&#xff0c;我有一个自己的相机了&#xff0c;真开心&#xff0c;诶嘿 视频链接和素材如下&#xff1a;视频 小鸟的飞出 想要让小鸟在拉开弹弓之后能飞出去&#xff0c;就必须让这个组件失活&#xff0c;如下 所以我们更改脚本内容&#xff0c;加入&#…

HarmonyOS应用端云一体化开发主要流程

图示 主要步骤 序号 阶段 任务 说明 1 创建端云一体化开发工程 选择工程类型与云开发模板 确定工程类型&#xff1a;选择“Application”或“Atomic Service”页签&#xff0c;确定创建的是HarmonyOS应用工程还是原子化服务工程。选择云开发模板&#xff0c;包括通用云开…

【FMC202】基于FMC标准的1路CameraLink Full 输入、1路DVI输出 子卡模块

产品概述 FMC202是一款基于FMC接口标准的1路CameraLink Full模式&#xff08;或者2路CameraLink Base模式&#xff09;采集、1路HDMI&#xff08;DVI&#xff09;视频输出的子卡模块&#xff0c;该模块具有2个CameraLink端口&#xff08;SDR&#xff0c;26PIN&#xff09;&…

Docker部署apache superset

使用Docker compose在docker中部署Apache Superset 说明&#xff1a;部署步骤按照superset官网说明总结而来-2023年 1、第一步安装docker 、docker compose。 这里我选择手动下载rpm包&#xff0c;然后yum install *.rpm方式来安装。 下载地址&#xff1a;https://download.…

MADDPG-学习笔记(2)

注意&#xff1a;进行本文的实验前&#xff0c;为了加快训练速度&#xff0c;进行了参数调整 num-episodes&#xff1a;由60000改成了10000 lr:由0.01改成了0.1 batch-size:由1024改成了32 1.报错 1.1 AttributeError: Scenario object has no attribute benchmark_data …

ApiKit 介绍及基本用法

1、ApiKit介绍及下载 ApiKitAPI 管理 Mock 自动化测试 异常监控 团队协作 结合 API 设计、文档管理、自动化测试、监控、研发管理和团队协作的一站式 API 生产平台&#xff0c;从个人开发者到跨国企业用户&#xff0c;Apikit 帮助全球超过50万开发者和10万家企业更快、更好…