我哪最开始搞自动化的程序,先是在windows ,然后是android 最开始用的框架是按键精灵,触动精灵,的。之后也了解了autojs ,冰狐智能。对于我个人来讲感觉都不咋地,因为咱python,java玩的多,所以我最后用的是ascript。
这玩意,不但用法简单,图色工具等测试工具全面,支持中控,而且可以无限开,就是每个机器地连下有点麻烦,最主要的是用的是python可以玩的花活的多咱熟悉啊。
而且后台和其它的一样都有中控,设备管理等,还有自己的数据库mysql,开发者可以直接创建一个,给自己的脚本用还可以搞模型训练目标检测(yolo)标注啥的这个可个大杀器哈哈哈,用起来也简单。
--开发后台注册地址 用户注册
这篇博客主要介绍一下ascript 的常见api 过下
开发插件安装
概述
这里先说下插件,这里必须地安装下,要不玩不了哈。除非你喜欢用三方的,咱管不了。这里它是去上网盘下插件包,咱们需要在pycharm从磁盘安装,就不多说了。走下连接直接下个就完了。百度网盘 请输入提取码
插件菜单位置
安装后可以在左侧看到这个插件
插件功能菜单
这个可以大概过下不难理解,要注意的是连接设备需要下ascript 客户端用于执行脚本代码等(下载 | AScript) 可以根据自己需要下载
必知的三种高级权限
动作指令
1. 直接 Root
Root 权限就像是手机的 “超级管理员密码”,有了它就能随意摆弄手机里的各种东西,想咋改就咋改。但这密码一般很难搞到,弄不好手机还会出毛病。不过用云手机就好多了,基本都能直接拿到这个 “密码”,让你放开了折腾。
2. 无障碍服务
无障碍服务权限就像给手机请了个听话的小秘书。开启权限很容易,真机也能轻松搞定。有了这小秘书,它就能按照你的要求帮你操作手机,比如点点屏幕、滑滑页面啥的。
3. 虚拟外设
虚拟外设得买专门的硬件,像外接手柄、键盘这类的,就好比给手机额外装了 “新手脚”。不过要让这些 “新手脚” 能正常使唤,就得在手机上开对应的权限,就像给 “新手脚” 办个合法 “身份证”。
概述
动作指令就是,模拟人的操作,比如点击屏幕某个点,滑动屏幕,还有智能手机其它几个能按的物理按钮等。
api介绍
这里大概列举常用的,过下,很简单。具体的我下面会给官方文档链接,自己可以看看。在提一嘴一般做动作操作最好加上范围随机延迟,还有操作的位置,要不瞎搞大数据会封的,你要是违反平台规则哦。
屏幕点击
这里dur 指定是延迟 x y是位置坐标下面也差不多
from ascript.android import action
# 点击坐标
# action.click(x:int,y:int,dur:int = 20):
action.click(2,33)
手指滑动
# 模拟手指滑动屏幕 从坐标(1,1) 滑动至坐标(2,2) ,耗时20毫秒
# action.slide(x:int,y:int,x1:int,y1:int,dur:int=20)
from ascript.android import action
action.slide(1,1,2,2)
# 这个是延迟的一般动作设置范围内延迟比较好,搞游戏容易被封
# 模拟手指滑动屏幕 从坐标(157,798) 滑动至坐标(946,834) ,耗时3000毫秒
from ascript.android import action
action.slide(157,798,946,834,3000)
输入框输入
这里简单说下选择器,和控件
- 选择器:用来查找指定类的控件资源,并且返回对象。这里一般使用工具里的控件检索工具来查看下
- 手机界面控件是屏幕上交互组件,像按钮能触发操作、文本框可输入内容等,但是游戏比较特殊,一般没有,除了个别地方,因为游戏很多是画的组件,自己探索不深究。
action.input(msg:str="",selector:Selector=None)
# 模拟在当前 ‘已获取焦点’的的文本框中输入‘你好’
from ascript.android import action
action.input("你好")
# 模拟在 控件检查器查到的 文本框中输入‘你好’
from ascript.android import action
from ascript.android.node import Selector
selector = Selector().id("xx.xx.xx/search_bar_text")
action.input("你好",selector)
按下/抬起/移动
# 按下
action.Touch.down(x,y,dur:int=20)
# 按下后往哪里移动
action.Touch.move(x, y, dur: int = 20)
# 抬起
action.Touch.up(x, y, dur: int = 20)
按键
# 模拟 模拟按键操作
#class
action.Key
# Home按键
action.Key.home()
# 返回按键
action.Key.back()
# 调出通知栏
action.Key.notifactions()
# 任务栏键
action.Key.recents()
# 关闭屏幕
action.Key.screenshot()
# 关闭屏幕
action.Key.lockscreen()
手指路径
这里是一般玩比较复杂的连续动作,比如在手机上用手写打字,只是个比喻哈。
# 连续 执行两个Path路径,中途不松手指
from ascript.android import action
from ascript.android.action import Path
line1 = Path(0,1000,True);
line1.moveTo(200,200)
line1.lineTo(200,500)
# 创建另一个新的path路径 模拟 手指2
line2 = Path(1000,500);
line2.moveTo(200,500)
line2.lineTo(500,500)
class listener:
def onCompleted():
gesture.perform(line2)
def onCancelled():
print("被中断取消了")
action.gesture([line1],listener)
捕获用户点击
这个一般录脚本动作可以用用。
# 捕获用户点击屏幕的坐标,给出提示文字,并取消屏幕闪烁
from ascript.android import action
p = action.catch_click("请点击屏幕任意位置",False)
print(p)
控件检索
控件查找器
就是和html 类似用id 类 路径点,名称包下所有等方式来获取控件。这里就直接贴几个代码列几个自己过下,具体的话看自己是什么场景,看下官方文档用合适的api。
from ascript.android.node import Selector
# 获取控件树
#class
Selector.dump(mode:int=0)
# 通过 id 约束
node = Selector().id("com.aojoy.airscript:id/search_bar_text").find()
# 查找id 基于正则表达式
node = Selector().id(".*search_bar_text$").find()
# 查文本的
node = Selector().text("开发者").find()
# 根据类型 比如按钮 。输入框,文本等
nodes = Selector().type("TextView").find_all()
图色
图色这里经常用图色工具,是通过ide插件里开,必用的东西属于,可以直接打开用用。
屏幕图像
屏幕图像这个重点是截屏,还有设置缓存很重要.缓存的话很常用,截屏不多说,说下缓存是什么意思就是比如截取物品背包图像后,要识都有什么物品,就截屏一次就够了,不需要多次截屏.
from ascript.android import screen
# s_cache 是否缓存 True:缓存 False:取消缓存
# bitmap 是否将一张android bitmap 作为图色缓存 默认为None,缓存当前屏幕 如填入Bitmap参数,所有图色方法都从这个Bitmap图像中检测
# file 图片文件地址 是否将一个图片文件作为图色缓存 默认为None,缓存当前屏幕如填入对应的图片文件地址,所有图色方法都从这个图片文件中检测
# screen.cache(is_cache:bool=False,bitmap=None,file=None)
# 打开屏幕缓存 这里开启后在截屏会使用首次截取的
screen.cache(True)
# 关闭
screen.cache(False)
# 将sd卡中的a.png图片作为屏幕图像缓存起来.
screen.cache(False,file=R.sd("a.png"))
# 获取一张当前屏幕的内存截图,截图格式为
# screen.capture(x:int=None,y:int=None,x1:int=None,y1:int=None)
bitmap = screen.capture( 122,358,808,979)
# 图片转Base64数据
screen.bitmap_base64(bitmap=screen.capture())
# 图像转文件
screen.bitmap_to_file(path:str,bitmap=screen.capture(),quality=100)
# 文件转图片
screen.file_to_bitmap(path:str,sampleSize:int=1)
剩下的用的少就简单看下就行,一般玩的复杂用
# 获取图像指定坐标的颜色值s
# creen.get_color(x:int,y:int,bitmap = screen.capture())
# 获取R通道,G通道,B通道,A通道 10进制颜色值
# 图像所有色值
# screen.get_colors(bitmap = screen.capture())
# 区域颜色点数量
# screen.get_color_num(colors:str,rect:list=None,sim:float=0.9)
# 图片最大边缩放
# screen.bitmap_maxside(bitmap=screen.capture(),max_side_len=9999)
# Bitmap 转 Python Image
# screen.bitmap_to_pilimage(bitmap=capture())
# Bitmap 转 Opencv Image
# screen.bitmap_to_cvimage(bitmap=capture())
# Opencv Image 转 Bitmap
# screen.cvimage_to_bitmap(image)
# 创建一个颜色
# Color(color_argb:int)
图色识别
文字识别
很常用比如识别金钱数量,等级,任务属性等很常用
谷歌文字识别
from ascript.android.screen import Ocr
谷歌 MLKIT 引擎v2, 速度快,且准确度高. (源码版本:4.0)
# 参数 说明
# rect 识别范围
# pattern regx 正则匹配
# bitmap 要识别的图片,默认为当前屏幕,如需传入指定图片,请传入Bitmap格式
# Ocr.mlkitocr_v2(rect: list = None, pattern: str = None bitmap=None):
# 没有设置范围就是全屏
res = Ocr.mlkitocr_v2()
if res:
#循环打印识别到的每一个段落
for r in res:
print("文字:",r.text)
print("文字中心坐标:",r.center_x,r.center_y)
print("文字范围:",r.rect)
#
百度飞桨v2
百度飞桨v2 文字识别引擎 ,速度快,精度中等
# 参数 类型 是否必填 说明
# rect list 否 圈定屏幕中识别的范围
# pattern str 否 匹配的正则表达式 如保留字符串中包含IT的识别结果:.*IT.*
# confidence float 否 识别可信度:默认0.1
# max_side_len str 否 如果指定最大边时,如1200,那么所有输入资源都会同比缩放最大边至1200px,再传入引擎识别
# bitmap str 否 从指定的图片中识别 该Bitmap 可以从Screen.capture()获取
# file str 否 从指定的文件中识别
# Ocr.paddleocr_v2(
# rect:list=None,
# pattern:str=None,
# confidence:int=0.1
# max_side_len:int=1200,
# precision:int=16,
# bitmap=None,
# file:str=None):
from ascript.android.screen import Ocr
res = Ocr().paddleocr_v2(rect=[40,122,714,659],pattern=".*程序.*",max_side_len=1600)
print(res)
if res:
#循环打印识别到的每一个段落
for r in res:
print("文字:",r.text)
print("可信度",r.confidence)
print("文字中心坐标:",r.center_x,r.center_y)
print("文字范围:",r.rect) # 这是一个int数组,可以这样取值 r.rect[0],r.rect[1],r.rect[2],r.rect[3]
百度飞桨v3
百度飞桨v3 文字识别引擎 ,速度慢,精度高
#Ocr.paddleocr_v3(
# rect:list=None,
# pattern:str=None,
# confidence:int=0.1
# max_side_len:int=1200,
# precision:int=16,
# bitmap=None,
# file:str=None):
# 参数 类型 是否必填 说明
# rect list 否 圈定屏幕中识别的范围
# pattern str 否 匹配的正则表达式 如保留字符串中包含IT的识别结果:.*IT.*
# confidence float 否 识别可信度:默认0.1
# max_side_len str 否 如果指定最大边时,如1200,那么所有输入资源都会同比缩放最大边至1200px,再传入引擎识别
# bitmap str 否 从指定的图片中识别 该Bitmap 可以从Screen.capture()获取
# file str 否 从指定的文件中识别
from ascript.android.screen import Ocr
res = Ocr().paddleocr_v3()
print(ots)
if res:
#循环打印识别到的每一个段落
for r in res:
print("文字:",r.text)
print("可信度",r.confidence)
print("文字中心坐标:",r.center_x,r.center_y)
print("文字范围:",r.rect) # 这是一个int数组,可以这样取值 r.rect[0],r.rect[1],r.rect[2],r.rect[3]
TesserAct 文字识别
这个有的字上面的都不行的时候可以考虑用自己做字库,不多赘述。
多点找色
这个还好一般,一般用多点比色就行
# 找到 一个符合特征点的位置 立刻返回
# FindColors.find(colors:str,rect:list=None,space:int=5,ori:int=2,diff:float=0.9)
# 参数 类型 是否必填 说明
# colors str 是 颜色特征点, 通常用图色助手获取
# rect list 否 圈定屏幕范围
# space int 是 找色结果间距 默认:5像素 ,如果返回的结果,多个点位的像素值 在5像素内重合.则只保留一个
# ori int 否 找色方向 1-8 个方向 ,2(默认):左上角到右下角,横向开始找色 详情见...
# diff float 否 相似度 0-1 之间, 1为100%匹配 默认:0.9
from ascript.android.screen import FindColors
point = FindColors.find('634,2126,#05D395|675,2142,#05D395|889,2146,#05D395|939,2117,#05D395|868,2085,#05D395|652,2124,#05D294',rect=[82,2010,1005,2215])
if point:
# 打印 x坐标 和 y坐标
print(point.x,point.y)
# 找到全部点
参数 类型 是否必填 说明
colors str 是 颜色特征点, 通常用图色助手获取
rect list 否 圈定屏幕范围
space int 是 找色结果间距 默认:5像素 ,如果返回的结果,多个点位的像素值 在5像素内重合.则只保留一个
ori int 否 找色方向 1-8 个方向 ,2(默认):左上角到右下角,横向开始找色 详情见...
diff float 否 相似度 0-1 之间, 1为100%匹配 默认:0.9 ,当图色工具中颜色带有偏色,则不会使用该值
# FindColors.find_all(colors:str,rect:list=None,space:int=5,ori:int=2,diff:float=0.9)
from ascript.android.screen import FindColors
points = FindColors.find_all('634,2126,#05D395|675,2142,#05D395|889,2146,#05D395|939,2117,#05D395|868,2085,#05D395|652,2124,#05D294',rect=[82,2010,1005,2215])
if points:
# 打印 x坐标 和 y坐标
for p in points:
print(p.x,p.y)
多点比色
很重要比如打开游戏后,判断是不是加载完成进入登录界面,或者界面静态部分多取几个位置点点就可以判断当前界面是上面,比找图快太多了,计算量很小。
# 比色
参数 类型 是否必填 说明
colors str 是 颜色特征点, 通常用图色助手获取
diff float 否 颜色相似度 0-1 之间 默认0.9
# CompareColors.compare(colors:str,diff:float=0.9)
from ascript.android.screen import CompareColors
res = CompareColors.compare('339,342,#38D8A8|445,424,#FFFFFF|504,586,#FFFFFF')
if res:
print('比色成功')
else:
print('比色失败')
# 比对颜色,直到成功后返回结果 会阻塞线程
CompareColors.compare_until(colors:str,diff:float=0.9)
找图
这个常用比如找背包里的特定物品,然后使用等,api的话需要注意的是使用可信度参数还有多张图匹配,提高匹配准确度。
from ascript.android.screen import FindImages
from ascript.android.system import R
path = R.res("/img/a.png") # 这里替换为你的图片地址
res = FindImages.find(path)
if res:
print("中心坐标:",res["center_x"],res["center_y"])
print("相似度:",res["confidence"])
print("在屏幕中的范围:",res["rect"])
# opencv中的模版匹配算法, 找色速度快, 不支持全分辨率
# FindImages.find_template(part_img:str,rect:list=None,confidence:int=0.1,rgb:bool=False)
# 全分辨率算法, 找色速度慢, 可以在任意设备上找到图像特征匹配的图
# FindImages.find_sift(part_img:str,rect:list=None,confidence:int=0.1)
# 先使用 模版匹配find_template ,如果找不到再使用全分辨率算法 find_全分辨率 查找
# FindImages.find_all(part_img:str,rect:list=None,confidence:int=0.1)
# opencv中的模版匹配算法, 找色速度快, 不支持全分辨率
# FindImages.find_all_template(part_img:str,rect:list=None,confidence:int=0.1,rgb:bool=False)
# 全分辨率算法, 找色速度慢, 可在所有设备上找到图像特征匹配的图像
# FindImages.find_all_sift(part_img:str,rect:list=None,confidence:int=0.1)
yolo目标检测
这里标注用的入口是在插件里web ide中上面菜单里面,就是画框的。这里上b站上找下视频。我就贴了个使用的例子,很简单用起来,主要是训练浪费时间。
from ascript.android.screen import YoLov5
# 注意,这里的 ‘微信跳一跳’就是训练的模型名称,1.5是模型的版本(需替换成你自己的模型与版本)
# 创建Yolov5 并加载模型文件
yolo = YoLov5("微信跳一跳:1.5")
while True:
res = yolo.find_all()
for r in res:
print(r.label) # 目标名称
print(r.prob) # 可信度
print(r.x) # 坐标x
print(r.y) # 坐标y
print(r.w) # 目标宽度
print(r.h) # 目标高度
边缘检测
简单来说就是匹配一个物体的框线,这个复杂逻辑会用到,属于高级的玩法自己研究下吧
opencv
不多说就是图像处理库直接在android用可以直接另外学习
UI交互
Web窗口
这个自动化程序界面搞的强大花里胡哨主要是这个,常用的也是这个。
#展示一个简单的Html页面
from ascript.android.ui import WebWindow
from ascript.android.system import R
def tunnel(k,v):
print(k)
print(v)
# 构建一个WebWindow 显示‘/res/ui/a.html’ 通信通道为tunnel 函数
w = WebWindow(R.ui('a.html'),tunnel)
w.show()
# 窗口的模式
# m=0 默认,窗口内和窗口外都可以获取点击触摸事件,但窗口外不可以调出键盘
# m=1 只有窗口内的点击触摸事件有效
# m=2 窗口内的所有点击触摸事件无效,并透传到窗口下
# m=3窗口内外都可以点击触摸,但窗口内不可以调起键盘
# m = -1 窗口载入进activity中.窗口内长按事件触发为系统原生方式
WebWindow(...).mode(mode:int=0)
web界面消息通道
# 设置消息通道,可以接收到js中传递的消息
WebWindow(...).tunner(pyfun)
# 设置窗口 宽 或 高
WebWindow(...).size(self,width=None,height=None)
# 设置UI背景色,默认为白色
WebWindow(...).background(color:str)
# 拖拽
WebWindow(...).drag(is_drag:bool=False)
# 遮罩
# 设置窗口遮罩层透明度,默认为0.5
WebWindow(...).dim_amount(dim:float=0.5)
# 引力与位置
# 可更改 窗口的引力方向,随着引力方向的改变. 窗口的位置 属性也会随着引力点改变.
WebWindow(...).gravity(gravity:int=None,offset_x:int=None,offset_y:int=None)
# 显示
WebWindow(...).show()
# 关闭
WebWindow(...).close()
# Python与Html交互
# 导包
from airscript.ui import WebWindow
#构建与展示UI
w = WebWindow(R(__file__).res('/ui/a.html'))
w.show()
# 调用 javascript 中的 函数 fun1 ,并传入参数 "1111",2
w.call('fun1("111",2)')
# JavaScript 向 Python 传递数据
# <script>
# //这里的 key,value 用户填入自定义的值 ,在 python 的WebWindow 构造参数 tunnel 中会回调
# window.airscript.call('key',"value")
# </script>
# JavaScript 中的快捷方法
# airscript.close() 关闭当前窗口
# airscript.get("key") 获取 Python 中Kv 存储的数据,仅支持string数据
# airscript.save("key","value") 快速存储数据到本地,和Python Kv函数数据互通,仅支持string数据
对话框
from ascript.android.ui import Dialog
# Dialog.toast(msg,dur=3000,gravity=1|16,x=0,y=200,bg_color: str = None, color: str = None)
Dialog.toast('hello')
# 展示一个简单吐司提示,5秒后消失
Dialog.toast('hello',5000)
消息提示
from ascript.android.ui import Dialog
# Dialog.alert(msg:str,submit:str="确认")
# 案例1: 弹出一个信息提示框
Dialog.alert('您好','确认')
消息确认
# Dialog.confirm(msg:str, title:str =None, submit:str="确认", cancel:str= "取消")
# 弹出一个用户确认框
from ascript.android.ui import Dialog
res = Dialog.confirm('您确定要学习aslib吗?')
if res:
print("确定")
else:
print("取消")
文本输入
Dialog.prompt(msg:str="请输入信息",title:str=None,value:str=None,hint:str=None,submit:str="确认",cancel:str="取消")
# 弹出一个熟消息输入框
from ascript.android.ui import Dialog
res = Dialog.prompt('您确定要学习aslib吗?')
if res:
print(res)
else:
print("取消")
展示图片
# 展示一张 图片文件
from ascript.android.ui import ImageWindow
from ascript.android.system import R
ImageWindow.show(R.img("a.png"))
日志窗口
# 创建 日志窗口
Loger()
# 显示日志窗口
Loger().show()
# 隐藏日志窗口
Loger().close()
悬浮窗
# 显示
FloatWindow.show(x:float=None,y:float=None,dim:float=None)
FloatWindow.show()
# 更改悬浮窗位置
# x为20%屏幕宽度, y 为20%屏幕高度
FloatWindow.show(0.2,0.4)
# 隐藏悬浮窗
FloatWindow.hide()
# 注入按钮
# menu_id str 是 按钮唯一id,随意填写
# menu_ico str 是 按钮图标文件地址
# menu_click_listener fun 是 按钮点击后的回调函数
# remove_system bool 否 默认False不移除系统按钮, True:移除系统按钮
FloatWindow.add_menu(menu_id:str,menu_ico:str,menu_click_listener,remove_system:bool=False)
# 向悬浮菜单中新增按钮
def a():
print("123")
FloatWindow.add_menu("123",R.img("a.png"),a)
通信
这里就提一嘴默认ascript是直接支持使用requests 和 websocket 包直接用就完了。
数据库
数据库是直接支持mysql的包,注册开发者后台可以直接建个mysql库用 地址用户注册
文件读写
文件操作和py自带的api一样就是文件路径需要 使用R.sd("文件路径")包下
from airscript.system import R
file = open(R.sd("a.txt"),mode='w')
# 上面这句代码意思:打开当前文件路径下的这个文件并采用写入的文件模式,当这个文件不存在的时候就会去创建
# w、w+、a+、a模式都能创建新文件
file.close()
多媒体
列几个简单的例子
from ascript.android import media
# 音量调节 percent是大小
# type说下就是
# 音乐-3,
# 铃声-2,
# 系统-1,
# 通话-0
# 警告-4
# 窗口顶部状态栏Notification-5
media.volume(percent:int,type:int =3)
# 获取音量大小
media.get_volume(type:int =3)
# 语音朗读
media.talk('自在老师你好')
# 播放音频
# 播放一个音频文件
from ascript.android.system import R
media.play(R.res("/media/aodi.wav")).stop()
# 设备震动
media.vibrate(time:int=200):
# 图片文件存储相册并更新
media.image_to_gallery(R.img("logo.png"))
意图
他可以启动应用,启动服务 等操作.直接引用官方代码可以扫一下
发短信
from airscript.intent import Intent
# 发短信
#导包
from android.content import Intent
from ascript.android.system import R
it = Intent(Intent.ACTION_VIEW)
it.putExtra('sms_body', '你好这是短信内容');
it.setType('vnd.android-dir/mms-sms');
# 部分Activity 启动需要一个新的TASK ,通常都固定写这一行代码
it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
R.context.startActivity(it);
抖音直播间跳转
# 通过 房间ID 跳转抖音直播间
# 导包
from android.content import Intent
from ascript.android.system import R
from android.net import Uri
roomid = '6901450157649300232'
uri = Uri.parse("snssdk1128://live?room_id="+roomid);
it = Intent(Intent.ACTION_VIEW,uri)
it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
R.context.startActivity(it);
跳转应用详情
from airscript.intent import Intent
from ascript.android.system import R
from android.net import Uri
from android.provider import Settings
# 根据需求改变包名,即可跳转,跳转后,可点击停止程序等等.
intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).setData(Uri.fromParts("package", "com.aojoy.airscript", None))
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
R.context.startActivity(intent);
跳转设置界面
from airscript.intent import Intent
from android.content import ComponentName
from ascript.android.system import R
intent = Intent()
package = "com.android.settings"
activity = "com.android.settings.Settings"
componentName = ComponentName(package, activity)
intent.setComponent(componentName)
intent.setAction("android.intent.action.VIEW");
# 这是固定的启动方法
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
R.context.startActivity(intent);
系统操作相关api
from ascript.android import system
# 关闭当前程序
system.exit()
# 重启
system.reboot()
# 启动应用
# 根据应用名称启动
system.open("微信")
# 根据包名启动
system.open("com.autonavi.minimap")
# 输入网址,用浏览器打开
system.browser("http://www.airscript.cn")
获取当前正在运行的APP,默认获取1分钟内打开的操作.
app_package = system.get_foreground_app()
Root指令
需要root权限可以执行命令,可以玩更多花样,权限更大
system.shell(adb_root:str)
云控
该部分API 可以让设备主动连接至官方运控 或 开发者自搭建的云控平台.连接后可在云端控制设备,远程操控设备,定时下发执行任务等.
from ascript.android import cloud_control
cloud_control.connect_to_as("你自己的开发者账号")
# 发数据
cloud_control.send(data:dict)
# 关闭云控
cloud_control.close()
插件
支持插件就是自己打包啥的,相当于包,可以去官网看下。我列几个可以重点关注下,比较好用的。
- ld 这个配置特征,还有可以用中文ai 用链式调用api比较优雅简单
- TomatoOcr:这个文字识别效果可以
- sync_projects_plug 局域网批量更新项目
- 自然语言大模型 这个是调大模型的,有热度提一嘴,我是没用过 清华,DeepSeek,百度大模型 轻松调用插件。
- fsm 玩状态机的
结尾
(开发后台注册地址)用户注册
(官方文档)Android 自动化 | AScript