在网上转了一圈关于苹果免越狱自动化的方案,无非都是调用wda实现的,需要签名等等一大堆复杂的流程。终于找到一家是通过硬件实现的,他们硬件提供的DLL方式接口。而IOSAutoTouch基于他们硬件接口又做了二次封装支持http和websocket调用并加入屏幕传输的功能让用户更简单的进行自动化操作苹果手机。前两天买的硬件到货了,激动的立马动手写了一个简单的例子。这个例子就是自动打开低电量模式

他们是通过这玩意控制手机的

首先导入IOSAutoTouch封装的python调用库,和安装aircv库(这个是OpenCV库的一个封装)

aircv 安装方法 pip install aircv

IOSAutoTouch库需要从他们官网下载

初始化IAT库

# 初始化IAT库,填写内核服务的ip,本机填写127.0.0.1采用http协议进行交互
iatapi = ios_at_api.HttpApi('192.168.0.113')  

调用IAT库发送快捷按钮返回主屏幕

# 发送返回主屏幕热键,deviceid参数是设备id
# 如果不知道设备id可以用这条命令打印出所有的设备id print(iatapi.get_device_list())
iatapi.send_key(deviceid=devid, key='', fn_key='WIN+h')  

通过aircv库查找设置按钮的位置,并调用IAT库的点击指定坐标的接口

imobj = imread('./img/设置按钮.bmp')
acret = ac.find_template(screenshot(devid), imobj, 0.8)
if acret is None:print("没有找到子图")exit()
print(acret)
print("查找设置按钮子图成功{}".format(acret['result']))
x = int(acret['result'][0])
y = int(acret['result'][1])
iatapi.click(deviceid=devid, x=x, y=y)  # 点击找到的坐标

滑动找到设置里的电池图标并点击

for i in range(3):  # 往下滑动3次,保证到设置界面的最开始iatapi.swipe(deviceid=devid, direction='down', length=0.8, afor=6)
time.sleep(1) # 延时1秒钟
for i in range(3):  # 往上滑动3次iatapi.swipe(deviceid=devid, direction='up', length=0.7, afor=10)time.sleep(0.2)  # 延时一下,避免滑动太快滑过了
time.sleep(1)  # 延时1秒钟
imobj = imread('./img/电池图标.bmp')
acret = ac.find_template(screenshot(devid), imobj, 0.8)
if acret is None:print("没有找到子图")exit()
print(acret)
print("查找电池图标子图成功{}".format(acret['result']))
x = int(acret['result'][0])
y = int(acret['result'][1])
iatapi.click(deviceid=devid, x=x, y=y)  # 点击找到的坐标

点击打开低电量图标

imobj = imread('./img/打开低电量模式.bmp')
acret = ac.find_template(screenshot(devid), imobj, 0.8)
if acret is None:print("没有找到子图")exit()
print(acret)
print("查找打开低电量模式子图成功{}".format(acret['result']))
x = int(acret['result'][0])
y = int(acret['result'][1])
iatapi.click(deviceid=devid, x=x, y=y)  # 点击找到的坐标

到此就全部完毕了,非常简单

下面是完整的代码:

import base64
import gzip
import io
import time
import ios_at_api  # 导入ios_at_api模块
import aircv as ac
import cv2
import numpy as npiatapi = ios_at_api.HttpApi('192.168.0.113')  # 初始化IAT库,采用http协议进行交互# 将base64字符串转换成cv2图片对象
def base64_to_bmp(data: dict):image_base64 = data['data']['img']is_gzip = data['data']['gzip']imgdata = base64.b64decode(image_base64)if is_gzip:with gzip.GzipFile(fileobj=io.BytesIO(imgdata)) as f:imgdata = f.read()image = np.asarray(bytearray(imgdata), dtype="uint8")im = cv2.imdecode(image, cv2.IMREAD_ANYCOLOR)if im is None:raise RuntimeError("读取图片流错误")return im# 将本地图片转换成cv2图片对象
def imread(filename):im = cv2.imread(filename)if im is None:raise RuntimeError("file: '%s' not exists" % filename)return imdef screenshot(deviceid):image_data = iatapi.get_device_screenshot(deviceid=devid, gzip=False)if image_data['status'] > 0:print('截屏调用失败,原因:{}'.format(image_data['message']))return Noneelse:print('截屏调用成功')return base64_to_bmp(image_data)if __name__ == "__main__":  # 主程序入口# 如果不知道设备id可以用这条命令打印出所有的设备id print(iatapi.get_device_list())devid = '5C:1D:D9:ED:D9:DE'  # 要操作的设备idfor i in range(3):  # 连续发送3次保证到达主屏幕iatapi.send_key(deviceid=devid, key='', fn_key='WIN+h')  # 发送返回主屏幕热键time.sleep(0.5)  # 延时一下,不然会变成APP切换器imobj = imread('./img/设置按钮.bmp')acret = ac.find_template(screenshot(devid), imobj, 0.8)if acret is None:print("没有找到子图")exit()print(acret)print("查找设置按钮子图成功{}".format(acret['result']))x = int(acret['result'][0])y = int(acret['result'][1])iatapi.click(deviceid=devid, x=x, y=y)  # 点击找到的坐标time.sleep(1)  # 延时1秒钟for i in range(3):  # 往下滑动3次,保证到设置界面的最开始iatapi.swipe(deviceid=devid, direction='down', length=0.8, afor=6)time.sleep(1) # 延时1秒钟for i in range(3):  # 往上滑动3次iatapi.swipe(deviceid=devid, direction='up', length=0.7, afor=10)time.sleep(0.2)  # 延时一下,避免滑动太快滑过了time.sleep(1)  # 延时1秒钟imobj = imread('./img/电池图标.bmp')acret = ac.find_template(screenshot(devid), imobj, 0.8)if acret is None:print("没有找到子图")exit()print(acret)print("查找电池图标子图成功{}".format(acret['result']))x = int(acret['result'][0])y = int(acret['result'][1])iatapi.click(deviceid=devid, x=x, y=y)  # 点击找到的坐标time.sleep(1)  # 延时1秒钟imobj = imread('./img/关闭低电量模式.bmp')acret = ac.find_template(screenshot(devid), imobj, 0.8)if not acret is None:print("已经是低电量模式,无需打开")exit()imobj = imread('./img/打开低电量模式.bmp')acret = ac.find_template(screenshot(devid), imobj, 0.8)if acret is None:print("没有找到子图")exit()print(acret)print("查找打开低电量模式子图成功{}".format(acret['result']))x = int(acret['result'][0])y = int(acret['result'][1])iatapi.click(deviceid=devid, x=x, y=y)  # 点击找到的坐标

python调用OpenCV和IOSAutoTouch实现硬件级免越狱自动化相关推荐

  1. python调用opencv代码_Python调用OpenCV实现图像平滑代码实例

    主要讲解Python调用OpenCV实现图像平滑,包括四个算法:均值滤波.方框滤波.高斯滤波和中值滤波. 给图像增加噪声: import cv2 import numpy as np def test ...

  2. Python调用OpenCV实现图像平滑处理

    1 前言 上一节,我们介绍了C++调用OpenCV接口,如何实现对图像的平滑处理,本节我们介绍一下在Python环境下调用OPenCV接口,如何对图像进行平滑模糊处理.接下来我们依次介绍均值滤波器.中 ...

  3. 使用Python调用opencv学习(-)打开图片,显示图片

    使用Python调用opencv学习(-)打开图片,显示图片 第一步是读取图片是用cv2.imread 第一个参数是图片的路径可以是绝对路径也可以是相对路径.第二个参数代表读取图片的格式 cv2.IM ...

  4. python调用opencv处理视频_Python调用OpenCV读写视频

    最近因为经常对视频进行操作,所以记录下Python用opencv来读写视频的方法. 一.opencv读视频 python调用opencv来读视频比较简单,可以直接调用cv2.VideoCapture来 ...

  5. Python调用OpenCV接口播放本地视频文件、本地和网络摄像头

    1 前言 上篇文章介绍了在WIN10系统上, C++调用OpenCV接口,播放本地视频文件.本地和网络摄像头视频.本篇我们来看一下,Python如何调用OpenCV接口,做同样的事情. 序号 视频来源 ...

  6. c#和Python交互,完美解决Python调用OpenCV等第三方库以及分发时需配置python环境的问题

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.问题分析 二.解决方案 第一个问题 第二个问题 三.结果及源码 四.总结 前言 关于C#如何调用Python,网上 ...

  7. python调用opencv的速度_OpenCV-Python系列之OpenCV性能衡量与优化方法

    本次教程我们谈及OpenCV的性能衡量与优化,众所周知,算法的不断的革新其最重要的一点就是不断的优化再优化,比如我们的后面要讲到的边缘检测的算法,又或者是图像分割的算法,他们都是随着时间的一步一步的推 ...

  8. 在Ubuntu下用C/C++(或python)调用opencv库编程显示一张图片并在上面加文字

    一.实验内容 调用opencv库编程显示一张图片,并打开一个名为"logo.txt"的文本文件(其中只有一行文本文件,包括你自己的名字和学号),按照名字和学号去读取汉字24*24点 ...

  9. Python调用OpenCV的目标跟踪算法(csrt、kcf、boosting、mil、tld、medianflow、mosse)

    https://www.pyimagesearch.com/2018/07/30/opencv-object-tracking/ 不加参数调用本地摄像头,否则追踪视频中的框选物体 s,然后鼠标框选,来 ...

最新文章

  1. 英特尔变身数据公司 未来最大数据市场定是中国
  2. debian 使用 systemctl 且自启frp
  3. Winform中使用NPOI导出Excel时XSSFWorkbook wb = new XSSFWorkbook()报错
  4. 1071. Speech Patterns (25)
  5. leetcode 62, 63, 980. Unique Paths I, II, III | 62, 63, 980. 不同路径 I, II, III(暴力递归->傻缓存->动态规划)
  6. Shell脚本监控专线Network并SendEmail报警
  7. Ackermann函数的递归求值
  8. 集合Collection总览
  9. 因文件包含病毒或潜在的垃圾软件导致被防火墙拦截的解决方法
  10. Win10相机打不开提示:我们找不到你的相机 错误代码0xa00f4244!
  11. Idea之配置GitLab ssh key
  12. netbeans php 发布,Apache NetBeans 12.0 LTS 发布
  13. Dzz任务板初版完成笔记-仿trello私有部署的一款轻量团队任务协作工具。
  14. 用计算机探索商的变化规律教案,用计算器探索规律教学设计与反思(精选5篇)...
  15. it行业 平均年龄_IT行业一线员工现状调查报告
  16. 一文看透 Kotlin 协程本质
  17. 技术杂谈-再谈软硬SDN(1)
  18. 2019 Multi-University Training Contest 7 部分补题
  19. pads-logic
  20. 喝脱脂牛奶容易长青春痘

热门文章

  1. 简短加密_神经网络训练中回调的简短实用指南
  2. C++ 实现太阳系行星系统
  3. vue z-index层级显示问题
  4. 高效生成6位数字验证码代码
  5. 无法安装驱动程序 此计算机上不存在英特尔适配器,win10系统提示无法安装驱动程序,此计算机中没有Intel适配器怎么办...
  6. SHA-256、HMAC-SHA256加密算法工具类
  7. 威廉·欧奈尔:为何我的A股账户只持有一只股票?(建议收藏)
  8. 原生js实现上拉加载
  9. MySQL忘记root密码解决方案
  10. 《中国高血压防治指南2010》学习笔记-完成