了解JS脚本

辅助功能和微服务都使用JS脚本实现,JS脚本是标准ECMAScript(JavaScript)的一个子集,比标准JavaScript简单很多且功能强大,没有编程基础的同学也能很快掌握;支持标准JavaScript函数库;支持多线程并发编程,在线编辑、动态部署并立即生效。

1.例子

本例为微信群抢红包,使用前请开启微信通知功能(点击展开)
function main() {
    var __global redComing = false;
    console.log('等待红包来');
    while (true) {
        if (redComing) {
            console.log('红包来了');
            var ret = findView('txt:微信红包', {flag: 'find_all', maxStep:10});
            while (ret.length > 0) {
                var find = false;
                for (var item of ret.views) {
                    if (item.parent.parent[0][1].size==1 && item.parent.parent[0][1][0].text != '已领取') {
                        click(item, {click:true});
                        ret = switchPage('txt:开', 'txt^:已存入零钱|txt^:手慢了');
                        if (ret.length > 0) {
                            if (ret.views[0].text.includes('已存入零钱')) {
                                console.log('领取成功了');
                            } else {
                                console.log('手慢了,没有领取到');
                            }
                            find = true;
                            back2Page('txt^:群聊');
                        } else {
                            back2Page('txt^:群聊', {backFirst: false});
                        }
                        break;
                    }
                }

                if (!find) {
                    break;
                }
                ret = findView('txt:微信红包', {flag: 'find_all', maxStep:10});
            }

            redComing = false;
            refresh();
        } else {
            sleep(500);
        }
    }
}

function cbNotification(textList, className, packageName, rawEvent) {
    for (var item of textList) {
        if (item && item.includes('微信红包')) {
            openNotification(rawEvent);
            redComing = true;
            break;
        }
    }
}
                            

2.运算符

运算符用于赋值、比较值、执行算术运算等。
类型 运算符
算数运算符 +、-、*、/、%、++、--
比较运算符 >、>=、<、<=、!=、==(注意这里取消了繁杂的===和!==)
逻辑运算符 &&、||、!
赋值运算符 =、+=、-=、*=、/=、%=
字符串运算符 +、+=
三元运算符 ?:
其他运算符 typeof、delete、new

3.语句

语句 说明
import 导入其他脚本,import 脚本名;。例:import runtime;
var 声明变量,变量必须先声明才能使用。例:var a = 1, b, c = 'demo';
if、else if、else 根据条件执行语句块。例:if (a == 'str') {...} else if (a == 'hello') {...} else {...}
for 循环遍历代码块多次。例:for(var i = 0; i < 10; ++i){...}
for...of 循环遍历可迭代对象的值,支持数组、对象等。例:for(var item of container){...}
while 条件为true时执行语句块。例:while(a < 10){...}
function 函数声明,支持默认参数。例:function main(a = 1, b = 'hello'){...}
break 退出循环。
continue 中断一次循环,并继续循环中的下一次迭代。
return 停止执行函数并从该函数返回值。

4.变量类型

类型名 说明
number 整型,和浮点型。
boolean 支持常量true,false。
string 字符串常量用''或""表示,例:'hello'。支持模版字符串,用``(两个反引号)表示,可以嵌入变量,例:`hello ${name}`,在执行过程中会动态解析字符串值。
object json对象类型,可以用.和[]操作符访问属性,用{}创建json对象,例:var obj = {name:'a', value:12};。
array json数组类型,可以用[]操作符访问数组,用[]创建json数组。例:var arr =['z', 12];。

5.脚本特性

一般语句必须严格以;结束,变量必须先声明才能使用。例:var a = 10;。
支持//注释。
if、for、while等,即使仅有一条子语句也必须使用{}。
不支持switch和do-while,使用for、if、while来替代。
不支持匿名函数和闭包,但支持自定义函数赋值给变量。
暂不支持位运算。
不支持===、!==,直接统一使用==、!=,简化使用。
支持函数默认参数。
支持import语句,导入脚本。
支持模版字符串。
新增编译指令:__global、__permanent、__day(仅用于移动端脚本),用于 var后,分别表示声明全局变量,持久变量和day变量,全局变量可以在多个模块间共享,可以在不同线程间通信;持久变量永久存在,在当前脚本文件可见,除非卸载程序;day变量作用域为一天,在当前脚本文件可见,每天0点day变量复位为初始值。
默认main函数为入口函数,外部可以传递参数给main函数,main返回值为脚本的返回值,可以使用callScript函数可以调用其他脚本。
支持系统事件回调,cbNotification(textList, className, packageName, rawEvent)、cbWindowChange(textList, className, packageName, rawEvent),开发者可以在脚本中定义这两个函数,当系统收到通知消息或窗口改变事件后,会自动调用回调函数。注意事件回调函数和main函数不在一个线程中执行,可以通过__global变量来进行通信。

6.系统内置常量

系统内置常量以rs开头,可以直接在脚本中使用。
常量名 类型 说明
rsCurWindowClassName string 当前的窗口的类名(仅用于移动端端脚本)
rsScreenWidth integer 屏幕宽,单位像素(仅用于移动端端脚本)
rsScreenHeight integer 屏幕高,单位像素(仅用于移动端端脚本)
rsDensity float 屏幕密度 dp和px转换公式:px=dp*rsDensity(仅用于移动端端脚本)
rsPhoneNumber string 当前设备的电话号码(仅用于移动端端脚本)
rsDeviceName string 当前设备名(仅用于移动端端脚本)
rsUUID string 当前设备的uuid(仅用于移动端端脚本)
rsOpenId string 当前用户的openId(仅用于后端脚本)
rsIsDev boolean 当前是否处于调试状态(仅用于后端脚本)
Copyright © 2021 冰狐智能辅助. All rights reserved.