新闻动态

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

发布日期:2022-02-07 16:45 | 文章来源:源码中国

一、 功能

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) 

到此这篇关于python编写adb截图工具的文章就介绍到这了,更多相关python adb截图工具内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

香港服务器租用

版权声明:本站文章来源标注为YINGSOO的内容版权均为本站所有,欢迎引用、转载,请保持原文完整并注明来源及原文链接。禁止复制或仿造本网站,禁止在非www.yingsoo.com所属的服务器上建立镜像,否则将依法追究法律责任。本站部分内容来源于网友推荐、互联网收集整理而来,仅供学习参考,不代表本站立场,如有内容涉嫌侵权,请联系alex-e#qq.com处理。

相关文章

实时开通

自选配置、实时开通

免备案

全球线路精选!

全天候客户服务

7x24全年不间断在线

专属顾问服务

1对1客户咨询顾问

在线
客服

在线客服:7*24小时在线

客服
热线

400-630-3752
7*24小时客服服务热线

关注
微信

关注官方微信
顶部