通过Python实现控制手机详解
作者:初遇我ㄖ寸の热情呢? 发布时间:2021-04-21 12:10:37
几天前我在考虑使用 python 从 whatsapp 发送消息。和你们一样,我开始潜伏在互联网上寻找一些解决方案并找到了关于twilio. 一开始,是一个不错的解决方案,但它不是免费的,我必须购买一个 twilio 电话号码。此外,我无法在互联网上找到任何可用的 whatsapp API。所以我放弃了使用 twilio 和任何其他 whatsapp API 的想法。在想了很多之,打开 android studio,我连接了我的手机,然后开始了这个过程。当应用程序构建时,我想到了使用手机本身自动发送 whatsapp 消息的想法。我搜索了一些差不多的东西,发现了一些很有可能解决我的问题的东西。我找到了一个命令行工具,adb它可以帮助人们在不接触手机的情况下控制手机。
你应该拥有的东西
对 Python 的基本理解
一些空闲时间阅读此博客
安装
首先,转到此链接并在您的系统中下载 adb。
解压文件夹并将 adb 放入环境变量中。下面是在环境变量中添加 adb 的完整过程,
在您的手机中启用 USB 调试,并使用 USB 电缆将您的手机与 PC 连接。
通过打开 cmd 并键入,检查连接是否正确adb devices。您将在连接的设备列表中看到一个设备。
如果您可以看到您的设备,那么您可以打开任何代码编辑器。我正在使用 Visual Studio 代码。
开始
让我们首先导入一些我们需要的依赖项。您可以使用pip.
import cv2
import subprocess
我们将需要子进程通过命令行调用 adb 并获取输出,我们需要 cv2 进行一些图像处理,以便 python 能够点击屏幕或任何其他任务。
现在让我们在下面创建一个名为 adb 的基本函数,
def adb(command):
proc = subprocess.Popen(command.split(' '), stdout=subprocess.PIPE, shell=True)
(out, _) = proc.communicate()
return out.decode('utf-8')
上面的函数基本上是通过子进程调用 adb 并检索我们将需要的输出。
轻敲
现在让我们编写代码,其中 python 将单击移动设备的屏幕。所以我们将创建一个名为 tap 的函数,它会点击屏幕上的特定位置。
def tap(tap_x, tap_y):
adb("adb shell input tap {} {}".format(tap_x, tap_y))
tap(100,100)
这将单击距 x 100 像素和距 y 100 像素。现在您一定在想,为每个命令硬编码坐标是非常困难的,并且当设备改变时它不会工作,这就是为什么在本博客的下一节中我们将使用图像处理来检测坐标自动地。
截图
def take_screenshot(final):
adb(f"adb exec-out screencap -p > ./images/{final}.png")
代码很简单。我们制作了一个功能,可以保存手机内部图像目录的屏幕截图。在函数中,我们可以传递图像文件的名称。
高级点击
现在,我们将使用目标图像来自动检测坐标,而不是传递坐标。为了更好地理解这一点,让我们举个例子,我有这个屏幕 ,我想打开我们中间的应用程序,然后将使用一个称为. 通过这个过程,我们将截取屏幕截图 > 使用模板匹配计算我们中间图标的坐标 > 点击那里
TemplateMatching
ef image_position(small_image, big_image):
img_rgb = cv2.imread(big_image)
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread(small_image, 0)
height, width = template.shape[::]
res = cv2.matchTemplate(img_gray, template, cv2.TM_SQDIFF)
_, _, top_left, _ = cv2.minMaxLoc(res)
bottom_right = (top_left[0] + width, top_left[1] + height)
return (top_left[0]+bottom_right[0])//2, (top_left[1]+bottom_right[1])//2
screen="screen"
take_screenshot(screen)
x, y = image_position("images/among_us_icon.png", f"images/{screen}")
click(x,y)
# WOWWW Python successfully opened among us app.
有了上面的代码,即使你在手机屏幕上改变了我们游戏的位置,python仍然可以打开游戏。
我们还能做什么?
你可以用 adb 和 python 做更多的事情。让我们谈谈其中的一些。
滑动
def swipe(start_x, start_y, end_x, end_y, duration_ms):
adb("adb shell input swipe {} {} {} {} {}".format(start_x, start_y, end_x, end_y, duration_ms))
打电话给某人
def call(number):
adb(f"adb shell am start -a android.intent.action.CALL -d tel:{number}")
call('+91xxxxxxxxxx') # +[CODE][NUMBER]
从手机下载文件到电脑
在这里插入图片描述
def download(path, output_path):
adb(f"adb pull {path} {output_path}")
从手机中删除文件
def remove(path):
adb(f"adb shell rm {path}") #/sdcard/...
手机录屏
# name is the video_file name and time is the seconds you want to record
def screen_record(name, time):
adb(f"adb shell screenrecord /sdcard/{name} --time-limit {time}")
download(f"/sdcard/{name}",f"./mobile/{name}")
remove(f"/sdcard/{name}")
打开手机
def switch_phone_on_off():
adb("adb shell input keyevent 26")
还有更多类似 26 的关键事件。如果您想知道,请访问此链接。
打开网址
def open_url(url):
adb(f'adb shell am start -a android.intent.action.VIEW -d {url}')
open_url("https://www.google.co.in/")
发送 Whatsapp 消息
好的,所以我觉得这很酷。在获得了所有这些基本的理解之后,我们已经解决了我的主要问题,即发送没有二维码的 whatsapp 消息,没有像 twilio 这样的付费方法。这有点棘手,但它在我的手机上工作。我希望它也适用于你的。
def send_whatsapp_message(phone, message):
adb(f'adb shell am start -a android.intent.action.VIEW -d "https://api.whatsapp.com/send?phone={phone}"') # Opening whatsapp url
adb('ping 127.0.0.1 -n 2 > nul') # delay
adb(f'adb shell input text "{message}"') # entering message
adb('adb shell keyevent 22') # Right arrow
adb('adb shell keyevent 22') # Right arrow
adb('adb shell input keyevent 22') # Right arrow
adb('adb shell input keyevent 22') # Right arrow
adb('adb shell input keyevent 66') # Enter Key
send_whatsapp_message('+91xxxxxxxxxx', 'blah blah blah')
消息已发送!
来源:https://blog.csdn.net/qq_37615098/article/details/120615514


猜你喜欢
- 均方损失函数:这里 loss, x, y 的维度是一样的,可以是向量或者矩阵,i 是下标。很多的 loss 函数都有 size_averag
- 这篇文章主要介绍了Python实现序列化及csv文件读取,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 本文参考文章,出于学习目的,写本文。开发项目时,为了维护一些经常需要变更的数据,比如数据库的连接信息、请求的url、测试数据等,需要将这些数
- 昨天装了个SQL2000,打开企业管理器,发现SQL Server组下面没有任何的内容,提示“无项目”。之前sa设置的都是空密码就没碰到这个
- 一.axisaxis就是指定轴。三维数组可看作元素是二维数组的一维数组,二维数组可看作元素是一维数组的一维数组 。(这么理解就舒服了!)例:
- 本文实例讲述了Python 多线程,threading模块,创建子线程的两种方式。分享给大家供大家参考,具体如下:GIL(全局解释器锁)是C
- 本实例使用的mysql版本为mysql-8.0.15-winx641、下载zip包官网地址:https://dev.mysql.com/do
- 引言python的一个优势是有着大量自带和在线的模块(module)资源,可以提供丰富的功能,在使用这些模块的时候,如果每次都去网站找在线文
- 如下所示:dic = dict()dic['a'] = 1dic['b'] = 2dic['c
- 本文实例讲述了Python实现爬取亚马逊数据并打印出Excel文件操作。分享给大家供大家参考,具体如下:python大神们别喷,代码写的很粗
- 前言针对一些特殊的需求,在项目里,需要将响应式数据变为普通原始类型数据,这种情况是有的在Vue里,能够将普通数据类型的数据变为响应式数据,同
- 方法一:def printTheReverseArray(self): list_1 = [1, 2, 3, 4, 5, 6, 7] l
- python提供了大量的库,可以非常方便的进行各种操作,现在把python中实现读写csv文件的方法使用程序的方式呈现出来。在编写pytho
- 生成6位随机验证码的3种实现方式如下:1. 简单粗暴型:所有数字和字母都放入字符串;2. 利用ascii编码的规律,遍历获取字符串和数字的字
- 经常存在在我们的电脑中的垃圾文件主要是指系统在运行过程中产生的tmp临时文件、日志文件、临时备份文件等。垃圾清理器的作用其实也是对这些文件进
- 近几年来,nosql大行其道,json更是火的一塌糊涂,作为数据库的元老,mysql在5.7版本中添加了对json数据的支持。这片博客主要介
- 今天,老师带偶们复习了一下数据库中的分页,总体来说,今天感觉还不错,因为以前学的还没忘。好了,进入正题,首先,说说top的方法top方法其实
- 1、汇总统计介绍几个聚集函数有多少名学生SELECT COUNT(*) FROM student;SELECT COUNT(1) FROM
- 如下所示:def test1(): try: print('to do stuff')  
- 常见的几种分页方式:1.扶梯方式扶梯方式在导航上通常只提供上一页/下一页这两种模式,部分产品甚至不提供上一页功能,只提供一种“更多/more