当前位置 博文首页 > python编写adb截图工具的实现源码

    python编写adb截图工具的实现源码

    作者:mengyuelby 时间:2021-09-17 18:22

    目录
    • 一、 功能
    • 二、使用说明
    • 三、实现
      • 1.初始源码
      • 2.优化:增加ip连接断开重连处理

    一、 功能

    Android端或者Android终端的远程截图至本地电脑中

    在这里插入图片描述

    二、使用说明

    1.adb截图工具可用于Android手机及Android终端
    2.使用数据线连接前提:电脑与Android终端/手机已连接
    Android终端/手机已打开开发者模式
    3.生成的图片格式为png

    三、实现

    1.初始源码

    import time
    import os,sys
    
    #截图
    def screencap_cmd(filePath,devices=None):
        if filePath==None:
            filePath='D:/png/'
        if not os.path.exists(filePath):
            os.makedirs(filePath)
        filename=time.strftime("%Y%m%d%H%M%S",time.localtime())+".png"
        if devices==None:
            cmd_screencap='adb shell screencap -p sdcard/'+filename
            cmd_pull='adb pull sdcard/'+filename+' '+filePath+filename
            cmd_delete='adb shell rm sdcard/'+filename
        else:
            cmd_screencap='adb -s '+devices+' shell screencap -p sdcard/'+filename
            cmd_pull='adb -s '+devices+' pull sdcard/'+filename+' '+filePath+filename
            cmd_delete='adb -s '+devices+' shell rm sdcard/'+filename
        os.system(cmd_screencap)
        os.system(cmd_pull)
        os.system(cmd_delete)
    #保存地址判断及设备信息分类调用
    def screencap_info(devices=None,filePath=None):
        if filePath==None:
            filePath='D:/png/'
        if not os.path.exists(filePath):
            os.makedirs(filePath)
        if devices==None:
            screencap_cmd(filePath)
            adb_device_none(filePath)
        else:
            screencap_cmd(filePath,devices)
            adb_info(devices,filePath)
    #更换设备
    def change_devices():
        r=os.popen("adb devices")
        lines=r.readlines()
        lines=lines[1:-1]
        n=len(lines)
        for i in lines:
            print(i.split("\t")[0])
        devices=input("请输入指定设备:\n")
        for i in lines:
            if devices in i:
                return devices
        print("未找到改设备请重新输入!")
        change_devices()
    #截图命令判断,电脑连接多个设备或使用IP截图时
    def adb_info(lines,filePath=None):    
        s=input("是否截图(T/F/N)?\n")
        if s=='t' or s=='T':
            if filePath==None:
                screencap_info(lines)
            else:
                screencap_info(lines,filePath)
        elif s=='N' or s=='n' or s=='exit':
            sys.exit()
        elif s=='F' or s=='f':
            devices=change_devices()
            if filePath==None:
                adb_info(devices)
            else:
                adb_info(devices,filePath)    
     #截图命令判断,电脑连接仅连接一个设备时  
    def adb_device_none(filePath=None):
        s=input("是否截图(T/F/N)?\n")
        if s=='t' or s=='T':
            if filePath==None:
                screencap_info()
            else:
                screencap_info(None,filePath)
        elif s=='N' or s=='n' or s=='exit':
            sys.exit()
        elif s=='F' or s=='f':
            devices=change_devices()
            if filePath==None:
                adb_info(devices)
            else:
                adb_info(devices,filePath)
    #使用设备判断
    def adb_devices(n,lines,filePath=None):
        if n==0:
            print("请检查是否已接连或启动调试模式或安装adb环境")
            s=input("再次启动(T/F)?\n")
            if s=='t' or s=='T':
                r=os.popen("adb devices")
                lines=r.readlines()
                lines=lines[1:-1]
                n=len(lines)
                adb_devices(n,r.readlines())
            else:
                sys.exit()
        elif ":5555" in lines:
            print("T:截图  F:更换设备 exit|N:退出 ")
            if filePath==None:
                adb_info(lines)
            else:
                adb_info(lines,filePath)   
        elif n==1:
            print("T:截图  F:更换设备  exit|N:退出")
            if filePath==None:
                adb_device_none()
            else:
                adb_device_none(filePath)    
        elif n>1:
            for i in lines:
                print(i.split("\t")[0])
            devices=input("请输入指定设备:\n")
            for i in lines:
                if devices in i:
                    print("T:截图  F:更换设备  exit|N:退出")
                    if filePath==None:
                        adb_info(devices)
                    else:
                        adb_info(devices,filePath)  
            print("未找到改设备请重新输入!")
            if filePath==None:
                adb_devices(n,lines)
            else:  
                adb_devices(n,lines,filePath)
    
    #输入IP
    def ip_info():
        ipPath=input("请输入IP:(不输入enter跳过默认使用数据线连接)\n")
        if len(ipPath)>0:
            try:
                cnd='adb connect '+ipPath
                os.system(cnd)
                return ipPath
            except:
                print("ADB调试模式为USB,需要切换到无线调试模式\n")
                print("切换方法:\n第一步:Android设备开启USB调试,并且通过USB线连接到电脑\n第二步:在终端执行以下命令”adb tcpip 5555“\n第三步:在终端执行以下命令”adb connect ip“。此时拔出USB线,应该就可以adb通过wifi调试设备\n")
                return ip_info()
    if  __name__ == '__main__':
        ipPath=ip_info()
        filePath=input("请输入保存地址:(不输入enter跳过,默认保存至D:\png\)\n")
        #查询当前连接的设备
        r=os.popen("adb devices")
        lines=r.readlines()
        lines=lines[1:-1]
        n=len(lines)
        ip_add=0
        if ipPath!=None:
            for i in lines:
                if ipPath in i:
                    ip_add=i.split("\t")[0]
        if len(filePath)>0:
            if ":\\" in filePath:
                if ip_add!=0:
                    adb_devices(n,ip_add,filePath)
                else:
                    adb_devices(n,lines,filePath)
            else:
                print("地址输入非法,使用默认地址\n")
                if ip_add!=0:
                    adb_devices(n,ip_add)
                else:
                    adb_devices(n,lines)
        else:
            if ip_add!=0:
                adb_devices(n,ip_add) 
            else:
                adb_devices(n,lines) 

    2.优化:增加ip连接断开重连处理

    在输入ip函数ip_info()增加ip连接判断,将os.system替换成os.popen函数执行cmd命令:

    r=os.popen(cnd)
    #读取执行结果
    lines=r.readlines()[0]
    if 'unable' in lines:
        print("连接失败\n")
        return ip_info()
    else:
        return ipPath
    1. os.system函数无法获取执行结果,只能获取执行成功或失败的结果,成功返回0,失败返回1,且会执行的结果打印在终端上,相当于调起dos执行命令
    2. os.popen函数可获取执行的结果内容,但获取的结果要进行readlines读取,执行的结果不会打印在终端上

    在输入ip函数ip_info()增加ip连接判断,将os.system替换成os.popen函数执行cmd命令:

    a=os.system(cmd_screencap)
    if a==0:
       os.system(cmd_pull)
       os.system(cmd_delete)
    else:
       if ":5555" in devices:
                print("连接断开,请重新连接\n")
                ipPath=ip_info()
                if ipPath==None:
                    ipPath=ip_info()
                else:
                    device=ipPath+":5555"
                    adb_info(device,filePath)
            else:
                print("设备连接断开,请更换设备\n")
                device=change_devices()
                adb_info(device,filePath)

    3.最终源码

    import time
    import os,sys
    
    #输入IP
    def ip_info():
        ipPath=input("请输入IP:(不输入enter跳过默认使用数据线连接)\n")
        if len(ipPath)>0:
            try:
                cnd='adb connect '+ipPath
                r=os.popen(cnd)
                lines=r.readlines()[0]
                if 'unable' in lines:
                    print("连接失败\n")
                    return ip_info()
                else:
                    return ipPath
    
            except:
                print("ADB调试模式为USB,需要切换到无线调试模式\n")
                print("切换方法:\n第一步:Android设备开启USB调试,并且通过USB线连接到电脑\n第二步:在终端执行以下命令”adb tcpip 5555“\n第三步:在终端执行以下命令”adb connect ip“。此时拔出USB线,应该就可以adb通过wifi调试设备\n")
                return ip_info()
    #保存地址判断及设备信息分类调用
    def screencap_info(devices=None,filePath=None):
        if filePath==None:
            filePath='D:/png/'
        if not os.path.exists(filePath):
            os.makedirs(filePath)
        if devices==None:
            screencap_cmd(filePath)
            adb_device_none(filePath)
        else:
            screencap_cmd(filePath,devices)
            adb_info(devices,filePath)
    #更换设备
    def change_devices():
        r=os.popen("adb devices")
        lines=r.readlines()
        lines=lines[1:-1]
        n=len(lines)
        for i in lines:
            print(i.split("\t")[0])
        devices=input("请输入指定设备:\n")
        for i in lines:
            if devices in i:
                return devices
        print("未找到改设备请重新输入!\n")
        change_devices()
    #截图命令判断,电脑连接多个设备或使用IP截图时
    def adb_info(lines,filePath=None):    
        s=input("是否截图(T/F/N)?\n")
        if s=='t' or s=='T':
            if filePath==None:
                screencap_info(lines)
            else:
                screencap_info(lines,filePath)
        elif s=='N' or s=='n' or s=='exit':
            sys.exit()
        elif s=='F' or s=='f':
            devices=change_devices()
            if filePath==None:
                adb_info(devices)
            else:
                adb_info(devices,filePath)    
    #截图命令判断,电脑连接仅连接一个设备时  
    def adb_device_none(filePath=None):
        s=input("是否截图(T/F/N)?\n")
        if s=='t' or s=='T':
            if filePath==None:
                screencap_info()
            else:
                screencap_info(None,filePath)
        elif s=='N' or s=='n' or s=='exit':
            sys.exit()
        elif s=='F' or s=='f':
            devices=change_devices()
            if filePath==None:
                adb_info(devices)
            else:
                adb_info(devices,filePath)
    #使用设备判断
    def adb_devices(n,lines,filePath=None):
        if n==0:
            print("请检查是否已接连或启动调试模式或安装adb环境\n")
            s=input("再次启动(T/F)?\n")
            if s=='t' or s=='T':
                r=os.popen("adb devices")
                lines=r.readlines()
                lines=lines[1:-1]
                n=len(lines)
                adb_devices(n,r.readlines())
            else:
                sys.exit()
        elif ":5555" in lines:
            print("T:截图  F:更换设备 exit|N:退出\n")
            if filePath==None:
                adb_info(lines)
            else:
                adb_info(lines,filePath)   
        elif n==1:
            print("T:截图  F:更换设备  exit|N:退出\n")
            if filePath==None:
                adb_device_none()
            else:
                adb_device_none(filePath)    
        elif n>1:
            for i in lines:
                print(i.split("\t")[0])
            devices=input("请输入指定设备:\n")
            for i in lines:
                if devices in i:
                    print("T:截图  F:更换设备  exit|N:退出")
                    if filePath==None:
                        adb_info(devices)
                    else:
                        adb_info(devices,filePath)  
            print("未找到改设备请重新输入!")
            if filePath==None:
                adb_devices(n,lines)
            else:  
                adb_devices(n,lines,filePath)
    #截图
    def screencap_cmd(filePath,devices=None):
        if filePath==None:
            filePath='D:/png/'
        if not os.path.exists(filePath):
            os.makedirs(filePath)
        filename=time.strftime("%Y%m%d%H%M%S",time.localtime())+".png"
        if devices==None:
            cmd_screencap='adb shell screencap -p sdcard/'+filename
            cmd_pull='adb pull sdcard/'+filename+' '+filePath+filename
            cmd_delete='adb shell rm sdcard/'+filename
        else:
            cmd_screencap='adb -s '+devices+' shell screencap -p sdcard/'+filename
            cmd_pull='adb -s '+devices+' pull sdcard/'+filename+' '+filePath+filename
            cmd_delete='adb -s '+devices+' shell rm sdcard/'+filename
        a=os.system(cmd_screencap)
        if a==0:
            os.system(cmd_pull)
            os.system(cmd_delete)
        else:
            if ":5555" in devices:
                print("连接断开,请重新连接\n")
                ipPath=ip_info()
                if ipPath==None:
                    ipPath=ip_info()
                else:
                    device=ipPath+":5555"
                    adb_info(device,filePath)
            else:
                print("设备连接断开,请更换设备\n")
                device=change_devices()
                adb_info(device,filePath)
    if  __name__ == '__main__': 
        ipPath=ip_info()
        filePath=input("请输入保存地址:(不输入enter跳过,默认保存至D:\png\)\n")
        #查询当前连接的设备
        r=os.popen("adb devices")
        lines=r.readlines()
        lines=lines[1:-1]
        n=len(lines)
        ip_add=0
        if ipPath!=None:
            for i in lines:
                if ipPath in i:
                    ip_add=i.split("\t")[0]
        if len(filePath)>0:
            if ":\\" in filePath:
                if ip_add!=0:
                    adb_devices(n,ip_add,filePath)
                else:
                    adb_devices(n,lines,filePath)
            else:
                print("地址输入非法,使用默认地址\n")
                if ip_add!=0:
                    adb_devices(n,ip_add)
                else:
                    adb_devices(n,lines)
        else:
            if ip_add!=0:
                adb_devices(n,ip_add) 
            else:
                adb_devices(n,lines) 
    jsjbwy
    下一篇:没有了