python编写adb截图工具

python编写adb截图/录屏工具


一、 功能

Android端或者Android终端的远程截图/录屏下载至本地电脑
在这里插入图片描述

二、使用说明

1.adb截图/录屏工具可用于Android手机及Android终端
2.使用数据线连接前提:Android终端/手机已打开开发者模式
3.生成的图片格式为png,录制的视频为mp4格式
4.快捷键截图录屏
5.截图支持双屏截图
6.录屏不支持双屏录屏,仅可录制主屏或者单屏

三、实现

from pynput.keyboard import Key, Controller, Listener
import time
import os,sys
import subprocess

class screencap_info:
    def __init__(self):
        self.ipPath=self.ip_info()
        self.localpath=self.Local_file()
        self.record_key = []
        self.file_name = 0
        self.start_listen()

    def on_press(self,key):
        try:
            self.record_key.append("{}".format(key.char))
        except:
            self.record_key.append("{}".format(key))

    # 键盘处理
    def on_release(self,key):
        try:
            # print(self.record_key)
            if 'Key.alt_l' in self.record_key:
                if 'z' in self.record_key:
                    print("主屏截图")
                    self.screencap_cmd(self.ipPath, self.localpath)
                    self.record_key.clear()
                elif 'f' in  self.record_key:
                    print("副屏截图")
                    self.screencap_fit_cmd(self.ipPath, self.localpath)
                    self.record_key.clear()
                elif 'a' in self.record_key:
                    print("录屏开始")
                    self.file_name=self.transcribe_start(self.ipPath)
                    self.record_key.clear()
                elif 's' in self.record_key:
                    # print(self.file_name)
                    if self.file_name==0:
                        print("请先开始录屏在结束")
                        self.record_key.clear()
                    else:
                        print("录屏结束")
                        self.transcribe_stop(self.ipPath,self.localpath,self.file_name)
                        self.file_name=0
                        self.record_key.clear()
            if 'Key.ctrl_l' in self.record_key:
                if 'None' in self.record_key:
                    self.ipPath=self.ip_info()
                    self.record_key.clear()
            try:
                self.record_key.remove("{}".format(key.char))
            except:
                self.record_key.remove("{}".format(key))
        except:
            pass
            # return False
        if key == Key.esc:
            return False


    def start_listen(self):
            with Listener(on_press=self.on_press,
                          on_release=self.on_release) as listener:
                listener.join()

    # 输入IP
    def ip_info(self):
        ipPath = input("请输入IP:\n")
        if len(ipPath) > 0:
            try:
                cnd = 'adb connect ' + ipPath
                r = os.popen(cnd)
                lines = r.readlines()[0]
                print(lines)
                if 'unable' in lines:
                    print("连接失败\n")
                    return self.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 self.ip_info()

    def Local_file(self):
        filePath = input("请输入保存地址:(不输入enter跳过,默认保存至D:\png\)\n")
        if filePath == None or filePath == '':
            filePath = 'D:/png/'
        if not os.path.exists(filePath):
            os.makedirs(filePath)
        print("快捷键alt+a:开始录屏 alt+s:停止录屏(超过180s自动停止录屏)\n"
              "alt+z 主屏截图  alt+f 副屏截图 ctrl+数字键 更换设备\n")
        return filePath


    def screencap_cmd(self,ipfile,localfile):
        devices=str(ipfile)+":5555"
        filename = time.strftime("%Y%m%d%H%M%S", time.localtime()) + ".png"
        cmd_screencap = 'adb -s ' + devices + ' shell screencap -p sdcard/' + filename
        cmd_pull = 'adb -s ' + devices + ' pull sdcard/' + filename + ' ' + localfile + 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")
                ipfile=self.ip_info()
                return self.screencap_cmd(ipfile,localfile)
    def screencap_fit_cmd(self,ipfile,localfile):
        devices = str(ipfile) + ":5555"
        filename = time.strftime("%Y%m%d%H%M%S", time.localtime())+'副屏' + ".png"
        cmd_screencap = 'adb -s ' + devices + ' shell screencap -d 1 -p sdcard/' + filename
        cmd_pull = 'adb -s ' + devices + ' pull sdcard/' + filename + ' ' + localfile + 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")
                ipfile = self.ip_info()
                return self.screencap_cmd(ipfile, localfile)
    def transcribe_start(self,ipfile):
        devices = str(ipfile) + ":5555"
        filename = time.strftime("%Y%m%d%H%M%S", time.localtime()) + ".mp4"
        cmd_screencap = 'adb -s ' + devices + ' shell screenrecord sdcard/' + filename
        try:
            self.p = subprocess.Popen(cmd_screencap)
            return filename
        except:
            print("连接断开,请重新连接\n")
            ipfile = self.ip_info()
            return self.transcribe_start(ipfile)
    def transcribe_stop(self,ipfile,localfile,filename):
        devices = str(ipfile) + ":5555"
        self.p.kill()
        cmd_pull = 'adb -s ' + devices + ' pull sdcard/' + filename + ' ' + localfile + filename
        cmd_delete = 'adb -s ' + devices + ' shell rm sdcard/' + filename
        try:
            os.system(cmd_pull)
            os.system(cmd_delete)
        except:
            print("连接断开,请重新连接\n")
            ipfile = self.ip_info()
            return self.transcribe_stop(ipfile,localfile,filename)

if __name__ == '__main__':
    screencap_info()



ps:初学Python,代码有任何疑问/错误/优化,欢迎沟通交流,后续有新的优化会持续更新
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值