[关闭]
@wuji 2020-04-07T16:07:00.000000Z 字数 22476 阅读 361

脚本引擎说明文档

必读

Lua脚本:在手机IGHome/CTB/encrypt 文件夹,放入脚本,App会自动读取。
以下为test.lua的内容:
所有接口均需要 load 调用

load:launchApp("com.tencent.mm")
load:exists("注册")
load:clickByText("注册")
设置UI配置信息文件夹(新)
setUIFile(String fileName)
参数: 文件名
说明:该方法一定要在load:scriptUi("") 前调用,否则会读默认的new_ui_setting.xml,
没调用该方法,也会读默认的new_ui_setting.xml。
配置文件统一保存在IGHome/CTB/ui_info/
示例:
--先设置文件夹
load:setUIFile("my.xml")
--再调用UI
load:scriptUi("")


UI配置

App会自动保存UI配置信息:
内部版本号 >=36,默认配置信息保存在IGHome/CTB/ui_info/new_ui_setting.xml
内部版本号 <36,配置信息保存在IGHome/CTB/ui_setting.xml
如果从35升级到36,app会自动读取ui_setting.xml,并转换成new_ui_setting.xml

scriptUi("")
说明:参数为字符串型json数据
参数:
    {'uiTime':30000}  
    uiTime:UI无操作显示秒数  默认30秒
    {'inputBox':[
       {'keyName':'userName','title':'请输入账号'},
       {'keyName':'userPwd','title':'请输入密码'}
    ]}
    inputBox:指定为输入框
    keyName:要接收的键  获取值后用键取值  唯一
    title:标题
    ***************************************************************************
    {'checkBox':[
       {'keyName':'cheName1','title':'这是一个多选框1','check':'选项1-选项2-选项3'},
       {'keyName':'cheName2','title':'这是一个多选框2','check':'选项1-选项2'}
    ]}
    checkBox:指定为多选按钮
    keyName:要接收的键  获取值后用键取值  唯一
    title:标题
    check:选项  用 "-" 分割
    ***************************************************************************
    {'radioBox':[
       {'keyName':'radName1','title':'这是一个单选项1','radio':'单选1-单选2-单选3'},
       {'keyName':'radName2','title':'这是一个单选项2','radio':'单选1-单选2-单选3'}
    ]} 
    radioBox:指定为单选按钮
    keyName:要接收的键  获取值后用键取值  唯一
    title:标题
    radio:选项  用 "-" 分割
    ***************************************************************************
     {'spinner':[
       {'keyName':'spinner1','title':'这是一个单选下拉1','radio':'单选1-单选2-单选3'},
       {'keyName':'spinner2','title':'这是一个单选下拉2','radio':'单选1-单选2-单选3'}
    ]} 
    radioBox:指定为单选按钮
    keyName:要接收的键  获取值后用键取值  唯一
    title:标题
    radio:选项  用 "-" 分割
    ***************************************************************************

    调用示例:
        local uis = "{'uiTime':30000, 'inputBox':[
            {'keyName':'userName','title':'请输入账号'},
            {'keyName':'userPwd','title':'请输入密码'}],
        'checkBox':[
            {'keyName':'cheName1','title':'这是一个多选框1','check':'选项1-选项2-选项3'},
            {'keyName':'cheName2','title':'这是一个多选框2','check':'选项1-选项2'}],
        'radioBox':[
            {'keyName':'radName1','title':'这是一个单选项1','radio':'单选1-单选2-单选3'},
            {'keyName':'radName2','title':'这是一个单选项2','radio':'单选1-单选2-单选3'}]
        }"
        local result = load:scriptUi(uis)  
        result:{"userName":"123456","radName2":"单选3","radName1":"单选2","userPwd":"123456","cheName1":"选项1,选项3","cheName2":"选项2"}
    返回值为json类型字符串  可用stringJson方法解析

获取当前脚本路径(新)

getScriptPath()
返回: 脚本路径

字符串型Json解析

stringJson("json", "key")
参数: json:字符串类型Json  key:要取值的键
返回: 根据键取得的值
说明: 

打印内容到控制台和日志文件

log("123")
参数:要打印的内容
说明:log保存在IGHome/CTB/lua-log.txt,文件超过10M会自动删除

打印悬浮框日志

printLog("123")
参数:要打印的内容

执行shell(su)

execSuCmd("shell")
参数:字符串类型
返回:字符串
示例:load:execSuCmd("echo 1234") --返回1234
说明:需要Root才能用

获取超点市场版本码

getAppVersionCode()
返回:版本码 int类型

获取超点市场版本号 (新)最低支持 0.4.5

getAppVersionName()
返回:版本码 String (0.4.5)

复制Text到剪切板

copyText("Text")
参数:字符串类型
示例:
    load:copyText("1234") 
    load:copyText("") --清空剪切板

创建文件

createFile("文件路径")
参数:文件路径
示例:load:createFile("CTB/log.txt")
说明:该路径已经加根目录

删除文件

   deleteFile("文件路径")
   参数:文件路径
   示例:load:deleteFile("CTB/log.txt")
   说明:该路径已经加根目录

列出目录下的文件

   listFiles("文件路径")
   参数:文件路径
   返回字符串,以","分割
   示例:load:listFiles("/storage/emulated/0/IGHome/CTB")

向文本追加数据

    bool writeTextToFile("text","文件路径")
    参数:text,文件路径
    示例:is_succ = load:writeTextToFile("123456","CTB/log.txt")
    返回值:
        1.bool:true,写入成功
        2.bool:false,写入失败

   说明:配合创建文件方法,先创建,再写入
   该路径已经加根目录

打开APp

   launchApp("包名")

关闭APp

   exitApp("包名")

点击Home

   clickHome()

点击返回

   clickBackKey()

点击坐标

click(x,y)
参数: x:x坐标  y:y坐标

长按坐标

longClick(x,y,time)
参数: x:x坐标  y:y坐标  time:毫秒

点击控件

clickByText("")
参数:控件的text

获取控件中心坐标

getCenterPoint("")
参数:控件的text
返回:
    x,y 以","分割
    找不到控件返回:"-1"

延迟时间

sleep(1000)
参数:毫秒  整数型

判断控件是否存在

exists(String text)
参数:控件的text
返回:true/false boolean类型

等待控件出现

waitForExists("")
参数:控件的text
示例:load:waitForExist("注册")
返回:true/false 
说明:该方法会一直阻塞当前线程,检索页面上的控件,如果有匹配,返回true执行下面的代码。没有则会在20s后返回false,执行下面的代码(超时时间是20s)
附:
    load:waitForExist("注册")
    clickByText("注册")

按下

down(x,y)
参数: x:x坐标  y:y坐标   按下后需抬起  可延时

滑动

move(x,y)
参数: x:x坐标  y:y坐标   按下后滑动之后抬起

抬起

up()
说明: 按下后需抬起  可延时

滑动

swipe(int startX, int startY, int endX, int endY,int time)
参数:
    startX:起始x坐标  
    startY:起始y坐标  
    endX:目标点x坐标  
    endY:目标点y坐标
    time:滑动总时间(毫秒)
示例:
    load:swipe(100, 400, 900, 400,1000)

模拟手指滑动

swipeWithRandom(int startX, int startY, int endX, int endY,int time)
参数:
    startX:起始x坐标  
    startY:起始y坐标  
    endX:目标点x坐标  
    endY:目标点y坐标
    time:滑动总时间(毫秒)
示例:

    load:swipeWithRandom(100, 400, 900, 400,1000)

模拟手指滑动(新)

swipeWithRandom(int startX,int startY,int startRangeX,int endRangeX,int startRangeY,int endRangeY,int count)
参数:
    startX:起始x坐标  
    startY:起始y坐标  
    startRangeX,endRangeX:  x轴滑动范围。
    startRangeY,endRangeY:  y轴滑动范围。
    count:生成坐标点数
示例:
    --起点为303,1801;x轴的终点为1300
    x轴范围305-1300;y轴范围:1800,1897;一共生成100个坐标
    load:swipeWithRandom(303, 1801, 305, 1300,1800,1897,100)

裁剪图片

cutImage(String path, int x, int y, int width, int height, String savePath)
参数:
     path:要裁剪的图片路径  
     x:裁剪x 起点
     y:裁剪y 起点
     width:截图宽度
     height:截图长度
     savePath:裁剪后图片保存路径
返回:
    裁剪成功返回:1 字符串
    找不到要裁剪的图片返回:-1 字符串
    裁剪图片后保存失败返回:0 字符串

缩放图片

scaleImg(String path, float scale, String savePath)
参数:
     path:要裁剪的图片路径  
     scale:缩放的比例,0.1~0.9  
     savePath:裁剪后图片保存路径
返回:
    压缩成功返回:1 字符串
    找不到要压缩的图片返回:-1 字符串
    裁剪图片后保存失败返回:0 字符串
示例:
--表示缩放为原图的10%
load:scaleImg("/storage/emulated/0/IGHome/CTB/scrennShot.png",0.1,"/storage/emulated/0/IGHome/CTB/scrennShot1.png")

--表示缩放为原图的50%
load:scaleImg("/storage/emulated/0/IGHome/CTB/scrennShot.png",0.5,"/storage/emulated/0/IGHome/CTB/scrennShot1.png")

解析二维码(解析失败会自动压缩图片,再解析)

   screenFinding("path")
   参数:要解析的图片路径
   返回:
        解析成功后返回url  字符串
        找不到图片:-1 字符串
        无法识别返回:0 字符串
   说明: 要先截图后再扫码,解析失败会自动压缩图片,再进行解析
   示例:
        --先截图
        load:execSuCmd("screencap -p /storage/emulated/0/IGHome/CTB/scrennShot.png")   
        load:sleep(1000)     --停一下(时间长短自己调试)
        --裁剪图片
        load:cutImage("/storage/emulated/0/IGHome/CTB/scrennShot.png", 20, 400, 800, 800, "/storage/emulated/0/IGHome/CTB/scrennShot.png")
        load:sleep(1000)     --停一下(时间长短自己调试)
        --扫码
        load:screenFinding("/storage/emulated/0/IGHome/CTB/scrennShot.png") 

爱好打码 (新) (最低支持0.4.4-->超点市场版本码:48)

   haoaiCode(String user, String softkey, String gameID, String path)
   参数:
        user:密码串
        softkey:软件KEY
        gameID:题目编号
        path:图片路径
   返回:
        成功 返回识别到的码

        "-1" 请求host出错
        "-2" 找不到图片或上传图片失败
        "-3" 获取答案失败

示例:
--先截图
load:execSuCmd("screencap -p /storage/emulated/0/IGHome/CTB/scrennShot.png")
load:sleep(1000) --停一下(时间长短自己调试)
--裁剪图片
load:cutImage("/storage/emulated/0/IGHome/CTB/scrennShot.png", 20, 400, 800, 800, "/storage/emulated/0/IGHome/CTB/scrennShot.png")
load:sleep(1000) --停一下(时间长短自己调试)
--扫码
load:haoaiCode("密码串", "软件key", "1001", "/storage/emulated/0/IGHome/CTB/scrennShot.png")


文件转base64

   fileToBase64(String path)
   参数:文件路径
   返回:
        base64  字符串
        找不到文件:"-1" 字符串
        文件大于10M(防止内存溢出):"-2" 字符串
        转换失败:"0"
   示例:
         load:fileToBase64("/storage/emulated/0/IGHome/CTB/scrennShot.png")

base64转文件

   base64ToFile(String base64Data, String savePath)
   参数:文件路径
   返回:
        成功:"1" 字符串
        失败:"0" 字符串
   示例:
         base64Data = load:fileToBase64("/storage/emulated/0/IGHome/CTB/scrennShot.png")
         load:base64ToFile(base64Data, "/storage/emulated/0/IGHome/CTB/scrennShot64.png")

获取图片base64

   getImgBase64(String path)
   参数:要解析的图片路径
   返回:
        base64  字符串
        找不到图片:-1 字符串
   示例:
        load:execSuCmd("screencap -p /storage/emulated/0/IGHome/CTB/scrennShot.png")   --先截图
        load:sleep(2000)     --停一下(时间长短自己调试)
        load:getImgBase64("/storage/emulated/0/IGHome/CTB/scrennShot.png")  --获取base64

base64解析成图片

   base64ToImg(String base64Data, String savePath)
   参数:
        base64Data:base64数据
        savePath:图片保存路径
   返回:
        图片转换失败:-1 字符串
   示例:
        load:execSuCmd("screencap -p /storage/emulated/0/IGHome/CTB/scrennShot.png")   --先截图
        load:sleep(2000)     --停一下(时间长短自己调试)
        load:getImgBase64("/storage/emulated/0/IGHome/CTB/scrennShot.png")  --获取base64

MD5加密(新)

   encryptMD5(String text)
   参数:
        text:要加密的字符串
   返回:
        MD5
   示例:
        md5 = load:encryptMD5("mjsheng")
        load:log(md5)

DES加密(新) (最低支持0.4.4-->超点市场版本码:48)

   encryptDES(String data,String key,String transformation,String iv)
   参数:
        data:要加密的字符串
        key:密钥
        transformation:加密模式
        iv:加密向量 CBC加密模式需要填iv,其他模式填""。
   返回:
        成功 返回加密后转base64字符串
        "-1":加密失败 (失败原因看log)
   示例:
        en = load:encryptDES("加密信息", "88888888","DES/ECB/PKCS5Padding","")
        if(en=="-1") then
            load:log("加密失败")
            return
        end

        --解密
        dn = load:decryptDES(en, "88888888","DES/ECB/PKCS5Padding","")

DES解密(新) (最低支持0.4.4-->超点市场版本码:48)

   decryptDES(String data, String key, String transformation, String iv)
   参数:
        data:要加密的字符串
        key:密钥
        transformation:加密模式
        iv:加密向量 CBC加密模式需要填iv,其他模式填""。
   返回:
        成功 返回加密后转base64字符串
        "-1":加密失败 (失败原因看log)
   示例:
        en = load:encryptDES("加密信息", "88888888","DES/ECB/PKCS5Padding","")
        if(en=="-1") then
            load:log("加密失败")
            return
        end

    --解密
    dn = load:decryptDES(en, "88888888","DES/ECB/PKCS5Padding","")

多点颜色对比(新) (最低支持0.4.4-->超点市场版本码:42)

   multipointColor(String color, String path, double degree)
   参数:
        color:坐标和颜色 x,y,0xffffff(十六进制)   
              对比颜色和x,y坐标的颜色相似度
              (多个对比以"-"分割) 
        path:图片路径
        degree:对比精度,范围:0.1-1.0  1.0时为完全匹配
   返回:
        找不到图片:"-1"
        颜色相似:"1"
        颜色不相识:"0"
   示例:
        --先截图
        load:execSuCmd("screencap -p /sdcard/IGHome/CTB/scrennShot.png")

    --多个坐标
    b = load:multipointColor("200,200,0xffffff - 1100,200,0xf5f5f5", "/sdcard/IGHome/CTB/scrennShot.png", 0.9)
    if(b=="1")then
        load:log("颜色相似")
    end

    --单个坐标
    load:multipointColor("200,200,0xffffff", "/sdcard/IGHome/CTB/scrennShot.png", 0.9)

区域模糊找色(新) (最低支持0.4.6)

findColor(String color, String path, double degree, int x, int y, int width, int height)
   参数:
        color:坐标和颜色 x,y,0xffffff(十六进制)   
        path:图片路径
        degree:对比精度,范围:0.1-1.0  1.0时为完全匹配
        x:裁剪x 起点
        y:裁剪y 起点
        width:裁剪宽度
        height:裁剪长度
   返回:
        成功返回:"x,y"
        裁剪失败:"-2"
        找不到图片:"-1"
        找不到匹配颜色:"0"
   示例:
         --先截图
         load:execSuCmd("screencap -p /sdcard/IGHome/CTB/scrennShot.png")

     xy = load:findColor("0xcbac73", "/sdcard/IGHome/CTB/scrennShot.png",1,0,800,300,300)
     load:printLog("结果:" .. xy)

获取坐标点RGB色

colorRGB(int x, int y,String path)
参数:
    x:坐标  
    y:坐标 
    path:要解析的图片路径
返回:
    R,G,B   字符串类型
    找不到图片:-1 字符串

附:
    function split(str, reps)
        local resultStrList = {}
        string.gsub(str,'[^'..reps..']+',function ( w ) table.insert(resultStrList,w) end)
        return resultStrList
    end
    -- str:待分割字符  reps:分割标识  return:分割后的table


    load:execSuCmd("screencap -p /storage/emulated/0/IGHome/CTB/scrennShot.png")   --先截图
    load:sleep(2000)     --停一下(时间长短自己调试)
    color = load:colorRGB(200, 200, "/storage/emulated/0/IGHome/CTB/scrennShot.png")

    load:log(color) -- 输出 255,155,55
    r = split(color, ",")[1]
    g = split(color, ",")[2]
    b = split(color, ",")[3]
    load:log(r) -- 输出 255
    load:log(g) -- 输出 155
    load:log(b) -- 输出 55

    注意!!!
    注意!!!
    注意!!!
    从 split()方法分割出来的 r,g,b 被指定是String类型,要用tonumber()转成int才能去比大小

    test = tonumber(r)<100 
    load:log(test) --输出 false

输入

   sendKeys(int position,String text)
   参数: 
        position:控件位置
        text:要输入的text
   返回:true/false 字符串类型
   示例:
        load:sleep(2000)
        load:sendKeys(0,"mjsheng")
        load:sleep(2000)
        load:sendKeys(1,"13265993426")
        load:sleep(2000)
        load:sendKeys(2,"asdfasdf123")

键盘输入

   pressKeyCodes(String text,int time)
   参数: 
        text:要输入的text
        time:输入间隔 单位:毫秒
   返回:true/false 字符串类型
   说明:输入的总时间不得超过15秒,text的长度*time<15000,超过则该方法会无效。日志会提示。
   示例:
        load:click(586, 781)
        load:pressKeyCodes("mjsheng", 500)
        load:click(682, 1191)
        load:pressKeyCodes("13235953423", 500)
        load:click(682, 1376)
        load:pressKeyCodes("mjsheng", 1000)

通过clazz找到控件集合,获取控件text集合

   findAndGet(clazz)
   参数: clazz:控件类名  
   返回:返回字符串,以","分割
   示例:load:findAndGet("android.widget.Button") -- 返回 登录,注册

通过resourceId找到控件,获取控件text

   getTextByID(resourceId)
   参数: resourceId String类型 
   返回:控件text

获取原生控件,执行操作

   doUiautomator(String selector, String action,(选填)String text)
   参数: 
        selector:uiautomator selector string
        action:执行的操作 例如:click,setText,exists,getText
        text:执行setText要传入的text,(选填)
   返回:
        (注意!!注意!!返回值都为String类型)
        解析selector语句失败返回 "-1"
        找不到对应action "-2"
        执行原生方法失败 "0" (没找到控件)
        执行成功 "1" (找到控件或者执行动作成功都返回1)
    示例:
        --点击
        load:doUiautomator("text='注册'","click")
        load:doUiautomator("(text='注册').child(index=1)","click") --child获取子类
        load:doUiautomator("(text='我').sibling(className='android.widget.RelativeLayout')","click") --sibling获取父类

    --setText
    load:doUiautomator("className='android.widget.EditText',instance=0","setText","昵称")
    load:doUiautomator("(index = 4,className = 'android.widget.LinearLayout').child(index=1,className='android.widget.EditText')","setText","123456qwe")

    --exists
    result = load:doUiautomator("text='注册',instance=1","exists")
    找到控件 result = "1"
    找不到控件 result = "0"

    --getText
    result = load:doUiautomator("text='注册',instance=1","getText")
    找到控件 result = "注册"
    找不到控件 result = "0"

    --判断控件是否存在,存在则点击
    if (load:doUiautomator("text='注册',className='android.widget.Button'", "exists")=="1") then
        load:doUiautomator("text='注册',className='android.widget.Button'", "click")
    end

判断VPN是否连接

isVPNConnected()
返回:true/false boolean类型

格式化请求参数

urlEncode("param")
返回: 字符串
例: 
--url的请求参数
请求参数 = "I4RNXu8+GGaYYkBQ4bLioA=="
格式化,把+ = ..特殊字符格式化
load:urlEncode(请求参数)

发送post请求

httpPost("url", "str")
参数: url:请求地址  str:请求参数(以"---"分割)
例: load:httpPost("www.baidu.com", "a:0---b:1---c:2")
说明:默认超时时间5秒
返回: 
    Json字符串数据
    超时会返回:timeout

发送post请求(设置超时时间)

httpPost("url", "str",time)
参数: url:请求地址  str:请求参数(以"---"分割) time:超时时间 毫秒
例: load:httpPost("www.baidu.com", "a:0---b:1---c:2",20000)
返回: 
    Json字符串数据
    超时会返回:timeout

发送post请求(设置UA)(新) (最低支持0.4.4-->超点市场版本码:48)

httpPost(String url, String str, int time, String ua)
参数: 
    url:请求地址  
    str:请求参数(以"---"分割) 
    time:超时时间 毫秒
    ua:设置User-Agent,以下是谷歌和火狐两个浏览器的ua,其他自行查找
        google chrome:
        Mozilla/5.0 (Windows NT 5.2) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30
        firefox:
        Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0
例: load:httpPost("www.baidu.com", "a:0---b:1---c:2",20000," Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0")
返回: 
    Json字符串数据
    超时会返回:timeout

发送get请求

httpGet("url")
参数: url:请求地址+参数
例: load:httpGet("www.baidu.bao?a=1&b=2&c=3")
返回: 
    Json字符串数据
    超时会返回:timeout

发送get请求(设置超时时间)

httpGet("url",time)
参数: url:请求地址+参数 time:超时时间 毫秒
例: load:httpGet("www.baidu.bao?a=1&b=2&c=3",20000)
返回: 
    Json字符串数据
    超时会返回:timeout

发送get请求(设置UA) (新) (最低支持0.4.4-->超点市场版本码:48)

httpGet(String url, int time, String ua)
参数: 
    url:请求地址+参数 
    time:超时时间 毫秒
    ua:设置User-Agent
例: load:httpGet("www.baidu.bao?a=1&b=2&c=3",20000,"设置User-Agent")
返回: 
    Json字符串数据
    超时会返回:timeout

提取A16

  getK61()
  返回:
  字符串
  超时会返回:timeout

获取VPN连接状态

int getVPNState()
返回值:
    VPN_STATUS_FAILED = -2        :vpn失败
    VPN_STATUS_TIMEOUT = -1       :vpn超时
    VPN_STATUS_NONE = 0           :无操作
    VPN_STATUS_DISCONNECTED = 1   :vpn已断开连接
    VPN_STATUS_CONNECTING = 2     :vpn连接中
    VPN_STATUS_CONNECTED = 3      :vpn连接成功

连接VPN

connectVPN(String name, String server, String username, String password)
参数:
    name:vpn名字
    server:vpn服务器
    username:vpn账号
    password:vpn密码

断开VPN

void disconnectVPN()

说明:
    断开VPN连接

脚本改机

String autoNewDevice(String phone, String nickname, String password, String avatarpath)
参数:
    phone:手机号码,如:18888888888
    nickname:账号昵称,如:陈晨
    password:账号密码
    avatarpath:头像的路径,规格要求:949x949,jpg;如不需要设置头像,传空字符串:""
返回值:
    1.空字符串:"",改机服务没启动,改机失败
    2."code:0\nmsg:新机成功",code为0,表示改机成功
    3.其他值,表示改机失败,msg记录失败原因,例如:"code:1\nmsg:清理app数据失败"
说明:
    由于改机需要连接网络,该api请求时可能会花费很长时间(取决于网络状态),属正常情况
例子:
    load:autoNewDevice("18888888888", "android", "google1234", "/sdcard/touxiang.jpg")

获取用户登录的token

String getToken()
返回值:
    1.空字符串:"",改机服务没启动,或者用户尚未登录
    2.token,例如:df8b06e581280d160633f2536aab0cf8

获取用户名和密码

String getUserInfo()
返回值:
    1.空字符串:"",获取失败
    2.账号密码,格式:"abc\n123",以换行符'\n'作为分割符,"abc"为用户名,"123"为密码
例子:
    load:getUserInfo()

脚本恢复在线数据

String autoRestoreNetDevice(String iccid, String phone)
参数:
  iccid: sim卡序列号,通常长度是20位,如:89660104890257906412
  phone:手机号码,如:18888888888
返回值:
  1.空字符串:"",改机服务没启动,恢复失败
  2."code:0\nmsg:恢复成功",code为0,表示恢复成功
    3.其他值,表示恢复失败,msg记录失败原因,例如:"code:1\nmsg:清理app数据失败"
说明:
    由于改机需要连接网络,该api请求时可能会花费很长时间(取决于网络状态),属正常情况
例子:
    load:autoRestoreNetDevice("89860076141241757691", "")

连接代理

void connectProxy(String server, int port, int proxyType, String username, String password) 
参数:
    server    : 代理服务器地址
    port      : 连接的端口,整数
    proxyType : 代理类型,整数,只选其一,包括:
                PROXY_TYPE_HTTP = 0
                PROXY_TYPE_HTTPS = 1
                PROXY_TYPE_HTTP_TUNNEL = 2
                PROXY_TYPE_SOCKS4 = 3
                PROXY_TYPE_SOCKS5 = 4
    username  : 登录代理服务器的用户名,无则为空
    password  : 登录代理服务器的密码,无则为空
返回值:
    无返回值
例子:
    -- PROXY_TYPE_HTTP = 0
    -- PROXY_TYPE_HTTPS = 1
    -- PROXY_TYPE_HTTP_TUNNEL = 2
    PROXY_TYPE_SOCKS4 = 3
    -- PROXY_TYPE_SOCKS5 = 4
    load:connectProxy("221.224.213.154", 1080, PROXY_TYPE_SOCKS4, "", "")

断开代理

void disconnectProxy()
参数:无
返回值:无
例子:
    load:disconnectProxy()

获取代理的连接状态

int getProxyState()
参数:无
返回值:
    返回代理当前的连接状态
    1.代理已经断开:PROXY_STATE_DISCONNECT = 0
    2.代理连接中:PROXY_STATE_CONNECTING = 1
    3.代理已连接:PROXY_STATE_CONNECTED = 2
    4.代理连接失败:PROXY_STATE_FAIL = 3
    5.代理PAC错误:PROXY_STATE_PAC_ERROR = 4
    6.代理host解析错误:PROXY_STATE_RESOLVE_ERROR = 5
例子:
    PROXY_STATE_DISCONNECT = 0
    PROXY_STATE_CONNECTING = 1
    PROXY_STATE_CONNECTED = 2
    PROXY_STATE_FAIL = 3
    PROXY_STATE_PAC_ERROR = 4
    PROXY_STATE_RESOLVE_ERROR = 5
    i = 0
    while i < 20 do
      i = i + 1
      state = load:getProxyState()
      if PROXY_STATE_CONNECTED == state then
        break
      end
    end

获取注册状态

int getWXRegState()
参数:无
返回值:
    返回当前注册状态,返回值为整数
    int NONE = 0                         -- 无状态
    int LAUNCH_APP =  1                  -- 启动app
    int REG_ACTIVITY_PAGE =  2           -- 注册页面
    int REG_ACTIVITY_CLICK_REG_BTN = 3   -- 注册页面点击注册按钮
    int LOAD_AGREEMTN_PAGE =  4          -- 加载同意页面
    int LOAD_SIGNUP_VERIFY_PAGE = 5      -- 加载安全校验页面
    int CLICK_START_VERIFY_BTN =  6      -- 点击"开始"按钮
    int LOAD_CAPTCHA_PAGE =  7           -- 加载滑块页面
    int SLIDE_CAPTCHA_PIC =  8           -- 滑动滑块
    int SLIDE_CAPTCHA_FINISHED = 9       -- 滑动滑块完成
    int LOAD_ASSIST_PAGE =  10           -- 加载辅助页面
    int WAIT_FOR_ASSIST =  11            -- 等待辅助
    int REG_SEND_SMS_PAGE =  13          -- 发送短信页面
例子:
    SLIDE_CAPTCHA_FINISHED = 9
    LOAD_ASSIST_PAGE =  10
    WAIT_FOR_ASSIST =  11
    while true do
        load:sleep(1000)
        state = load:getWXRegState()
        load:printLog(state)
        if SLIDE_CAPTCHA_FINISHED == state then
            -- 滑块滑动完成后,辅助的状态可能不会出现
            -- 完成后,等待 2 - 5 秒,再判断页面
        elseif LOAD_ASSIST_PAGE == state or WAIT_FOR_ASSIST == state then
            -- 加载辅助页面,LOAD_ASSIST_PAGE 这个状态可能不出现,直接跳到 WAIT_FOR_ASSIST
    end

读取安全校验页面辅助url

String getWXGetRegVerifyCodeUrl()
参数:无
返回值:
        返回:安全校验页面辅助url
        1.空字符串:"",未达到条件
        2.从状态:LOAD_SIGNUP_VERIFY_PAGE = 5      -- 加载安全校验页面 开始,返回url
例子:
        url = load:getWXGetRegVerifyCodeUrl()
        load:printLog(url)

设置自动注册、自动滑块开关

boolean setAutoRegSwitch(boolean isAutoReg, boolean isAutoCaptcha)
参数:
        isAutoReg     :boolean,true:打开自动注册;false:关闭自动注册
        isAutoCaptcha :boolean,true:打开自动滑块;false:关闭自动滑块
返回值:
        boolean:true:开关设置成功;false:开关设置失败
例子:
        load:setAutoRegSwitch(true, true)

添加ip绕过vpn

boolean addIPBypassVPN(String ip)
参数:
    ip  :字符串,ip
返回值:
    boolean:true,添加成功;false,添加失败
注意事项:
    该api目前只支持wlan,不支持移动网络
例子:
    load:addIPBypassVPN('39.156.69.79')

添加域名绕过vpn

boolean addDomainBypassVPN(String site)
参数:
    site  :字符串,域名
返回值:
    boolean:true,添加成功;false,添加失败
注意事项:
    该api目前只支持wlan,不支持移动网络
例子:
    load:addDomainBypassVPN('baidu.com')

判断网络是否可连接

boolean isNetConnected()
参数:无
返回值:
    boolean:true,网络可连接;false,网络不可连接
例子:
    load:isNetConnected()

通过域名获取IP

String getIPByDoamin(String site)
参数:
    site   :字符串,域名
返回值:
    String :返回对应的IP
例子:
    load:getIPByDoamin('baidu.com')

生成当前gps定位和基站定位

bool genLocation()
参数:无
返回值:
    bool:true,生成成功;false:生成失败
例子:
    load:genLocation()

设置改机的网络连接状态

boolean setNetLinkType(int type)
参数:
    type:int,整数,网络连接状态,包括4个状态:
    NET_TYPE_SYSTEM  = 0,跟随系统的网络状态,即不修改网络状态
    NET_TYPE_RAND    = 1,随机网络状态,从 NET_TYPE_WIFI 和 NET_TYPE_MOBILE 中随机一个
    NET_TYPE_WIFI    = 2,WIFI网络状态
    NET_TYPE_MOBILE  = 3,移动网络状态
返回值:
    bool:true,设置成功;false,设置失败
例子:
    NET_TYPE_SYSTEM  = 0
    is_good = load:setNetLinkType(NET_TYPE_SYSTEM)
    if is_good then
        load:printLog("setNetLinkType : true ")
    else
        load:printLog("setNetLinkType : false ")
    end

获取改机的网络连接状态

int     getNetLinkType()
参数:无
返回值:
    int:整数,以下4个状态值之一:
    NET_TYPE_SYSTEM  = 0,跟随系统的网络状态,即不修改网络状态
    NET_TYPE_RAND    = 1,随机网络状态,从 NET_TYPE_WIFI 和 NET_TYPE_MOBILE 中随机一个
    NET_TYPE_WIFI    = 2,WIFI网络状态
    NET_TYPE_MOBILE  = 3,移动网络状态
例子:
    net_type = load:getNetLinkType()
    load:printLog(net_type)

重启atx

boolean restartAtxAgent()
参数:无
返回值:
    bool:true,重启成功;false,重启失败
注意:
    重启atx耗时需要10秒,这个api会阻塞10秒
例子:
    load:restartAtxAgent()

http post同步请求

String postSync(String url, String jsonParams, int timeout)
参数:
    1.url       :String,访问的url,如:https://www.baidu.com
    2.jsonParams:String,请求的参数,必须是json格式的字符串,并且每个参数的值必须是String,如:{"a":"1","b":"2"}
    3.timeout   :int,请求的超时时间,单位为毫秒,如:15000(15000毫秒)
返回值:
    返回请求的结果,Sting,有固定格式:code:(数字)\nmsg:(消息)
    有10种情况:
    "code:-1\nmsg:json参数无法解析"
    "code:-2\nmsg:参数值格式错误,必须为String : (key)"
    "code:-3\nmsg:json请求头无法解析"
    "code:-4\nmsg:请求头值格式错误,必须为String : (key)"
    "code:-5\nmsg:网络IO异常,请检查当前网络状态 : (异常信息)"
    "code:-6\nmsg:响应为null"
    "code:-7\nmsg:请求失败,响应码 : (当前响应码,如:404)"
    "code:-8\nmsg:body为null"
    "code:-9\nmsg:返回结果非字符串"
    "code:0\nmsg:(返回的结果)"
    1.只有当code为0,才是请求返回的真实结果,其他值都是异常;
    2.网络断开时,通常返回 code:-5,与网络相关的错误码包括:code:-5,code:-6,code:-7,code:-8
例子:
    qlurl  = "http://card-api.mali126.com/api/order/submit"
    token  = "455788s877wegoie"
    phone  = "12366554899"
    prov_code = "150000"

    jsonStr = ""
    jsonStr = load:addParamToJsonString(jsonStr, "userKey", token)
    jsonStr = load:addParamToJsonString(jsonStr, "phone", phone)
    jsonStr = load:addParamToJsonString(jsonStr, "provinceId", prov_code)
    jsonStr = load:addParamToJsonString(jsonStr, "qrCodeUrl", qlurl)
    load:printLog(jsonStr)

    result = load:postSync(qlurl, jsonStr, 20000)

http post同步请求

String postSync(String url, String jsonParams, int timeout, String jsonHeaders)
参数:
    1.url         :String,访问的url,如:https://www.baidu.com
    2.jsonParams  :String,请求的参数,必须是json格式的字符串,并且每个参数的值必须是String,如:{"a":"1","b":"2"}
    3.timeout     :int,请求的超时时间,单位为毫秒,如:15000(15000毫秒)
    4.jsonHeaders :String,请求头,必须是json格式的字符串,并且每个参数的值必须是String,如:{"token":"45s4eed1e","type":"json"}
返回值:
    返回请求的结果,Sting,有固定格式:code:(数字)\nmsg:(消息)
    有10种情况:
    "code:-1\nmsg:json参数无法解析"
    "code:-2\nmsg:参数值格式错误,必须为String : (key)"
    "code:-3\nmsg:json请求头无法解析"
    "code:-4\nmsg:请求头值格式错误,必须为String : (key)"
    "code:-5\nmsg:网络IO异常,请检查当前网络状态 : (异常信息)"
    "code:-6\nmsg:响应为null"
    "code:-7\nmsg:请求失败,响应码 : (当前响应码,如:404)"
    "code:-8\nmsg:body为null"
    "code:-9\nmsg:返回结果非字符串"
    "code:0\nmsg:(返回的结果)"
    1.只有当 code:0,才是请求返回的真实结果,其他值都是异常;
    2.网络断开时,通常返回 code:-5,与网络相关的错误码包括:code:-5,code:-6,code:-7,code:-8
例子:
    qlurl  = "http://card-api.mali126.com/api/order/submit"
    token  = "455788s877wegoie"
    phone  = "12366554899"
    prov_code = "150000"

    jsonStr = ""
    jsonStr = load:addParamToJsonString(jsonStr, "userKey", token)
    jsonStr = load:addParamToJsonString(jsonStr, "phone", phone)
    jsonStr = load:addParamToJsonString(jsonStr, "provinceId", prov_code)
    jsonStr = load:addParamToJsonString(jsonStr, "qrCodeUrl", qlurl)
    load:printLog(jsonStr)

    jsonHeaders = ""
    jsonHeaders = load:addParamToJsonString(jsonHeaders, "token", "adb1237cd874")

    result = load:postSync(qlurl, jsonStr, 20000, jsonHeaders)

把参数添加到json字符串中

String addParamToJsonString(String jsonStr, String key, String value)
参数:
    1.jsonStr   :String,json格式字符串,并且里面的元素值都是Stirng,例如:{"a":"1","b":"2"}
    2.key       :String,参数的key值,如:"token"
    3.value     :String,参数key对应的值,如:"12d"
返回值:
    json格式的字符串,添加失败返回空字符串
例子:
    qlurl  = "http://card-api.mali126.com/api/order/submit"
    token  = "455788s877wegoie"
    phone  = "12366554899"
    prov_code = "150000"

    jsonStr = ""
    jsonStr = load:addParamToJsonString(jsonStr, "userKey", token)
    jsonStr = load:addParamToJsonString(jsonStr, "phone", phone)
    jsonStr = load:addParamToJsonString(jsonStr, "provinceId", prov_code)
    jsonStr = load:addParamToJsonString(jsonStr, "qrCodeUrl", qlurl)
    load:printLog(jsonStr)

    result = load:postSync(qlurl, jsonStr, 20000)

获取注册发送短信页面的发送号码

String getRegSendCodes()
参数:无
返回值:
    1.空字符串,与改机断开通信
    2.换行符:"\n",请在发短信页面出现的时候才获取,其他页面获取的是字符串:"\n"
    3.String,格式:"(sendcode)\n(receivecode)",以换行符:"\n"进行分割,例如:"zc88\n1065555"
例子:
    codes = load:getRegSendCodes()
    load:printLog(codes)

禁止app访问网络

boolean blockAppNet(String pkgName)
参数:
    1.pkgName:String,app的包名
返回值:
    1.bool:true,禁止成功
    2.bool:false,禁止失败
例子:
    load:blockAppNet("com.baidu.app")

恢复app访问网络

boolean resumeAppNet(String pkgName)
参数:
    1.pkgName:String,app的包名
返回值:
    1.bool:true,恢复成功
    2.bool:false,恢复失败
例子:
    load:resumeAppNet("com.baidu.app")

获取当前设备A16环境数据(只获取A16的数据)

String getA16()
参数:无
返回值:
    1.空字符串:"",A16尚未生成
    2.Json格式字符串,参数如下:
    {"a16":"A123456789abcdef","iccid":"898602E4190363318357","imei":"866256044742428","android_id":"5df93910720a8324","wifi_mac":"14:1b:bd:2f:b2:e7","brand":"OPPO","cpu_abi":"arm64-v8a"}
例子:
    json = load:getA16()

lua本地保存 key-value

boolean luaPutString(String key, String value)
参数:
    1.key:String,键值,如:"abc"
    2.value:String,键值对应的内容,如:"123"
返回值:
    1.bool:true,保存成功
    2.bool:false,保存失败
例子:
    load:luaPutString("abc", "123")

lua本地读取 key对应的value

String luaGetString(String key)
参数:
    1.key:String,键值,如:"abc"
返回值:
    1.String:空字符串""
    2.String:key对应的内容,如:"123"
例子:
    value = load:luaGetString("abc")

lua本地删除key以及key对应的value

boolean luaRemoveKey(String key)
参数:
    1.key:String,键值,如:"abc"
返回值:
    1.bool:true,删除成功
    2.bool:false,删除失败
例子:
    load:luaRemoveKey("abc")

判断uiautomator是否运行中

boolean isUIRunning()
参数:无
返回值:
    bool:true,uiautomator正在运行;false,uiautomator已停止
例子:
    is_run = load:isUIRunning()

关闭uiautomator

boolean stopUI()
参数:无
返回值:
    bool:true,uiautomator关闭成功;false,uiautomator关闭失败
例子:
    is_good = load:stopUI()

启动uiautomator

boolean startUI()
参数:无
返回值:
    bool:true,uiautomator启动成功;false,uiautomator启动失败
例子:
    is_run = load:startUI()

重启uiautomator

boolean restartUI()
参数:无
返回值:
    bool:true,uiautomator重启成功;false,uiautomator重启失败
例子:
    is_run = load:restartUI()

获取当前登录的wx的wxid

String getWXID()
参数:无
返回值:
    1.空字符串:"",wx尚未登录
    2.字符串:wxid,如:wxid_123456789abcde
注意:
    必须让账号登录成功,才能读取
例子:
    wxid = load:getWXID()
    load:printLog(wxid)
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注