由于iphone的系统的封闭性和安全性,同时长时间运行的稳定性。所以越来越多的人使用iphone作为自己的随身工具,ios系统作为世界上流行的手机系统,所以很多公司会在iPhone上开发、测试APP,而测试是一个反复繁琐的工作,所以想到自动化完成工作较好,且都需要一个可以同时控制iphone,还可以跑脚本的产品出现,鉴于iphone较强的安全性,也导致了这个产品会比较难。WDA出现了。它WebDriverAgent简称WDA。它是由Facebook推出的一款移动端测试框架。它是在iOS客户端实现了一个WebDriver的Server,借助这个server,我们可以远程控制iOS设备进行测试。它更多的是测试人员进行自动化测试用的
后来阿里巴巴,有在其基础上整合出tidevice框架,就能在windows上轻松控制苹果手机了。
WebDriverAgent下载链接 https://github.com/openatx/facebook-wda
里面有详细的api
下面是一些简单的api
c = wda.Client('http://localhost:8100')
c.status()#获得手机状态
c.home()#回到手机首页
c.locked() # true of false
c.lock() # lock screen
c.unlock() # unlock
c.app_current() # 当前打开的APP
c.session().app_activate("com.apple.Health")#启动对应的APP
s.click(200, 200)#点击坐标(200,200)
s.click(0.5, 0.5) # 点击屏幕中心点
但是。开发出来的东西要签名,而且不一定每个手机都支持。后来又出现第三方库iMouse,使用又更简单了。请看:
下面是一些简单的api,是python代码:
api = iMouse_api.HttpApi("127.0.0.1") #初始化库
api.find_image(手机mac, 图片) #找图
api.ocr(手机mac, 区域) #文字识别
api.click(手机mac, x,y) #点击
api.mouse_movie(手机mac, x,y) #鼠标移动
api.send_key(手机mac, "", "ENTER") #按下回车键
api.send_key(手机mac, "dgfasdf23324", "") #发送字符串
api.send_text(手机mac, "发送中文", "CTRL+ALT+SHIFT+WIN+v")
api.send_key(手机mac, '', 'FN+h') #返回主界面
本人写的薅羊毛DEMO:
# coding:utf-8 # This is a sample Python script. # Press Shift+F10 to execute it or replace it with your code. # Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings. import random import threading import time import re # 导入包 import iMouse_api api = iMouse_api.HttpApi("127.0.0.1") def print_hi(name): # Use a breakpoint in the code line below to debug your script. print(f'Hi, {name}') # Press Ctrl+F8 to toggle the breakpoint. def findimage(deviceID, filename, isClick, offsetX, offsetY, afor=5, confidence=0.8): file = open(filename, "rb") byte = file.read() file.close() tmp = False for i in range(afor): ret = api.find_image(deviceID, byte) if ret["status"] == 0 and ret["data"]["code"] == 0 and ret["data"]["confidence"] >= confidence: if isClick: # api.mouse_movie(deviceID, ret["data"]["result"][0] + offsetX, ret["data"]["result"][1] + offsetY) api.click(deviceID, ret["data"]["result"][0] + offsetX, ret["data"]["result"][1] + offsetY, "left") time.sleep(0.4) api.mouse_movie(deviceID, random.randint(50, 300), random.randint(100, 600)) else: api.mouse_movie(deviceID, ret["data"]["result"][0] + offsetX, ret["data"]["result"][1] + offsetY) tmp = True break else: print("find_image", i, filename, ret) time.sleep(0.4) return tmp def findocr(deviceID, ocr, txtLst, isClick): for item in ocr["data"]["list"]: for txtItem in txtLst: if txtItem == item["txt"]: if isClick: api.click(deviceID, item["result"][0], item["result"][1], "left") return True return False def findocr1(deviceID, ocr, txt, isClick): ok = False for item in ocr["data"]["list"]: if item["txt"].find("反馈"): ok = True if item["txt"].find("跳过") == 0 and (item["txt"].find("s") >= 0 or ok): if isClick: api.click(deviceID, item["result"][0], item["result"][1], "left") return True return False def run(deviceID): print(deviceID) # api.mouse_movie(deviceID, random.randint(50, 300), random.randint(100, 600)) # time.sleep(1.5) # # tmp = findimage(deviceID, "D:/ScreenSrv/ScreenControl/Screenshot/主图标.bmp", True, 0, 0) # if not tmp: # return # findimage(deviceID, "D:/ScreenSrv/ScreenControl/Screenshot/继续闯关.bmp", True, 0, 0) # 恭喜获得-确认领取 while True: api.mouse_movie(deviceID, random.randint(50, 300), random.randint(100, 600)) time.sleep(0.4) ocr = api.ocr(deviceID, [[6, 7], [6, 885], [412, 7], [412, 885]]) if ocr["status"] == 0 and ocr["data"]["code"] == 0 and len(ocr["data"]["list"]) > 0: try: print("恭喜获得-确认领取", ocr["data"]["list"][0]["txt"]) sStr = str(ocr) if sStr.find("恭喜获得") >= 0 and sStr.find("恭喜获得") >= 0: findimage(deviceID, "D:/ScreenSrv/ScreenControl/Screenshot/恭喜获得-确认领取.bmp", False, 0, 0, 1) elif sStr.find("气泡红包") >= 0 and sStr.find("可提现至微信") >= 0: # findimage(deviceID, "D:/ScreenSrv/ScreenControl/Screenshot/气泡红包-领取.bmp", True, 0, 0, 1) findocr(deviceID, ocr, ["领取"], True) elif sStr.find("当前分数") >= 0 and sStr.find("继续闯关") >= 0: findimage(deviceID, "D:/ScreenSrv/ScreenControl/Screenshot/主界面-红包手.bmp", True, 0, 0, 1) elif sStr.find("通关奖励") >= 0 and sStr.find("多倍领取") >= 0: findocr(deviceID, ocr, ["多倍领取"], True) findocr(deviceID, ocr, ["残忍离开"], True) findocr1(deviceID, ocr, "", True) except: print('OCR异常') tmp = findimage(deviceID, "D:/ScreenSrv/ScreenControl/Screenshot/通关-多倍领取.bmp", True, 0, 0, 1) if tmp: time.sleep(random.randint(1, 3)) # print("swipe", i) findimage(deviceID, "D:/ScreenSrv/ScreenControl/Screenshot/通用-关闭.bmp", True, 0, 0, 1) tmp = findimage(deviceID, "D:/ScreenSrv/ScreenControl/Screenshot/恭喜获得-确认领取.bmp", False, 0, 0, 1) if tmp: ocr = api.ocr(deviceID, [[126, 299], [126, 348], [308, 299], [308, 348]]) if ocr["status"] == 0 and ocr["data"]["code"] == 0 and len(ocr["data"]["list"]) > 0: print("恭喜获得-确认领取", ocr["data"]["list"][0]["txt"]) findimage(deviceID, "D:/ScreenSrv/ScreenControl/Screenshot/恭喜获得-确认领取.bmp", True, 0, 0, 1) # time.sleep(random.randint(1, 3)) findimage(deviceID, "D:/ScreenSrv/ScreenControl/Screenshot/恭喜过关-继续闯关.bmp", True, 0, 0, 1) findimage(deviceID, "D:/ScreenSrv/ScreenControl/Screenshot/气泡红包-领取.bmp", True, 0, 0, 1) findimage(deviceID, "D:/ScreenSrv/ScreenControl/Screenshot/通用-关闭2.bmp", True, 0, 0, 1) findimage(deviceID, "D:/ScreenSrv/ScreenControl/Screenshot/可提现-立即拆开.bmp", True, 0, 0, 1) findimage(deviceID, "D:/ScreenSrv/ScreenControl/Screenshot/通用-关闭4.bmp", True, 0, 0, 1) 50, -3, 1) findimage(deviceID, "D:/ScreenSrv/ScreenControl/Screenshot/广告-放弃福利.bmp", True, 0, 0, 1) findimage(deviceID, "D:/ScreenSrv/ScreenControl/Screenshot/跳过.bmp", True, 0, 0, 1) findimage(deviceID, "D:/ScreenSrv/ScreenControl/Screenshot/跳过1.bmp", True, 0, 0, 1) findimage(deviceID, "D:/ScreenSrv/ScreenControl/Screenshot/广告-不感兴趣.bmp", True, 0, 0, 1) True, 0, 0, 1) findimage(deviceID, "D:/ScreenSrv/ScreenControl/Screenshot/取消.bmp", True, 0, 0, 1) findimage(deviceID, "D:/ScreenSrv/ScreenControl/Screenshot/主界面-红包手.bmp", True, 0, 0, 1) # 可提现-立即拆开 主界面-红包手 # 用当前分数来定位,好找下面的广告来点击 # tmp = findimage(deviceID, "D:/ScreenSrv/ScreenControl/Screenshot/主页-当前分数.bmp", True, -16, 68, 1, 0.9) # if tmp: # time.sleep(random.randint(1, 3)) print("Exit Thread.") # Press the green button in the gutter to run the script. if __name__ == '__main__': print_hi('PyCharm') deviceidLst = [] deviceidLst.append('88:64:40:06:C6:53') # 群控多台手机1 # deviceidLst.append('DC:2B:2A:14:2A:F6') #群控多台手机2 # deviceidLst.append('DC:2B:2A:14:2A:F2') #群控多台手机3 # deviceidLst.append('DC:2B:2A:14:2A:F3') #群控多台手机4 for deviceId in deviceidLst: thread1 = threading.Thread(target=run, args=(deviceId,)) thread1.start() time.sleep(1) while True: cmd = input("请输入:") if cmd == "q": break
此iMouse库有一个好处就是,苹果手机上面什么APP都不用安装。完全天然、绿色。所以没有所谓的越狱、签名(掉签),iOS进程保活等繁琐的问题。
源代码及视频:
[https://www.bilibili.com/video/BV1kY411m7pM/]