应用宝自动下载安装
import uiautomator2 as u2
from threading import Thread
import logging
import sys
import os
logger=logging.getLogger("uiautomator2")
logger.setLevel(logging.INFO)
d = u2.connect()"""下载模块"""
class yingyongbao(object):
#初始化屏幕尺寸def __init__(self):self.width, self.height = d.window_size()print(self.width,self.height) #720 1600#os.system("python -m uiautomator2 init")# width=0.15*width# height=0.95*height# print(width,height) #108.0 1520.0def get_path(self):self.basedir = os.path.dirname(os.path.abspath(__file__))def get_screen_path(self):screen_path = os.path.join(self.basedir,'log')if not os.path.exists(screen_path):os.mkdir(screen_path)return screen_pathdef get_error_result(self):error_path = os.path.join(self.basedir, 'screen')if not os.path.exists(error_path):os.mkdir(error_path)return error_path# def init_device(self):# os.system("python -m uiautomator2 init")def start_yingyongbao(self):try:os.system("python -m uiautomator2 init")file_path=input("请输入需要下载的文本路径:")with open(file_path, 'r') as f:self.package_list = f.readlines()d.shell("pm grant com.tencent.android.qqdownloader android.permission.'POST_NOTIFICATIONS'")d.app_clear("com.tencent.android.qqdownloader")d.app_start("com.tencent.android.qqdownloader", wait=True)d.sleep(8)try:if "应用宝" == d.xpath('//*[@resource-id="android:id/alertTitle"]').get_text():d.xpath("//*[@resource-id='android:id/button1']").click()except:print("点击应用宝权限后未识别")# if d(textContains="检查是否有更新").exists(timeout=30):# d.xpath("//*[@resource-id='android:id/button1']").click()if d(textContains="欢迎使用应用宝").exists(timeout=30):d.xpath('//*[@resource-id="com.tencent.android.qqdownloader:id/ri"]').click()if d(textContains="发送通知吗").exists(timeout=30):d.xpath('//*[@resource-id="com.android.permissioncontroller:id/permission_allow_button"]').click()if d(textContains='一键下载').exists(timeout=30):d.press("back")if d(textContains="秒完游戏").exists(timeout=20):d.press("back")except:logger.info("function:" + sys._getframe().f_code.co_name + ":start_yingyongbao:")def login_yingyongbao(self):try:d(resourceId="com.tencent.android.qqdownloader:id/e6", text="我的").click()if d(text="欢迎登录应用宝").exists(timeout=6):d.xpath('//*[@resource-id="com.tencent.android.qqdownloader:id/uy"]').click()d.xpath('//*[@resource-id="com.tencent.android.qqdownloader:id/ac1"]').click()d(text="下载完成后提示安装").right().click()d.press("back")d(text="下载完成后提示安装").wait_gone()except:logger.info("function:" + sys._getframe().f_code.co_name + ":login_yingyongbao:")def down_app(self):#assert_succes=["下载量","评价"]try:for i in range(0, len(self.package_list)):d.shell(f"am start -a android.intent.action.VIEW -d market://details?id={self.package_list[i]} -p com.tencent.android.qqdownloader")#有多个下载apk路径就需要使用如下代码#d.app_wait(self.package_list[i], 60, front=True)# try:# #首次启动应用宝会选择打开的方法 如果有多个下载途径# assert d(text="应用宝").exists(2)# d.xpath("//*[@text='应用宝']").click()# #d.xpath("//*[@text='仅此一次']").click()# # d.xpath("//*[@text='始终']").click()# d.sleep(2)# d.click(width*0.75, height*0.95) #540 1520# except:# pass#try:d(text="下载量").exists(10)d(text="评价").exists(10)# device.xpath('//*[@text="下载"]').click()assert "下载量" in d(text="下载量").get_text() and "评价" in d(text="评价").get_text()# install_num = d(text="下载量").wait(20).exit()d.click(0.15 * self.width, 0.95 * self.height)d.sleep(3)print(f"{self.package_list[i].strip()}已加入到下载名单")except:assert "找不到数据" in d(resourceId="com.tencent.android.qqdownloader:id/v5").get_text()print(f"网络问题导致{self.package_list[i]}下载失败,检查网络")self.package_list_sceen=self.package_list[i].strip()d.screenshot(f'{self.package_list_sceen}.png')# try:# d(textContains="找不到数据了").exists()# d(text="重新加载").click()# except:# print("你的网络断了,检查网络")# d.screenshot("网络问题.png")continueexcept:logger.info("function:" + sys._getframe().f_code.co_name + ":yinngyongbao_install:")# d(textContains="运营者").click()# element_install_num = d(text="下载量").get_text()# element_evaluate = d(text="评价").get_text()# assert element_install_num=="下载量" and element_evaluate=="评价"# #print(element_install_num,element_evaluate)# d.click(width,height)#断言//*[@text="下载量"] 和 //*[@text="评价"]"""安装模块已写好"""def yingyongbao_install_Permissions(self):d.app_start("com.tencent.android.qqdownloader", wait=True)d.xpath('//*[@text="我的"]').click_exists(timeout=30)#d(resourceId="com.tencent.android.qqdownloader:id/e6",text="我的").click_exists(20)if d(text="欢迎登录应用宝").exists(timeout=6):d.xpath('//*[@resource-id="com.tencent.android.qqdownloader:id/uy"]').click()try:d.xpath("//*[@text='下载安装']").wait(20).click()try:d.xpath("//*[@text='一键安装']").wait(20).click()except Exception as result:print(f"{result}\n没有一键安装按钮,检查是否已经下载了安装包")except:logger.info("function:" + sys._getframe().f_code.co_name + ":yingyongbao_install_Permissions:")try:assert "未知应用" in d(resourceId="android:id/message").get_text()d(resourceId="android:id/button1", text="设置").click()d.xpath('//*[@text="允许来自此来源的应用"]').click()d(text="取消").click()# d(text="安装").click()# d(text="完成").click_exists(timeout=180)d.press("back")d(text="安装未知应用").wait_gone(timeout=5)except:logger.info("function:" + sys._getframe().f_code.co_name + ":yingyongbao_install_Permissions:")# try:
# d(resourceId="com.tencent.android.qqdownloader:id/gz", text="一键安装").click()
# except Exception as result:
# print(f"{result}\n没有一键安装按钮,检查是否已经下载了安装包")def yingyongbao_install(self):app_all=[]while True:try:#d.xpath('//*[@resource-id="com.android.packageinstaller:id/install_confirm_question"]').get_text()=="要安装此应用吗?"#assert "安装" in d(text="要安装此应用吗?").get_text()assert "安装" in d(textContains="此应用").get_text()# 检查并点击“要安装此应用吗?”if d(text="要安装此应用吗?").exists(timeout=10):app_name=d.xpath("//*[@resource-id='android:id/alertTitle']").get_text()print(f"安装的应用昵称是{app_name}")app_all.append(app_name)d(text="安装").click()#print(f"正在安装的应用是{self.package_list[i]}")# 等待“正在安装…”出现(注意:这里不调用exists,只是等待)d(text="正在安装…").wait(timeout=10)# 检查并点击“完成”(如果它存在)if d(text="完成").exists(timeout=120):d(text="完成").click()#print(f"安装的应用是{self.package_list[i]}")except:print(f"总共安装了len{app_all}个应用,分别是{app_all}")break# """守护线程要安装的应用"""
# def wait_insatall(self):
# """会提示安装未知应用"""
# try:
# assert "未知应用" in d(resourceId="android:id/message").get_text()
# d(resourceId="android:id/button1",text="设置").click()
# d(resourceId="android:id/title", text="允许来自此来源的应用").click()
# except:
# pass
# #d(text="Settings").wait_gone(timeout=1.0) 等待消失
# d(text="安装").wait(5)
# d(text="安装",className="android.widget.Button").click()
# if d(text="已屏蔽不安全的应用").exists(timeout=5):
# # d(text="知道了").click()
# d.xpath('//*[@text="更多详情"]').click()
# d.xpath('//android.widget.ScrollView/android.view.View[3]') # 需要点击仍要安装
# d(text="正在安装…").wait(2).exists(timeout=3)
# d(text="已安装应用。").exists(timeout=5)
# #会弹出不安全的应用
# a_thead=Thread(target=self.wait_insatall,args=())
# b_thead=Thread(target=self.yinngyongbao_install,args=())
# a_thead.setDaemon(True)
# a_thead.start()
# b_thead.start()@staticmethoddef show_menu():print("========================================================== ")print("|| <1>应用宝下载 <2>应用宝安装 <3> ||\n")print("========================================================== ")if __name__ == '__main__':anzhuang=yingyongbao()"""应用宝下载功能"""while True:anzhuang.show_menu()num = int(input("输入你要选择的功能,用数字替代:先下载后执行安装:"))if num == 1:anzhuang.start_yingyongbao()anzhuang.login_yingyongbao()anzhuang.down_app()print("=======================下载执行完毕=========================== ")elif num == 2:"""应用宝安装功能"""anzhuang.yingyongbao_install_Permissions()anzhuang.yingyongbao_install()else:print("输入有误,重新输入")
相关文章:

应用宝自动下载安装
import uiautomator2 as u2 from threading import Thread import logging import sys import os loggerlogging.getLogger("uiautomator2") logger.setLevel(logging.INFO) d u2.connect()"""下载模块""" class yingyongbao(object…...

Vue 2 中实现双击事件的几种方法
在 Vue 2 中处理用户交互,特别是双击事件,是一个常见的需求。Vue 提供了一种简洁的方式来绑定事件,包括双击事件。本文将介绍几种在 Vue 2 中实现双击事件的方法。 1. 使用 dblclick 指令 Vue 允许你直接在模板中使用 dblclick 指令来监听双…...

windows服务管理插件 nssm
NSSM是一个windows下服务管理插件,可以填加、删除、启动、停止服务 1.下载 官网:http://nssm.cc 下载页面:http://nssm.cc/download 直接下载:http://nssm.cc/release/nssm-2.24.zip 2.食用 以填加php8.2为例 2.1.将nssm.ex…...

【读书笔记-《30天自制操作系统》-19】Day20
本篇的内容围绕系统调用展开。为了让应用程序能够调用操作系统功能,引入了系统调用以及API的概念。首先实现了显示单个字符的API,让应用程序通过传递地址的方式进行调用;接下来又改进为通过中断的方式进行调用。在此基础上继续实现了显示字符…...

Kubernetes服务注册与发现
Kubernetes服务注册与发现 1、服务注册2、服务发现2.1 DNS服务发现2.2 环境变量(较少使用)💖The Begin💖点点关注,收藏不迷路💖 在Kubernetes中,服务注册与发现确保了Pod间的高效通信。 1、服务注册 当创建Service时,其信息被存储在Kubernetes的ETCD数据库中。Pod…...

【 html+css 绚丽Loading 】000047 玄武流转盘
前言:哈喽,大家好,今天给大家分享htmlcss 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕…...

线程池原理及改造
目录 一 线程池执行原理 二 线程池改造(一) 三 线程池改造(二) 一 线程池执行原理 首先我们先了解一下线程池里面几个参数: 第一个是核心线程数,第二个是线程池最大线程数。(线程池里面的线程分为核心线程和非核心线程,既然核心…...

彻底理解mysql Buffer Pool (拓展)
彻底理解Buffer Pool (拓展) 一、Buffer Pool 的内存管理策略对数据库性能的影响 内存分配与回收:Buffer Pool 在申请内存时,需要考虑操作系统的内存分配策略。如果分配不合理,可能导致内存碎片,影响性能…...

信号量(二值信号量和计数信号量)和互斥量
信号量 信号量(Semaphore) 是一种实现任务间通信的机制, 可以实现任务之间同步或临界资源的互斥访问, 常用于协助一组相互竞争的任务来访问临界资源。 在多任务系统中, 各任务之间需要同步或互斥实现临界资源的保护&a…...

结构型模式-python版
在21种设计模式中, 结构型设计模式有7种, 分别是: 适配器模式代理模式桥接模式享元模式外观模式组合模式装饰器模式 下面逐一简要介绍: 1 适配器模式 适配器(Adapter)设计模式是一种结构型设计模式&…...

Java重修笔记 第五十四天 坦克大战(二)常用的绘图方法、画出坦克图形
常用的绘图方法 1.设置当前画笔的颜色,可多次调用 public abstract void setColor(Color c) 参数:c -颜色 2. 画一条直线 public abstract void drawLine(int x1, int y1, int x2, int y2) 参数:x1 - 第一个点的 x坐标。 y1 - 第一点的 y坐…...

OpenAI澄清:“GPT Next”不是新模型。
不,”GPT Next” 并不是OpenAI的下一个重要项目。 本周早些时候,OpenAI 日本业务的负责人长崎忠男在日本 KDDI 峰会上分享了一场演讲,似乎在暗示一个名为 “GPT Next” 的新模型即将出现。 但OpenAI的一位发言人已向Mashable证实࿰…...

<<编码>> 第 10 章 逻辑与开关(Logic and Switches) 示例电路
串联电路 info::操作说明 鼠标单击开关切换开合状态 需要两个开关同时闭合才能接通电路 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/code-hlchs-examples/assets/circuit/code-hlchs-ch10-01-series-circuit.txt 并联电路 in…...

深入浅出 Ansible 自动化运维:从入门到实战
在现代 IT 运维中,自动化是提升效率、降低错误率的关键。Ansible 作为一款流行的自动化工具,凭借其简洁的语法和强大的功能,成为了运维工程师的得力助手。本文将深入探讨 Ansible 的核心概念、实际应用以及一些实用的技巧,帮助你在…...

一句话描述设计模式
最近在看设计模式,其描述抽象程度令人欲罢不能,始终不得其意。于是尝试用一句话总结了一下,常规的就不说了,只是举了个例子。 单例模式 Spring中的单例bean使用了双重锁机制 工厂模式 Spring中的BeanFactory是简单工厂模式Bea…...

【Linux】Ubuntu 22.04 shell实现MySQL5.7 tar 一键安装
参考 https://blog.csdn.net/qq_35995514/article/details/134350572?spm1001.2014.3001.5501 在原作者基础上做了修改,加了一个删除原有mysql 的脚本 文章目录 一、安装下载**my.cnf 配置文件** 二、执行安装**install_mysql.sh 安装脚本**本机免密脚本 ssh_keyge…...

SQL Server开启网络访问
目前工作中很少用到SQL Server了,最近需要测试几个表,需要搭建一个SQL Server数据库服务,这里做个总结吧。 安装这里就不做详细介绍了,本文只介绍如何开启SQL Server网络访问。 1、云服务器安全组设置 如果是搭建在云服务器上&a…...

el-input设置type=‘number‘和v-model.number的区别
el-input设置typenumber’与设置.number修饰符的区别 1. 设置type‘number’ 使用el-input时想收集数字类型的数据,我们首先会想到typenumber,设置完type为number时会限制我们输入的内容只能为数字,不能为字符/汉字等非数字类型的数值&…...

6.第二阶段x86游戏实战2-理解程序流程
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 工具下载: 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…...

Netty笔记01-Netty的基本概念与用法
文章目录 1. 概述1.1 Netty 是什么?1.2 Netty 的特点1.3 Netty 的作者1.4 Netty 的地位1.5 Netty 的优势1.6 Netty 的工作原理1.7 Netty 的应用场景1.8 Netty 的重要组件 2. 第一个程序2.1 目标2.2 服务器端2.3 客户端2.4 流程梳理💡 提示 1. 概述 1.1 …...

OpenHarmony鸿蒙( Beta5.0)RTSPServer实现播放视频详解
鸿蒙开发往期必看: 一分钟了解”纯血版!鸿蒙HarmonyOS Next应用开发! “非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通) “一杯冰美式的时间” 了解鸿蒙HarmonyOS Next应用开发路…...

QT使用事件事件和绘制事件实现简易时钟
这个时钟实现的底层原理主要是利用 Qt 的绘图机制和定时器。首先,设置固定大小的窗口,创建定时器并连接到槽函数,定时器每秒钟触发一次,触发窗口重绘。在paintEvent函数中,使用QPainter进行绘图,绘制圆形表…...

kubeadm方式安装k8s
一、安装环境 环境准备:(有阿里云)centos7 k8s-master 192.168.1.11 k8s-node1 192.168.1.22 k8s-node2 192.168.1.33 二、前期准备 在k8s-master主机 [rootk8s-master ~]# vim /etc/hosts…...

如何使用go生成可执行文件
在 Go 中生成可执行文件非常简单。你可以使用 go build或者go install 命令。以下是步骤: 1. 步骤 1.1. 打开终端,导航到你的 Go 项目目录 确保你在包含 main 包的目录中,通常这是项目的根目录或包含 main.go 文件的目录。 1.2. 运行 go …...

手写Promise
构造器的实现 const PENDING pending; const FULFILLED fulfilled; const REJECTED rejectedclass MyPromise{#state PENDING;#result undefined;constructor(executor){const resolve (data) > {this.#changeState(FULFILLED, data);};const reject (reason) > …...

深度学习云服务器免费使用教程
#云服务器# #深度学习# #人工智能# #计算机视觉# 本文为各位学习深度学习的入门选手而创建,降低深度学习的入门门槛。 谷歌云服务器Colab: T4GPU。限额,需要科学上网,不能使用终端。 谷歌云服务器地址:欢迎使用 C…...

使用ansible的剧本制作salt-master与salt-minion的安装与启动服务过程
虚拟机版本:Rocky Linux release 8.6 (Green Obsidian) 准备几台虚拟机 ipv4地址主机名192.168.137.13center192.168.137.14sp-1192.168.137.15sp-2192.168.137.16sp-3 一、center主机的配置 1.vim /etc/hosts 127.0.0.1 localhost localhost.localdomain loc…...

数据库sqlite3
用数据库函数完成数据的增删改查 增: 将要存储的信息录入到结构体中,再使用snprintf函数信息结合sqlite3命令语句使用sqlite3_exec函数完成插入。 int do_insert(sqlite3 *ppDb) {Worker Work;printf("输入插入的工号:");scanf("%d&qu…...

开发基础之Python 函数(Basic Python Functions for Development)
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…...

Django_Vue3_ElementUI_Release_001_项目初始化
1. 数据库 1.1 安装 https://blog.csdn.net/rbx508780/article/details/127176754 1.2 创建数据库 1.3 DBeaver可视化数据库 https://dbeaver.io/download/ 2 安装Python(3.9.12) 2.1 下载地址 https://www.python.org/downloads/release/python-3912/ 2.2 设定国内源 pip …...