当前位置: 首页 > article >正文

应用宝自动下载安装

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.0
    def 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_path

    def 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")
                	continue
        except:
            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()
    @staticmethod
    def 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("输入有误,重新输入")

http://www.kler.cn/a/300278.html

相关文章:

  • vif-方差膨胀因子计算
  • 数据结构学习记录-队列
  • 零信任安全理念
  • C++ ——— 模拟实现 vector 类
  • 在离线无管理员权限的情况下为Linux配置oh-my-zsh(zsh+oh my zsh+powerlevel10k)
  • 如何在龙蜥 OS(AliOS)上安装极狐GitLab?
  • 如何下载和安装 Notepad++
  • 【数据库】MySQL表的Updata(更新)和Delete(删除)操作
  • Spring 框架——@Retryable 注解与 @Recover 注解
  • 【delphi】判断多显示器下,程序在那个显示器中
  • C++day7
  • python 实现gaussian高斯算法
  • Vuex快速入门
  • mysql等相关面试题
  • Sentinel实时监控不展示问题
  • kali2023安装docker
  • SprinBoot+Vue老年医疗保健网站的设计与实现
  • 使用ffmpeg在视频中绘制矩形区域
  • 【重学 MySQL】十八、逻辑运算符的使用
  • CentOS系统上Node.js安装与配置最佳实践
  • IIS 反向代理模块: URL Rewrite 和 Application Request Routing (ARR)
  • Vuex:深入理解所涉及的几个问题
  • [数据集][目标检测]石油泄漏检测数据集VOC+YOLO格式6633张1类别
  • 深入探索嵌入式 Linux
  • 【大模型基础】P2 Bag-of-Words
  • C语言深入理解指针五(18)