python安卓自动化pyaibote实践------学习通自动刷课

前言

欢迎来到我的博客

个人主页:北岭敲键盘的荒漠猫-CSDN博客

本文是一个完成一个自动播放课程,避免人为频繁点击脚本的构思与源码。

加油!为实现全部电脑自动化办公而奋斗!

为实现摆烂躺平的人生而奋斗!!!

 环境描述

aibote,雷电模拟器,学习通,python3.12,pyaibote框架。

环境不会搭建可以看我这篇博客:pyaibote--安卓自动化环境配置与基础的使用方法_aibote链接手机-CSDN博客

成品代码

from PyAibote import AndroidBotMain
import time# 2. 自定义一个脚本类,继承 AndroidBotMain
class CustomAndroidScript(AndroidBotMain):#初始化配置Log_Level = "DEBUG"Log_Storage = Truedef start_xuexitong(self):#打开学习通,进入看课区域result = self.start_app("学习通", 5, 0.5)print("app运行状态:{}".format(result))place=self.get_element_rect("com.chaoxing.mobile/com.chaoxing.mobile:id=tabButton[3]", 15, 0.5)self.click((place))print("点击任务状态:{}".format(place))place=self.get_element_rect("com.chaoxing.mobile/com.chaoxing.mobile:id=myCourse", 15, 0.5)self.click((place))print("点击任务状态:{}".format(place))def select_class(self):#选择目标课程,并且判断是否有课程self.my_class=input("输入想要刷课的名称:")result = self.init_ocr_server("127.0.0.1", False, False, False)print("初始化状态:{}".format(result))result = self.get_text()print(result)if self.my_class in result:print("发现目标课程")result = self.find_text(self.my_class)print(result)self.click(result)time.sleep(1)def look_class(self):#观看课程self.current_class=float(input("(示例:2.3)\n输入你当前刷课进度:")) #当前的课程self.show_first_class()while True:self.cut_class()print("start look class")time.sleep(2)result = self.find_text("视频")print(result)self.click(result)time.sleep(3)self.ago_now()def ago_now(self):#判断课程是否看过result=self.find_text("任务点已完成")if result==():result = self.get_element_rect("com.chaoxing.mobile/android.widget.Button@text=播放", 5, 0.5)self.click(result)time.sleep(3)#判断是否看完i=1while i==1:time.sleep(5)outline=self.element_exists("com.chaoxing.mobile/android.widget.Button@text=重试", 2, 0.5)if outline: #判断是否断网self.click_element("com.chaoxing.mobile/android.widget.Button@text=重试", 2, 0.5)result = self.get_element_rect("com.chaoxing.mobile/com.chaoxing.mobile:id=start", 2, 0.5)if result!=(): #判断是否看完self.click_element("com.chaoxing.mobile/com.chaoxing.mobile:id=back", 5, 0.5)time.sleep(2)result=self.find_text("任务点已完成")if result!=():breakself.back()def cut_class(self):#看完课程更替视频self.infor_dispose()while True:#匹配课程print(self.current_class)result = self.element_exists("com.chaoxing.mobile/android.widget.TextView@text={}".format(self.current_class), 5, 0.5)print("当前课程的状态:{}".format(result))if result==True: #如果存在课程,就点击进入课程result=self.click_element("com.chaoxing.mobile/android.widget.TextView@text={}".format(self.current_class), 5, 0.5)self.current_class += 0.1  # 转换到下一门课breakelse: #如果不存在,下滑一下屏幕再匹配。print("屏幕未找到对应元素,正在执行下滑操作")self.swipe((306, 1116), (306, 750), 1)result = self.element_exists("com.chaoxing.mobile/android.widget.TextView@text={:.1f}".format(self.current_class), 5, 0.5)print("下滑后匹配元素状态:{}".format(result))if result: #如果匹配到了进入self.click_element("com.chaoxing.mobile/android.widget.TextView@text={:.1f}".format(self.current_class), 5, 0.5)self.current_class += 0.1  # 转换到下一门课breakelse: #匹配不到可能是转换章节self.current_class+=1self.current_class-=(self.current_class%1)self.current_class+=0.1result = self.element_exists("com.chaoxing.mobile/android.widget.TextView@text={}".format(self.current_class), 5, 0.5)if result: #转换章节后匹配到self.click_element("com.chaoxing.mobile/android.widget.TextView@text={}".format(self.current_class), 5,0.5)self.current_class += 0.1  # 转换到下一门课breakelse: #匹配不到的话print("该课程已经刷完,或者程序出错。")breakdef show_first_class(self):#防止第一个课程不在屏幕内result = self.element_exists("com.chaoxing.mobile/android.widget.TextView@text={}".format(self.current_class), 5, 0.5)if result:print("初始化目标课程在屏幕内")else:for i in range(15):self.swipe((402, 1404), (402, 564), 2)result = self.element_exists("com.chaoxing.mobile/android.widget.TextView@text={}".format(self.current_class), 3, 0.5)if result:breakdef infor_dispose(self):#解决python浮点不精准问题self.current_class=round(self.current_class,2)self.current_class_1=self.current_class%0.1if self.current_class_1==0:self.current_class=round(self.current_class,1)def script_main(self):#执行函数self.start_xuexitong()self.select_class()self.look_class()if __name__ == '__main__':CustomAndroidScript.execute("0.0.0.0", 16678)

效果演示

因为我已经刷完了,所以他点进去后,发现任务已完成就退出来进行下一节了。

他支持选择课程,定义开始课程节数,自动处理网络重连问题。

安卓自动化演示

需求操作分析

我们先来分析一下学习通刷课的操作流程。

开启APP

点击我,点击课程,然后从里面选取要刷的课。

选好课程后,我们需要选择我们要从哪节开始刷。

点进去后要点击视频切换到视频的页面

之后我们要判断这节有没有刷,刷完返回下一节,没刷就进去看。

如果看的话,还要判断好是否结束了。还要应对中途可能发生的网络异常情况。

识别到看完后,我们就要返回进入下一节以此类推

代码解刨

基本框架

首先是pyaibote的基本运行框架。

我们把要执行的代码放到script_main中。

  # 1. 导入 AndroidBotMain 类from PyAibote import AndroidBotMainimport time# 2. 自定义一个脚本类,继承 AndroidBotMainclass CustomAndroidScript(AndroidBotMain):# 2.1. 设置是否终端打印输出 DEBUG:输出, INFO:不输出, 默认打印输出Log_Level = "DEBUG" # 2.2. 终端打印信息是否存储LOG文件 True: 储存, False:不存储Log_Storage = True  # 2.3. 注意:script_main 此方法是脚本执行入口必须存在此方法def script_main(self):# 显示手机最近任务列表result = self.recent_tasks()print(result)if __name__ == '__main__':# 3. 注意:此处监听的端口号,必须和手机端的脚本端口号一致# 3.1 监听 16678 号端口CustomAndroidScript.execute("0.0.0.0", 16678)

定义进入APP的方法

我们需要通过找元素,点击进入这个区域。

    def start_xuexitong(self):#打开学习通,进入看课区域result = self.start_app("学习通", 5, 0.5)print("app运行状态:{}".format(result))place=self.get_element_rect("com.chaoxing.mobile/com.chaoxing.mobile:id=tabButton[3]", 15, 0.5)self.click((place))print("点击任务状态:{}".format(place))place=self.get_element_rect("com.chaoxing.mobile/com.chaoxing.mobile:id=myCourse", 15, 0.5)self.click((place))print("点击任务状态:{}".format(place))

通过这个方法来点进这个课程页面。

定义选课方法

我们需要找到我们想要的课程,于是我们定义这个方法来找课程。

    def select_class(self):#选择目标课程,并且判断是否有课程self.my_class=input("输入想要刷课的名称:")#初始化文字识别服务result = self.init_ocr_server("127.0.0.1", False, False, False)print("初始化状态:{}".format(result))#查找文本result = self.get_text()print(result)if self.my_class in result:#如果目标课程在里面就点击进入print("发现目标课程")result = self.find_text(self.my_class)print(result)self.click(result)time.sleep(1)

定义看课方法

选好课程后我们总要开始刷课吧。

这个方法是用来看课相关的操作的。

    def look_class(self):#观看课程self.current_class=float(input("(示例:2.3)\n输入你当前刷课进度:")) #当前的课程self.show_first_class() #自定义的滑动函数(防止开始刷课的节数不在屏幕中)while True: #循环执行self.cut_class() #自定义切换方法,用来判断当前应该看哪节课,并点进去print("start look class")time.sleep(2) #防止未加载出页面就文字识别导致错误result = self.find_text("视频")#识别文字print(result)self.click(result) #点击视频进去视频页面time.sleep(3)self.ago_now() #自定义函数,判断这节课是否刷完

定义滑动方法

因为我们有可以自定义开始刷课节数的功能,那么我们可能会遇到这个节数不在屏幕中会下滑的情况,这个方法就是判断并且识别这种情况的。

    def show_first_class(self):#防止第一个课程不在屏幕内result = self.element_exists("com.chaoxing.mobile/android.widget.TextView@text={}".format(self.current_class), 5, 0.5)if result: #判断屏幕中是否有这个课程的元素print("初始化目标课程在屏幕内")else: #如果没有for i in range(15): #下拉寻找self.swipe((402, 1404), (402, 564), 2)result = self.element_exists("com.chaoxing.mobile/android.widget.TextView@text={}".format(self.current_class), 3, 0.5)if result: #如果该目标进入了屏幕就退出循环break

定义切换,判断当前课程是否刷完的方法

第一我们要点进去这节课,

第二我们还要根据他的元素text1.1这类的章节数,来找下一节课,

最后我们计算机会有浮点计算偏差,但是课程就是1.1,2.2。最后的结果不能出现偏差,所以我们要把结果转化为正确无偏差的。

    def cut_class(self):#看完课程更替视频self.infor_dispose() #自定义方法解决计算机浮点计算偏差问题while True:#匹配课程print(self.current_class)result = self.element_exists("com.chaoxing.mobile/android.widget.TextView@text={}".format(self.current_class), 5, 0.5)print("当前课程的状态:{}".format(result))if result==True: #如果存在课程,就点击进入课程result=self.click_element("com.chaoxing.mobile/android.widget.TextView@text={}".format(self.current_class), 5, 0.5)self.current_class += 0.1  # 转换到下一门课breakelse: #如果不存在,下滑一下屏幕再匹配。print("屏幕未找到对应元素,正在执行下滑操作")self.swipe((306, 1116), (306, 750), 1)result = self.element_exists("com.chaoxing.mobile/android.widget.TextView@text={:.1f}".format(self.current_class), 5, 0.5)print("下滑后匹配元素状态:{}".format(result))if result: #如果匹配到了进入self.click_element("com.chaoxing.mobile/android.widget.TextView@text={:.1f}".format(self.current_class), 5, 0.5)self.current_class += 0.1  # 转换到下一门课breakelse: #匹配不到可能是转换章节self.current_class+=1self.current_class-=(self.current_class%1)self.current_class+=0.1result = self.element_exists("com.chaoxing.mobile/android.widget.TextView@text={}".format(self.current_class), 5, 0.5)if result: #转换章节后匹配到self.click_element("com.chaoxing.mobile/android.widget.TextView@text={}".format(self.current_class), 5,0.5)self.current_class += 0.1  # 转换到下一门课breakelse: #匹配不到的话print("该课程已经刷完,或者程序出错。")break

定义去除偏差方法

python浮点数加减其实会有一个很小偏差。

比如1.1+0.1=1.2000000002。

但是我们下一节就是1.2这样会出错。

于是我们用下面方法来四舍五入到我们规定的格式。

保留两位小数,如果利用取余判断小数第二位是否为0。

为0保留一位,不为0保留两位。

    def infor_dispose(self):#解决python浮点不精准问题self.current_class=round(self.current_class,2)self.current_class_1=self.current_class%0.1if self.current_class_1==0:self.current_class=round(self.current_class,1)

定义判断这节该不该刷,以及刷完退出的方法

我们肯定不能刷刷过的课浪费大量时间,这就需要我们加一个判定。

循环前是进行判断,有没有那个任务点已完成。

后面是刷课结束以及判断是否断网。

    def ago_now(self):#判断课程是否看过result=self.find_text("任务点已完成")if result==():result = self.get_element_rect("com.chaoxing.mobile/android.widget.Button@text=播放", 5, 0.5)self.click(result)time.sleep(3)#判断是否看完i=1while i==1:time.sleep(5)outline=self.element_exists("com.chaoxing.mobile/android.widget.Button@text=重试", 2, 0.5)if outline: #判断是否断网self.click_element("com.chaoxing.mobile/android.widget.Button@text=重试", 2, 0.5)result = self.get_element_rect("com.chaoxing.mobile/com.chaoxing.mobile:id=start", 2, 0.5)if result!=(): #判断是否看完self.click_element("com.chaoxing.mobile/com.chaoxing.mobile:id=back", 5, 0.5)time.sleep(2)result=self.find_text("任务点已完成")if result!=():breakself.back()

最后组装方法

在执行方法中拼凑方法。

主要的方法是三大步骤。

进入,选课,以及刷课

    def script_main(self):#执行函数self.start_xuexitong()self.select_class()self.look_class()

总结

以上就是整个刷课脚本的实现流程与代码,可以为我点一个赞吗。

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

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

相关文章

视觉语言模型详解

视觉语言模型可以同时从图像和文本中学习,因此可用于视觉问答、图像描述等多种任务。本文,我们将带大家一览视觉语言模型领域: 作个概述、了解其工作原理、搞清楚如何找到真命天“模”、如何对其进行推理以及如何使用最新版的 trl 轻松对其进行微调。 什…

【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)

🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 🌈C笔记专栏: C笔记 🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 一、回调函数二、快速排序(Qsort)2.1 Qsort参数部分介绍2.2 不…

报错“Install Js dependencies failed”【鸿蒙开发Bug已解决】

文章目录 项目场景:问题描述原因分析:解决方案:此Bug解决方案总结Bug解决方案寄语项目场景: 最近也是遇到了这个问题,看到网上也有人在询问这个问题,本文总结了自己和其他人的解决经验,解决了【报错“Install Js dependencies failed”】的问题。 报错如下 问题描述 …

【C++语法练习】计算梯形的面积

题目链接:https://www.starrycoding.com/problem/158 题目描述 已知一个梯形的上底 a a a,下底 b b b和高 h h h,请求出它的面积(结果保留两位小数)。 输入格式 第一行一个整数 T T T表示测试用例个数。 ( 1 ≤ T …

Linux 的静态库和动态库

本文目录 一、静态库1. 创建静态库2. 静态库的使用 二、动态库1. 为什么要引入动态库呢?2. 创建动态库3. 动态库的使用4. 查看可执行文件依赖的动态库 一、静态库 在编译程序的链接阶段,会将源码汇编生成的目标文件.o与引用到的库(包括静态库…

关于用户体验和设计思维

介绍 要开发有效的原型并为用户提供出色的体验,了解用户体验 (UX) 和设计思维的原则至关重要。 用户体验是用户与产品、服务或系统交互并获得相应体验的过程。 设计思维是一种解决问题的方法,侧重于创新和创造。 在启动期实现用户体验和设计思维时&#…

大数据分析与内存计算学习笔记

一、Scala编程初级实践 1.计算级数: 请用脚本的方式编程计算并输出下列级数的前n项之和Sn,直到Sn刚好大于或等于q为止,其中q为大于0的整数,其值通过键盘输入。(不使用脚本执行方式可写Java代码转换成Scala代码执行&a…

监视器和显示器的区别,普通硬盘和监控硬盘的区别

监视器与显示器的区别,你真的知道吗? 中小型视频监控系统中,显示系统是最能展现效果的一个重要环节,显示系统的优劣将直接影响视频监控系统的用户体验满意度。 中小型视频监控系统中,显示系统是最能展现效果的一个重要…

二叉树详细介绍与代码生成遍历

目录 树的概念及其结构树的构造——代码表示 二叉树概念及介绍二叉树的存储结构二叉树的顺序结构二叉树的链式结构链表的代码展示堆的基本概念和结构堆的代码体现二叉树生成二叉树遍历 四种不同遍历方式——代码展示 树的概念及其结构 要了解二叉树,那么首要的就是…

Spark Structured Streaming 分流或双写多表 / 多数据源(Multi Sinks / Writes)

博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,…

探索潜力:中心化交易所平台币的对比分析

核心观点 平台币在过去一年里表现差异显著: 在过去的一年里,只有少数几个平台币如BMX、BGB和MX的涨幅超过了100%。相比之下,由于市值较高,BNB和OKB的涨幅相对较低。 回购和销毁机制在平台币价值中起决定性作用: 像M…

2024五一数学建模竞赛(五一赛)选题建议+初步分析

提示&#xff1a;DS C君认为的难度&#xff1a;B>A>C&#xff0c;开放度&#xff1a;AB<C。 以下为A-C题选题建议及初步分析&#xff1a; A题&#xff1a;钢板最优切割路径问题 l 难度评估&#xff1a;中等难度。涉及数学建模和优化算法&#xff0c;需要设计最优的…

前后端数据加密代码实战(vue3.4+springboot 2.7.18)

简述&#xff1a; 文章主要讲述了在vue3与springboot交互数据的个人使用的一个加密形式 SHA256不可逆加密AES对称加密RSA非对称加密 加密算法就不带大家深入了&#xff0c;对于它的使用文章中有明确的案例 数据加密的大概流程为&#xff1a;&#xff08;有更优秀的方案可以…

Springboot+Vue项目-基于Java+MySQL的入校申报审批系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

Python用KNN处理缺失值(4月30-5月1日)

首先试验KNN的简单示例代码 #方法3&#xff1a; # 本论文拟采用的填充缺失值的方法为KNN: import pandas as pd from sklearn.impute import KNNImputer #创建一个包含缺失值的数据集 data_KNN{第一列:[1,2,None,4,5],第二列:[3,None,5,7,9],第三列:[2,4,6,None,10] } dfpd.Da…

有哪些ai自动生成图片软件?AI绘画工具推荐

AI绘画工具是近年来快速发展的一种创新技术&#xff0c;它可以通过算法和机器学习技术来自动生成图片。那么又有有哪些ai自动生成图片软件呢&#xff1f;下面是小编给大家的AI绘画工具推荐。 一、爱制作AI 爱制作AI是一款多功能的人工智能助手&#xff0c;具备AI问答、AI写作、…

【FPGA】优化设计指南(一):设计原则

目录 避免采用不可综合的语句设计时采用同步的时钟组合逻辑与毛刺异步复位与同步复位动态分析与静态分析功能流水线时序违例乒乓操作面积和速度的平衡避免采用不可综合的语句 1.#1000延时语句 2.除法运算/,除非除数为2的整次幂 3.实数类型不可综合(real) 4.综上,使用可综合…

STM32进入睡眠模式的方法

#STM32进入睡眠模式的方法 今天学习了如何控制STM32进入睡眠模式&#xff0c;进入睡眠模式的好处就是省电&#xff0c;今天学习的只是浅度睡眠&#xff0c;通过中断就能唤醒。比如单片机在那一放&#xff0c;也许好几天好几个月都不用一次&#xff0c;整天的在那空跑while循环…

C#应用程序实现多屏显示

前言 随着业务发展&#xff0c;应用程序在一些特定场景下&#xff0c;只在一个显示器上展示信息已经不能满足用户需求。我们如何把主屏运行程序中多个窗体移动到各个扩展屏幕位置显示呢&#xff1f;C# 是通过什么方式来实现的&#xff0c;下面介绍 C# 使用 Screen 类的方式来实…

64、二分-搜索二维矩阵

思路&#xff1a; 通过使用二分方式&#xff0c;对于每行进行二分&#xff0c;因为每行的最后一个数小于下一行的第一个数&#xff0c;我们就可以依次二分。首先取出行数N&#xff0c;然后从0-N进行二分&#xff0c;如果mid最后一个数小于目标值说明0-mid中没有&#xff0c;舍弃…