网络编程
位置:首页>> 网络编程>> Python编程>> python编写adb截图工具的实现源码

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

作者:mengyuelby  发布时间:2021-03-24 08:50:15 

标签:python,adb,截图工具

一、 功能

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

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

二、使用说明

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)

来源:https://blog.csdn.net/mengyuelby/article/details/119780371

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com