教你用python控制安卓手机
作者:有理想的coder 发布时间:2023-11-10 10:13:39
一、介绍
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。要模拟屏幕触摸(轻击),我们首先需要工作了解屏幕坐标的工作方式。为了帮助解决这些问题,我们可以在开发人员选项中激活指针位置设置。激活后,无论您在屏幕上的何处触摸,都可以看到该点的坐标显示在顶部。坐标系的工作方式如下:
该图显示了坐标系的工作方式
显示屏的左上角分别具有* 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方法返回表示图像的字节。
如果一切都按计划进行,则应该有一个快速脚本来搜索特定单词。这在我的手机上正常工作:
七、最后的想法
希望您今天学到了一些新知识,在我对此进行研究之前,我个人甚至都不知道这是一回事。很酷的事情是,您可以执行平常可以做的任何事情,而且还可以做更多的事,因为它只是模拟您自己的触摸和动作!
希望您喜欢这篇文章,并感谢您的阅读! 💖
来源:https://blog.csdn.net/huangmingleiluo/article/details/116651679


猜你喜欢
- 本文实例讲述了vue使用@scroll监听滚动事件时,@scroll无效问题的解决方法。分享给大家供大家参考,具体如下:在网上看了一下vue
- 最近一直跟着廖大在学Python,关于分布式进程的小例子挺有趣的,这里做个记录。分布式进程Python的multiprocessing模块不
- MySQL Index索引是一种数据结构,可以是B-tree、R-tree、或者hash结构。其中,B-tree适用于查找某范围内的数据,可
- 1.如果客户端和服务器端的连接需要跨越并通过不可信任的网络,那么就需要使用SSH隧道来加密该连接的通信。2.用set password语句来
- 用法:DataFrame.drop(labels=None,axis=0, index=None, columns=None, inplac
- 1. OS标准库简介顾名思义,OS表示Operating System,即操作系统。OS标准库是一个操作系统接口模块,提供一些方便使用操作系
- 问题描述我在用Keras的Embedding层做nlp相关的实现时,发现了一个神奇的问题,先上代码:a = Input(shape=[15]
- 1 创建目录以及判断是否存在,如果不存在则创建import os# 创建的目录path = "yyy"if not os
- 最近想实现PHP实现短信验证的效果,做PC网站的时候,可以通过注册用户需要使用短信验证的功能,或者找回密码,以及验证用户的信息等等功能,发现
- 开发工具:Microsoft Visual Studio 2005 数据库:Microsoft SQL Server 2005 说明:这里建
- 任务说明:编写一个钱币定位系统,其不仅能够检测出输入图像中各个钱币的边缘,同时,还能给出各个钱币的圆心坐标与半径。效果代码实现Canny边缘
- 没有使用动态语句直接报错 错误的 代码如下:alter proc testpapers as begin declare @tems nva
- 今天发现百度图片搜索结果的2级页面改版了,在浏览图片的时候很好用:如图:在浏览图片的时候,右侧的缩略图是这样交互的:因此,在整个浏览图片的过
- 本文中,我将尝试展示用Docker开发python应用(主要是Web应用)的可行方法。虽然我本人专注于Python的Flask微框架,但本文
- 本文实例讲述了python中urllib模块用法。分享给大家供大家参考。具体分析如下:一、问题:近期公司项目的需求是根据客户提供的api,我
- 1. 集合 set 简介集合的最大特征是其每个元素都是唯一的,它可以删除、可以增加、也可以通过增删实现替换元素,但是它是没有下标的,你无法通
- 我就废话不多说了,大家还是直接看代码吧~func ReadLine(fileName string) ([]string,error){f,
- Tools -> Build System -> Build New System{ "cmd": [&qu
- 本文实例讲述了Python正则表达式分组概念与用法。分享给大家供大家参考,具体如下:正则表达式分组分组就是用一对圆括号“()”括起来的正则表
- 数组的组合主要有:1.水平组合:np.hstack(arr1,arr2) 或 concatenate(arr1,arr2,axis=1)2.