高级使用手册

Posted by Vove on September 24, 2018 浏览量:

高级使用手册

  • 继用户手册,这里主要一些新建指令、标记,和一些注意事项。
  • 阅读对象: 高级用户
  • 请仔细阅读

文章不免有疏漏,欢迎在Issues中指出

更新日志

指令🍋

指令参数

每个指令都可以带有0个或1个参数(目前不支持多个参数支持,若有需要可联系作者),如上面“给xxx发消息”带有一个参数,“下一首”则不带有参数。

在脚本中获取参数见脚本参数

脚本🚲

目前脚本语言使用了LuaJavaScript两种形式,但由于js引擎现无优化,lua也是不错的选择。

脚本参数

=> Api手册/脚本参数

脚本Api

=> Api手册

下面部分代码需要参考此处

App高级操作🏑

自定义指令

新建全局指令

这里以报时为例

  1. 指令管理/全局命令下 点击下方’+’ 进入

  2. 填写名称,和正则式(和普通正则没多大区别,只是以%代替任意长度的字符) 这里我们需要能够解析以下说法:

    • “现在几点了”
    • “几点了”

那么正则式可以是 %(现在)?(是)?几点了 ,前面的%可以模糊匹配,比如“告诉我现在几点了”

  • 填写数据

这里无参数,参数位置默认”无”即可

  • 测试正则式

测试结果会有绿色通过,和红色不通过

  1. 脚本

    脚本哪里来 当然是调试好的啦

好在,百度语音合成的强大,不需要我手动把时间转换文字,朗读出来,直接speak('12:45') 即可报时 调试好的代码(Lua):

-- lua: 这里是使用调用Java来实现
import 'java.text.SimpleDateFormat'
c = SimpleDateFormat("HH:mm:ss")
speak(c.format(Date()))
// javascript 方式
var date = new Date()
speak(date.getHours() + ":" + date.getMinutes())

好了,输入代码,下方会有预览

  1. 点击保存即可使用了

新建App内指令

应用内App解析流程: 根据当前App解析所有此App的命令,若此命令标记的Activity和当前Activity不同或没指定Activity,则主动跳至此App主页。

某些应用建议不指定Activity,比如QQ扫一扫。某时你会发现,QQ的消息列表和聊天界面是同一个Activity(为什么不用Fragment标记? 😥目前没办法获取界面Fragment.. root? nonono)。那么扫一扫操作就可以不标记Activity,执行步骤从首页开始就可以了

如果你的指令从首页开始,可跳过下面这段。 所以App内指令标准流程:

  1. 如果当前Activity和你标记的Activity不同,(此时跳转首页)手动进入那个页面
  2. 继续标记Activity内动作
if (not String(runtime.currentActivity).endsWith("标记Activity")) then -- endsWith 为java String类函数
    print("不在标记的页面")
    -- ..
    -- 进入标记页面
    -- ..
end

-- 即使在当前Activity 也可能不是你想要的页面!
-- 继续

为什么不直接打开对应的activity界面呢/ ,考虑到一些Activity不对外暴露,用Activity名称启动会失败。 如果测试可行,你也可以通过system.startActivity(pkg: String, fullActivityName: String)来跳到目标页面。

这里以打开网易云播放本地音乐收藏正在播放的歌演示

上个手册说过,App内指令可以在此网易云音乐内说“播放本地音乐”,也可以在外部说“用网易云播放本地音乐”。当然,你也可以尝试下在App内再说“用此App xxx” 🎈

那么脚本流程,随即想到:在主页点击[本地音乐] -> 点击[随机播放]

那么,可能你会想到,如果进入此App不在主页怎么办。这个不必担心,如果打开App后还有操作,app会强制跳转目标App的‘主页’。但要注意一个App的主页可能有多个像QQ,没登陆时首页是登陆页,登陆后是消息列表页

详细步骤:

  1. 指令管理/应用内指令新建按钮
  2. 基本信息

这里的Activity填写网易云主页的Activity,这样做可以使脚本适用更多场景:在App外部说:用网易云播放本地音乐 ,在App内[指定的Activity页面]说播放本地音乐 使用3.脚本中的工具可查看手机当前界面信息

Activity 可只填xxx.xxx.XXXActivity 最后的XXXActivity

从首页操作,可以不指定Activity

  1. 脚本

这里从简编写,以容易理解;App内指令脚本,并不需要编写打开App的操作,在调试代码时,需在前面加上smartOpen('网易云')

这里暂时需要用到其他应用来作为视图检索工具,如Auto.Js开发者工具,或者使用VScode调试插件查看

require 'accessibility' -- 需要无障碍模式标志,未打开会跳转提示开启,并 不执行下面代码
-- 等待出现
mm = ViewFinder().type('Tab').waitFor()
-- 点击'我的音乐'tab
mm.tryClick()
-- 点击'本地音乐'
ViewFinder().equalsText('本地音乐').waitFor(2000).tryClick()
mm.tryClick()
-- 点击播放
a=ViewFinder().equalsText('播放全部').waitFor(2000)
if(a) then
  a.tryClick()
else 
  speak('未发现本地音乐')
end
  1. 保存,就可以使用啦

ps: 某些时候需要考虑更多的是其他情况的出现,如无本地音乐的情形,第一次进入应用的不在期望的初始页,如QQ可能会在登录页

标记功能

目前标记的数据包含联系人、应用、打开/关闭、广告

联系人

标记联系人可利用联系人的别称实现模糊搜索。 在呼叫陌生姓名时也会提示标记的

标记数据格式:

  1. 显示名
  2. 一条正则式
  3. 电话号码

应用

标记联系人可利用联系人的别称实现模糊搜索。

标记数据格式:

  1. 显示名
  2. 一条正则式
  3. 包名

打开/关闭

如(打开|关闭)蓝牙,标记特殊功能

获取打开还是关闭指令详见获取运行时参数

标记数据格式:

  1. 名称
  2. 正则式
  3. 脚本内容
  4. 脚本类型

例如打开|关闭闪光灯:


type = runtime.commandType
if (type == 1) then
    system.openFlashlight()
elseif (type == -1) then
    system.closeFlashlight()
end

或者 类似switch case

d = {
    [-1] = function()
        -- 关闭
        system.closeFlashlight()
    end,
    [1] = function()
        -- 打开
        system.openFlashlight()
    end
}
s = d[runtime.commandType]
if (s) then
    s()
end

广告

标记数据格式:

  • View的标志性信息(确定广告唯一)
    1. 显示名
    2. Activity
    3. 文本
    4. descs
    5. id
    6. 应用包名
    7. className class名,类似textview,imageview

    其中345保证至少指定一个

  • 深度信息(在无法利用上面345确定的广告信息)
    1. 显示名
    2. Activity
    3. 深度信息数组 该View的绝对位置,以’,’分隔,如0,0,0,1,0
    4. 应用包名
    5. className class名,在此方式中务必指定

    标记方法后期更新,预计在视图检索器中自动生成

App内指令转全局指令

  • 位于app指令详情菜单
  • 用于将常用的App操作转换为全局指令
  • 用户自由定制,不建议上传

调试🛸

当然,此调试非彼调试。

远程调试

转移 => 远程调试

本地调试

请在App内 高级脚本内查看

基本功能

  • 遍历按钮:输出屏幕视图节点信息
  • 选择部分代码执行
  • 选择文件打开(无保存功能)
  • 停止脚本运行

上传分享

可上传分享内容:指令、标记内容,在审核之后可同步。

换设备登陆后,可继续对自己发布过内容进行编辑更新。 用户自由定制命令(包括App内转全局,标记的本地联系人)请不要上传

注意事项⭕

  • 上传操作时先从上级操作上传
  • 跟随操作的深度最好不超过3

计划实现功能🌱

  • 指令设置存储
  • 屏幕识别
  • 桌面快捷
  • App内应用布局检索
  • 代码编辑器,高亮,代码提示
  • ShortCut
  • 在线解析
  • 对话功能
  • 本地备份
  • 批量指令打包导出 (用于同机型之间的指令分享)
  • VsCode 远程调试插件
  • 使用语义解析代替正则

The End☀