教你用python控制安卓手机


Posted in Python onMay 13, 2021

一、介绍

ADB(Android调试桥)是一个命令行工具(CLI),可用于控制Android设备并与之通信。您可以执行许多操作,例如安装应用程序,调试应用程序,查找隐藏的功能并使用外壳程序直接与设备连接。要启用ADB,您的设备必须首先解锁开发者选项并启用USB调试。要解锁开发人员选项,您可以转到设备设置,然后向下滚动到“关于”部分,找到设备上当前软件的内部版本号。单击内部版本号 7次,将启用开发人员选项。然后,您可以转到设置中的“开发人员选项”面板,然后从那里启用USB调试。现在,您唯一需要做的另一件事就是将设备连接到计算机的USB电缆。

这是今天的旅程:

1.安装要求

2.入门

3.编写脚本的基础

4.创建自拍计时器创

5.建定义搜索器

二、安装要求

我们需要安装的两件事中的第一件事是计算机上的ADB工具。它会自动与Android Studio捆绑在一起,因此,如果您已经拥有了,那就不用担心了。否则,您可以转到[官方文档](https://developer.android.com/studio/command-line/adb),并且在页面顶部应有有关如何安装它的说明。

安装ADB工具后,您需要获取python库,我们将使用该库与ADB和我们的设备进行接口。您可以使用pip install pure-python-adb安装pure-python-adb库。

可选:为使我们在开发脚本时更轻松,我们可以安装一个名为scrcpy的开源程序,该程序允许我们使用鼠标和键盘在我们的计算机上显示和控制我们的android设备。要安装它,您可以转到[Github repo](https://github.com/Genymobile/scrcpy)并下载适用于您的操作系统(Windows,macOS或Linux)的正确版本。如果您使用的是Windows,则将zip文件解压缩到一个目录中,然后将此目录添加到您的路径中。这样一来,我们只需在终端窗口中键入scrcpy即可从系统上的任何位置访问该程序。

三、入门

现在已经安装了所有依赖项,我们可以启动ADB并连接设备。首先,使用USB电缆将设备连接到PC,如果启用了USB调试,则会弹出一条消息,询问PC是否可以控制设备,只需回答是。然后在您的PC上,打开一个终端窗口,并通过键入adb start-server来启动ADB服务器。这应该打印出以下消息:

  • daemon not running; starting now at tcp:5037
  • daemon started successfully

如果您还安装了scrcpy,则可以通过在终端中键入**scrcpy来启动它。但是,这仅在将其添加到路径时才有效,否则可以通过将终端目录更改为安装scrcpy的目录并键入scrcpy.exe**来打开可执行文件。希望一切顺利,您应该能够在PC上看到您的设备,并能够使用鼠标和键盘对其进行控制。

现在,我们可以创建一个新的python文件,并检查是否可以使用该库找到连接的设备:

rom ppadb.client import Client as AdbClient

if __name__ == '__main__':
    client = AdbClient(host="127.0.0.1", port=5037) # Default is "127.0.0.1" and 5037

    devices = client.devices()

    if len(devices) == 0:
        print('No devices')
        quit()

    device = devices[0]

    print(f'Connected to {device}')

在这里,我们导入AdbClient类并使用它创建一个客户端对象。然后,我们可以获得连接的设备的列表。最后,我们从列表中获得第一台设备(如果仅连接了一个设备,则通常是唯一的设备)。

四、编写脚本的基础

我们要与设备连接的主要方式是使用外壳,通过这种方式,我们可以发送命令以模拟特定位置的触摸或从A滑动到B。要模拟屏幕触摸(轻击),我们首先需要工作了解屏幕坐标的工作方式。为了帮助解决这些问题,我们可以在开发人员选项中激活指针位置设置。激活后,无论您在屏幕上的何处触摸,都可以看到该点的坐标显示在顶部。坐标系的工作方式如下:

教你用python控制安卓手机

该图显示了坐标系的工作方式

显示屏的左上角分别具有* x y 坐标(0,0),并且右下角的坐标是 x y *的最大可能值。

现在我们知道了坐标系的工作原理,我们需要检查一下可以运行的不同命令。我在下面列出了命令列表以及如何使用它们,以供快速参考:

Input tap x y
Input text “hello world!”
Input keyevent eventID
Here is a list of some common eventID's:
3: home button
4: back button
5: call
6: end call
24: volume up
25: volume down
26: turn device on or off
27: open camera
64: open browser
66: enter
67: backspace
207: contacts
220: brightness down
221: brightness up
277: cut
278: copy
279: paste

如果您想找到更多,请在这里找到一长串清单。https://forum.xda-developers.com/t/q-adb-input-keyevent-for-long-press-on-power- button.2063741 / post-64890206。

五、创建自拍计时器

现在我们知道我们能做什么,让我们开始吧。在第一个示例中,我将向您展示如何创建一个快速的自拍计时器。首先,我们需要导入我们的库并创建一个connect函数以连接到我们的设备:

import time

from ppadb.client import Client as AdbClient

def connect():
    client = AdbClient(host="127.0.0.1", port=5037) # Default is "127.0.0.1" and 5037

    devices = client.devices()

    if len(devices) == 0:
        print('No devices')
        quit()

    device = devices[0]

    print(f'Connected to {device}')

    return device, client

您可以看到connect函数与前面的如何连接到设备的示例相同,除了这里我们返回设备和客户端对象以供以后使用。

if __name__ == '__main__':
    device, client = connect()

    # open up camera app
    device.shell('input keyevent 27')

    # wait 5 seconds
    time.sleep(5)

    # take a photo with volume up
    device.shell('input keyevent 24')
    print('Taken a photo!')

在我们的主代码中,我们可以调用connect函数来检索设备和客户端对象。从那里我们可以打开相机应用程序,等待5秒钟并拍照。真的就是这么简单!正如我之前说过的,这只是复制您通常会做的事情,因此,如果您首先手动进行操作并写下步骤,则思考如何做事情是最好的。

六、创建定义搜索器

现在,我们可以做一些更复杂的事情,那就是要求浏览器找到特定单词的定义,并截图以将其保存在我们的计算机上。

该程序的基本流程如下:

1.打开浏览器

2.单击搜索栏

3.输入搜索查询

4.等待几秒钟

5.截图并保存

但是,在我们开始之前,您需要在默认浏览器中找到搜索栏的坐标,您可以使用我之前建议的方法轻松地找到它们。对我来说,他们是(440,200)。

首先,我们将必须导入与以前相同的库,并且我们还将具有相同的connect方法。

import time

from ppadb.client import Client as AdbClient

def connect():
    client = AdbClient(host="127.0.0.1", port=5037) # Default is "127.0.0.1" and 5037

    devices = client.devices()

    if len(devices) == 0:
        print('No devices')
        quit()

    device = devices[0]

    print(f'Connected to {device}')

    return device, client

在我们的主要函数中,我们可以调用connect函数,并为我们的搜索栏的* x y *坐标分配一个变量。注意这是一个字符串,而不是列表或元组,这样我们可以轻松地将坐标合并到我们的shell命令中。我们还可以从用户那里获取输入信息,以查看他们想要获取哪个单词的定义:

if __name__ == '__main__':
    device, client = connect()

    search_bar = '440 200' # x y

    query = input('What word do you want to find the definition of: ')
    search_query = f'what is the definition of {query}'

我们会将查询添加到完整的句子中,然后对其进行搜索,这样我们就可以始终获取定义。之后,我们可以打开浏览器,然后将搜索查询输入到搜索栏中,如下所示:

device.shell('input keyevent 64')

time.sleep(0.25) # wait for browser to load

device.shell(f'input tap {search_bar}')

device.shell(f'input text "{search_query}"') # make sure you have the quotation marks around your text
device.shell('input keyevent 66')

time.sleep(3) # wait for results to load

在这里,我们使用eventID 66模拟输入键的按下以执行搜索。如果需要,可以根据需要更改等待时间。

最后,我们将在设备对象上使用screencap方法获取屏幕截图,然后可以将其另存为* .png *文件:

screenshot = device.screencap()

with open('result.png', 'wb') as f: # save the screenshot as result.png
    f.write(screenshot)
    print('Saved screenshot!')

在这里,我们必须以写字节模式打开文件,因为screencap方法返回表示图像的字节。

如果一切都按计划进行,则应该有一个快速脚本来搜索特定单词。这在我的手机上正常工作:

教你用python控制安卓手机

七、最后的想法

希望您今天学到了一些新知识,在我对此进行研究之前,我个人甚至都不知道这是一回事。很酷的事情是,您可以执行平常可以做的任何事情,而且还可以做更多的事,因为它只是模拟您自己的触摸和动作!

希望您喜欢这篇文章,并感谢您的阅读! ?

到此这篇关于教你用python控制安卓手机的文章就介绍到这了,更多相关用python控制手机内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python备份文件以及mysql数据库的脚本代码
Jun 10 Python
python中的内置函数getattr()介绍及示例
Jul 20 Python
解析Python中的二进制位运算符
May 13 Python
Python的迭代器和生成器
Jul 29 Python
详解python while 函数及while和for的区别
Sep 07 Python
pandas 根据列的值选取所有行的示例
Nov 07 Python
Python多图片合并PDF的方法
Jan 03 Python
Python常用特殊方法实例总结
Mar 22 Python
Python中Flask-RESTful编写API接口(小白入门)
Dec 11 Python
使用python快速实现不同机器间文件夹共享方式
Dec 22 Python
Python常用库Numpy进行矩阵运算详解
Jul 21 Python
python如何利用Mitmproxy抓包
Oct 10 Python
Python数据分析入门之数据读取与存储
May 13 #Python
python执行js代码的方法
pytorch加载预训练模型与自己模型不匹配的解决方案
May 13 #Python
Python数据分析入门之教你怎么搭建环境
Pytorch 统计模型参数量的操作 param.numel()
May 13 #Python
Python机器学习算法之决策树算法的实现与优缺点
Python爬虫基础之爬虫的分类知识总结
You might like
php实现mysql同步的实现方法
2009/10/21 PHP
php查看请求头信息获取远程图片大小的方法分享
2013/12/25 PHP
Prototype的Class.create函数解析
2011/09/22 Javascript
关于Javascript与iframe的那些事儿
2013/07/04 Javascript
将input file的选择的文件清空的两种解决方案
2013/10/21 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
2014/06/26 Javascript
javascript定义变量时带var与不带var的区别分析
2015/01/12 Javascript
jQuery validate+artdialog+jquery form实现弹出表单思路详解
2016/04/18 Javascript
使用JavaScript实现弹出层效果的简单实例
2016/05/31 Javascript
js动态获取子复选项并设计全选及提交的实现方法
2016/06/24 Javascript
关于在Servelet中如何获取当前时间的操作方法
2016/06/28 Javascript
详解jquery easyui之datagrid使用参考
2016/12/05 Javascript
基于JavaScript实现全选、不选和反选效果
2017/02/15 Javascript
微信小程序之页面跳转和参数传递的实现
2017/09/29 Javascript
开发Vue树形组件的示例代码
2017/12/21 Javascript
微信公众号获取用户地理位置并列出附近的门店的示例代码
2019/07/25 Javascript
原生javascript如何实现共享onload事件
2020/07/03 Javascript
Python中的赋值、浅拷贝、深拷贝介绍
2015/03/09 Python
Python中使用bidict模块双向字典结构的奇技淫巧
2016/07/12 Python
Django中利用filter与simple_tag为前端自定义函数的实现方法
2017/06/15 Python
在PyCharm环境中使用Jupyter Notebook的两种方法总结
2018/05/24 Python
Numpy 改变数组维度的几种方法小结
2018/08/02 Python
pymysql的简单封装代码实例
2020/01/08 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
2020/03/30 Python
python 多进程和协程配合使用写入数据
2020/10/30 Python
日本乐天官方海外转运服务:Rakuten Global Express
2018/11/30 全球购物
如何做好总经理助理
2013/11/12 职场文书
致800米运动员广播稿
2014/02/16 职场文书
家长会学生演讲稿
2014/04/26 职场文书
篮球比赛策划方案
2014/06/05 职场文书
学校读书活动总结
2014/06/30 职场文书
我的中国梦演讲稿初中篇
2014/08/19 职场文书
芙蓉镇观后感
2015/06/10 职场文书
初中团委工作总结
2015/08/13 职场文书
MySQL官方导出工具mysqlpump的使用
2021/05/21 MySQL
Vue中Object.assign清空数据报错的解决方案
2022/03/03 Vue.js