[触动精灵]触动精灵官方手册流水账1

时间:2024-03-11 17:32:35

官方手册

http://www.touchsprite.com/helpdoc#/doc?id=2148


小知识:手册的查询功能

image

注意 这里能精确的查询对应函数 但是无法模糊查询 比如记不起某个函数名 但是记得函数的说明的几个关键字  这样的模糊查询并不支持


触动精灵的lua版本是5.2.3

traceprint("lua版本:[" .. tostring(_VERSION) .. "]")--  [init.lua]第10行  lua版本:[Lua 5.2]


触动精灵的编码是UTF8  一旦运行期间出现乱码 很可能是编码不对的问题


遍历表的时候顺手写了一个显示任何类型变量的类型 值   的函数

--[[功能:输出变量类型值 包含遍历表 包括嵌套表
--参数 第一个参数可以是任何类型变量 如果是table 第二个参数是设置表元素的间隔符的 也可以不写
 --]]
function showInfo(t, tab)    
        return try{
        function ()            
            --下面代码随便写 有可能抛出异常即可                
            local str = str or ""
            --print(type(t))
            --if not t then
            if type(t)~="table" then                
                --error("table is nil")
                return type(t) .. ":"  .. tostring(t)
            end
            tab = tab or "  "
            tab = tab .. "  "
            str = str .. "{\n"

            if type(t) == "table" then
                for k, v in pairs(t) do
                    if type(k) == "number" then
                        str = str .. string.sub(tab, 2, string.len(tab)) .. "[" .. tostring(k) .. "]" .. " = "
                    else
                        str = str .. string.sub(tab, 2, string.len(tab)) .. "[\"" .. tostring(k) .. "\"]" .. " = "
                    end
                    if type(v) == "string" then
                        str = str .. "\"" .. v .. "\"" .. "\n"
                    elseif type(v) == "number" then
                        str = str .. tostring(v) .. "\n"
                    elseif type(v) == "boolean" then
                        str = str .. tostring(v) .. "\n"
                    elseif type(v) == "function" then
                        str = str .. tostring(v) .. "\n"
                    elseif type(v) == "thread" then
                        str = str .. "thread : " .. tostring(v) .. "\n"
                    elseif type(v) == "userdata" then
                        str = str .. "userdata : " .. tostring(v) .. "\n"
                    elseif type(v) == "table" then
                        str = str .. showInfo(v, tab) .. "\n"
                    else
                        str = str .. "unknow : " .. tostring(v) .. "\n"
                    end
                end
                str = str .. string.sub(tab, 2, string.len(tab) - 1) .. "}"
            else
                str = t
            end
            return str
        end,
        catch{
            function (errors)
                --这里对应函数名要改
                local tempStr=""
                tempStr="函数[" .. tostring("traversalTable") .. "] 错误信息:".. tostring(errors)
                traceprint(tempStr)
                dialog(tempStr, 3)
            end            
        }
    }    
end


越狱及 root 常识 的确很有用

http://www.touchsprite.com/docs/5383


触动的三款软件的优劣

image

三个软件都可以实现我们的脚本功能 

小精灵 免费的不支持网络插件和高级扩展库 放弃小精灵   收费的每月5.5/台

触动企业版  收费很贵 按天收费 依然不考虑

触动精灵app  安卓免费 IOS收费 把脚本上传到手机上直接运行就好 或者生成二维码让手机扫码  问题是源码也有暴露的危险  暴露源码 但是可以对源码加密tsp文件 只能推荐这个

image


三个软件在功能上区别

触动专业版在批量控制就是中控上官方已经提供了这服务 其他2个没有

小精灵免费版没网络函数和高级扩展库 很难受

还是那个结论  依然是用触动精灵app来运行脚本


触动精灵 Android 使用手册(推荐仔细看看 很多使用细节)

http://www.touchsprite.com/docs/4928 

安装触动app

触动app的账号登录 因为运行tsp脚本必须登录 lua脚本不用

找脚本  触动脚本市场的下载和使用

触动app端写脚本 触动app左上点开 新建脚本

触动app录制脚本

tsp脚本的生成和上传      开发者平台--新建脚本---- 上传工程压缩包  记住脚本id ----在触动app的右上第一个按钮写入脚本id 下载即可

更新脚本tsp  不过还是推荐删除再重新下载脚本  就是按键下的自动更新脚本

激活脚本  收费脚本才会遇到

定时脚本和开机启动脚本

授权相关

触动app 插件 设备信息 日志位置等等


触动精灵 IOS使用手册

http://www.touchsprite.com/docs/4875


统计某个区域的指定颜色数量:看到getColor函数   获取某个坐标的颜色数值 想起按键有个统计某个区域的指定颜色数量 这个函数还是很有用的 顺手写了 不过从效率上看很一般 统计半个屏幕的符合的颜色数量大约1-2秒  有点慢 目前就用这个凑合把

--[[
获取一定区域内 和指定颜色相似的颜色点的数量
sim注意按照触动的习惯来把 80 90 而不是0.8 .09
colorStr 是十六进制的颜色数值 不过也可以是颜色字符串
getColorNum(5,164,347,479,0x00b98c,9
--]]
function getColorNum(x1,y1,x2,y2,colorStr,sim)
    return try{
        function ()            
            --下面代码随便写 有可能抛出异常即可
            local result=0
            local tempColor
            local tempPercent
            keepScreen(true);
            for y=y1,y2 do
                for x=x1,x2 do
                    tempColor=getColor(x, y)
                    if tempColor>=tonumber(colorStr) then
                        tempPercent=tonumber(colorStr)/tempColor
                    else
                        tempPercent=tempColor/tonumber(colorStr)
                    end
                    if tempPercent*100>tonumber(sim) then
                        result=result+1
                    end    
                    --mSleep(1)
                end                
            end
            keepScreen(false); 
            return result
        end,
        catch{
            function (errors)
                --这里对应函数名要改
                local tempStr=""
                tempStr="函数[" .. tostring("getColorNum") .. "] 错误信息:".. tostring(errors)
                traceprint(tempStr)
                dialog(tempStr, 3)
            end            
        }
    }    
end


发现我自己封装的traceprint 显示当前文件名和行号 在实际发布位TSP文件后 发现debug库就无效了 那么输出当前文件名和行号也是空了

如果变成了TSP文件 那么就不显示文件名和行号了 因为无法获取到了 traceprint也要变动一下

config={}
----日志相关(暂时不考虑多日志并存的情况)
config["isLog"]=true--是否开启日志输出和日志文件
config["logFileName"]=tostring(config["scriptName"]) .. tostring(os.date("%Y%m%d%H%M%S",os.time())) --只是当前日志文件名字不是完整路径年月日时分秒 如XXXX20190816112336 加了个前缀
config["logMode"]=0--0表示写入本地日志文件--1 - 生成 1 个以时间戳命名的后缀为 .log 的文件到 log 文件夹下 2 - 异步发送到服务器(支持引擎 v1.7.0 及 Android v2.4.1 以上版本)3 - 同步发送到服务器(仅支持触动精灵 iOS v1.7.0 及以上版本)
-----是否开启日志行号和文件名显示(不需要设置) 注意 这个只是再调试状态下才能出现 正式脚本下debug库是无效的  如果debug库里面的文件名里面没找到.lua 自然当前debug库是无效的 那么日志输出就不要带行号和文件名
config["isAddLineAndFilename"]=(string.find(tostring(debug.getinfo(1).source),".lua") and {true} or {false})[1]


--输出日志信息到日志窗口和日志文件 日志文件的输出还有是否有行号和文件名由配置表控制 
function traceprint(str)
    local info 
    local tempStr=""
    if config["isAddLineAndFilename"] then--是不是处于调试模式
        info = debug.getinfo(2)
        tempStr="[" .. tostring(info["source"]) .. "]" .. "" .. tostring(info["currentline"]) .. "" .. tostring(str)
    else
        tempStr=tostring(str)
    end
    if config["isLog"] then
        wLog(config["logFileName"], tostring(tempStr))
    end
    nLog(tempStr)
    mSleep(5)--为了nLog的显示顺序的暂时解决办法
end


截图函数 可以单独截图一张 也可以在规定时间内连续截图多张 截图一次大约占用0.4秒时间 第五个参数设置个截图时间即可 这个时间内尽量多的截图  因为触动没有连续截图的功能 只能用这个函数来代替

--[[
截图工具 
picname只需要文件名即可 默认放到触动的资源文件夹下 文件名是当前日期时间为名
x1, y1, x2, y2 没什么说的
最后2个参数 都是用于短时间内连续截多图 第一个参数是限定的时间  第二个参数是在这个限定时间内截多少图
支持 需要ts库生成时间戳
经过实际测试 截图函数本身需要0.4秒左右的时间消耗  所以不设置截图几张了 只设置截图的限制时间就行
示例 snapshotEx(0,0,config["width"]-1,config["height"]-1)--截一图
snapshotEx(0,0,config["width"]-1,config["height"]-1,3)--3秒内尽可能多的截图
--]]
function snapshotEx(x1, y1, x2, y2,...)
    local args={...}
    return try{
        function ()            
            --下面代码随便写 有可能抛出异常即可
            local result=-1
            local startTime
            local tempPath=userPath() .. "/res/"
            local tempTime  local tempFileName local tempTable
            local tempStartTime
            local tempDelay
            local tempStr="截图结果:" .. tempPath .. " ["
            if args[1]==nil then
                --表示正常截图即可
                tempTime=ts.ms()
                tempTable=strSplit(tostring(tempTime),".")
                tempFileName=os.date("%Y%m%d%H%M%S",time) ..tostring(tempTable[2]) .. ".png"
                snapshot(tempPath .. tempFileName, x1, y1, x2, y2)
                tempStr=tempStr .. tempFileName .. "]"
                traceprint(tempStr)
            else
                --需要连续截图了
                if type(args[1])=="number" then
                    --args[2]=(tonumber(args[2]) and {tonumber(args[2])} or {5})[1]                       
                    startTime=os.clock()
                    --tempDelay=math.floor(tonumber(args[1])*1000/tonumber(args[2]))
                    while ((os.clock()-startTime)<args[1]) do
                        tempTime=ts.ms()
                        tempTable=strSplit(tostring(tempTime),".")
                        tempFileName=os.date("%Y%m%d%H%M%S",tempTime) .. tempTable[2] .. ".png"
                        snapshot(tempPath .. tempFileName, x1, y1, x2, y2)
                        tempStr=tempStr .. " " .. tempFileName                        
                    end
                    tempStr=tempStr .. "]"
                    traceprint(tempStr)
                else
                    --连续截图参数不合法 就不连续截图了 就单截图了
                    tempTime=ts.ms()
                    tempTable=strSplit(tostring(tempTime),".")
                    tempFileName=os.date("%Y%m%d%H%M%S",time) .. tempTable1[2] .. ".png"
                    snapshot(tempPath .. tempFileName, x1, y1, x2, y2)
                    tempStr=tempStr .. tempFileName .. "]"
                    traceprint(tempStr)
                end
            end
        end,
        catch{
            function (errors)
                --这里对应函数名要改
                local tempStr=""
                tempStr="函数[" .. tostring("snapshotEx") .. "] 错误信息:".. tostring(errors)
                traceprint(tempStr)
                dialog(tempStr, 3)
            end            
        }
    }    
end


utf8库的相关函数

http://www.mytju.com/classcode/tools/encode_utf8.asp  utf8编码和字符的转化

utf8.char(35302,21160,58,31934,28789) ===》触动:精灵 具体对应去上面网址查询

具体的资料没找到多少  不过库内的函数也很少的


tsp/p4u 是触动/帮你玩开发者平台在开发者上传脚本压缩包时将脚本在线加密生成的脚本格式


checkScriptAuth 脚本类型和授权

有点意思 可以判断当前脚本是什么类型的 是加密后的tsp/p4u 还是 lua源码 checkScriptAuth().type

也可以获得脚本id  checkScriptAuth().id  没再开发者平台生成脚本的 就没有这个 默认-1

或者当前脚本是否授权


仔细看了一下getNetTime()函数  这个函数如果失败返回0 这个情况没注意到

那么我们原来的判断到期时间函数就需要额外的调整一下 加3行代码即可 如果不加 万一断网状态下 这个getNetTime函数返回0 就是1970年 认为当前时间是1970年 那么脚本肯定不会过期了

--脚本是否过期判断 设置过期时间在配置表的config["expireTime"]里面设置 格式是"2019-10-02 12:30:12"或者表{2019,10,2,12,30,12} 开启判断是 config["isExpireTime"] =true
--返回值没有 过期了就弹出窗口然后停止脚本
function isExpireTime()
    return try{
        function ()            
            --下面代码随便写 有可能抛出异常即可            
            local result=-1
            local nowTime
            local expireTime
            nowTime=getNetTime()
            if nowTime==0 then  
                error("无法获取到网络时间 请检查")
            end
            
            expireTime=dataToTimeStamp(config["expireTime"])
            if nowTime>expireTime then
                --过期了                    
                result=1
                traceprint("脚本过期了 请检查")
                dialog("脚本过期了 请检查", 0)
                lua_exit()
            else
                --在试用期内
                result=-1
                traceprint("在试用期内 到期时间[".. tostring(config["expireTime"])  .. "]")
            end        
            --return result
        end,
        catch{
            function (errors)
                --这里对应函数名要改
                local tempStr=""
                tempStr="函数[" .. tostring("isExpireTime") .. "] 错误信息:".. tostring(errors)
                traceprint(tempStr)
                dialog(tempStr, 3)
            end            
        }
    }    
end


inputText的使用

因为触动没有提供类似按键的keypress函数 我们要实现点击del键

for i=1,15 do  --点击15下del键 删除输入框内的内容
     inputText("\b")
     mSleep(10)
end

实现清理文本框内容键

--清理输入框的内容 前提是当前光标已经处于输入框的尾部了
--参数不写 默认删除15下  写了就按照参数数量删除
function clearInputBox(delNum)    
    return try{
        function ()            
            --下面代码随便写 有可能抛出异常即可    
            delNum=tonumber(delNum) or 15--不写就是默认删除15下
            for i=1,delNum do
                inputText("\b")
                mSleep(10)
            end
        end,
        catch{
            function (errors)
                --这里对应函数名要改
                local tempStr=""
                tempStr="函数[" .. tostring("clearInputBox") .. "] 错误信息:".. tostring(errors)
                traceprint(tempStr)
                dialog(tempStr, 3)
            end            
        }
    }
end


了解下 

isFrontApp 判断前台应用    

frontAppBid 获取前台应用   

appBundlePath 获取应用安装路径 

openURL 打开网络地址   这个我记得按键的山海师插件有其他的浏览器的支持 可以去看下 紫猫插件的也有类似的功能

其实本质就是用os.execute执行系统命令 下面是山海师对应的命令源码

function QMPlugin.OpenWeb(url)
     sh_init()
     if url:find(":") == nil then url = "http://"..url end
     os.execute(string.format("am start -a android.intent.action.VIEW -d "..url))
end


小知识 按键精灵下的山海师插件 为我们提供了很多已经写好的lua函数  感谢山海师老师 整个插件都是开源的 有很高的参考价值


顺手把 取文本中间 函数写了下

--取前后两个字符串之间的内容 就是易语言的取文本中间函数
--返回值 没东西返回nil 又符合要求的返回对应字符串
--注意的是前缀后缀里面如果夹杂着正则的元字符 需要转义 不然获取的结果就有误 --还有注意处理的字符串如果出现多个前缀后缀 那么只能取到第一个符合要求的
function getTextCenterStr(str,prefixStr,suffixStr)    
    return try{
        function ()            
            --下面代码随便写 有可能抛出异常即可    
            local result=""
            local tempTable
            str=tostring(str)  prefixStr=tostring(prefixStr)  suffixStr=tostring(suffixStr)
            tempTable=string.match(str,prefixStr .. "(.-)" .. suffixStr)
            result=tempTable
            return result
        end,
        catch{
            function (errors)
                --这里对应函数名要改
                local tempStr=""
                tempStr="函数[" .. tostring("getTextCenterStr") .. "] 错误信息:".. tostring(errors)
                traceprint(tempStr)
                dialog(tempStr, 3)
            end            
        }
    }
end


了解下

getDeviceType 获取设备类型 是真的手机 还是模拟器 还是苹果

getDeviceID 获取触动精灵设备号   代表当前设备的唯一性

getMemoryInfo 获取设备内存信息  主要用来判断当前的内存占用情况 占用太大则清理下内存

getTSVer、getOSVer 获取引擎版本号、获取系统版本号  获取触动版本和当前手机系统版本 因为触动很多函数对系统版本或者触动版本有要求

getOSType 获取设备系统  是安卓还是IOS



了解下

vibrator 手机振动

for var = 1,5 do
     vibrator();                --振动
     mSleep(1000);            --延迟 1 秒
end

播放音频

playAudio 播放音频  stopAudio 停止播放  播放音频之类的 一般常用于提醒用户 脚本出现了问题 或者脚本快结束了 或者其他提醒

注意 mp3文件从编辑器上传到手机 发送都是失败 不明所以 只能整个工程打包上传才可以 不清楚是文件太大不让单独上传还是文件格式不允许上传

--播放音乐
--参数 第一个要音频的完整路径 一般是在 config["userPath"] 文件夹里面 第二个参数单位是秒 不写默认10秒
--支持 配置表 config["systype"] 获取是安卓还是IOS
function playSound(videoPath,limitTime)    
    return try{
        function ()            
            --下面代码随便写 有可能抛出异常即可    
            limitTime=tonumber(limitTime) or 10
            
            if fileExist(videoPath)==false then
             error("[" .. tostring(videoPath) .. "] 无法找到对应文件 请检查")
            end
            
            if config["systype"]=="android" then 
                playAudio(videoPath);    --播放 test.mp3
                mSleep(limitTime*1000)
                stopAudio(); --停止播放
            else
                playAudio(videoPath);    --播放 test.mp3
                mSleep(limitTime*1000)
                playAudio(""); --iOS 停止播放,Android 参考 stopAudio 函数
            end
            
        end,
        catch{
            function (errors)
                --这里对应函数名要改
                local tempStr=""
                tempStr="函数[" .. tostring("playSound") .. "] 错误信息:".. tostring(errors)
                traceprint(tempStr)
                dialog(tempStr, 3)
            end            
        }
    }
end




123