没什么说的
UI部分:
界面1: { 综合: { }, 其他: { 文字框: { 注释:"文字大小、高度、宽度是可选属性,如需使用默认值,可保持值为0或直接删除此属性", 名称:"文字框2", 显示内容:" ", 文字大小:0, 高度:0, 宽度:0 }, 水平布局: { 文字框: { 注释:"文字大小、高度、宽度是可选属性,如需使用默认值,可保持值为0或直接删除此属性", 名称:"文字框1", 显示内容:"功能选择:", 文字大小:0, 高度:0, 宽度:0 }, 下拉框: { 注释:"初始选项是可选属性,默认值为0。模版中设置了三个选项,您可以根据需要增加或减少,注意各选项之间用逗号分隔。", 名称:"功能选择", 点击响应:"函数名1", 选项: [ "完整操作", "截图", ], 初始选项:0 }, }, 多选框: { 注释:"文字大小、高度、宽度是可选属性,如需使用默认值,可保持值为0或直接删除此属性", 名称:"是否开启日志", 提示内容:"是否开启日志", 点击响应:"函数名1", 选中:false, 文字大小:0, 高度:0, 宽度:0 }, }, }
源码:
//==================================================================================================================================================================================================== //插件区 //==================================================================================================================================================================================================== Import "shanhai.lua" Import "zm.luae" //导入插件,只需执行一次 zm.Init //初始化插件,只需执行一次 //================================================================================================================================================================================================ //声明区 //================================================================================================================================================================================================ //1.--[固有变量] Dim imgid,strid,intX,intY,t,tt,ttt dim 本行内容,当前行数,读取结果,当前账号,当前密码,当前状态,账号文件路径,错误代码,起始行数,账号文件内容数组,脚本记录的行数,脚本记录的行内容 Dim 结果,临时变量1,临时变量2,arr,brr,crr,drr,全组,分组 Dim UI界面的参数显示字符串//UI区来获取界面的参数内容并显示出来的变量 Dim 脚本配置() //常见的脚本配置表声明 //2.--[自定义变量] /* //声明的例子 Dim 找图_雷电游戏中心图标=array(33,75,391,236,"Attachment:雷电游戏中心.png","202020",0,0.8,100,"雷电游戏中心图标") Dim 多点找色_商品被选中标志=array(76,96,655,183,"FFFFFF-101010","-3|5|FFFFFF-101010,-4|3|772200-101010,-3|-1|812F02-101010",2,0.85,100,"商品被选中的标志") Dim 多点bi色_上半部分标志=array("38|232|E1833B-202020,69|242|E1833B-202020,52|263|E1833B-202020,31|250|E1833B-202020",0.9,100,"上半部分标志") Dim 点击坐标_主界面_测试按钮=array(100,200) */ Sub declaration() End Sub //================================================================================================================================================================ //配置区 配置下脚本基本的设置 主要是控制脚本的一些功能开启关闭和初始化的一些东西 //================================================================================================================================================================ Sub config() End Sub //1.脚本本身相关 脚本配置["作者"] = "点滴积累" 脚本配置["作者QQ"] = "1847154827" 脚本配置["脚本名称"] = "脚本1" 脚本配置["脚本版本"] = "000000" 脚本配置["脚本备注"] = "夜神模拟器 平板 800 600 版本3.7.5" //2.网络验证相关 一般不开 脚本配置["是否开启简陋网络验证限制"] = false //3.时间限制相关 脚本配置["是否开启时间限制"] = false 脚本配置["时间限制"] = "2018-06-28 11:00:00" //4.网络数据库验证相关 相关部分并没写 也用不上 脚本配置["是否开启网络验证限制"] = false //5.屏幕参数设置 脚本配置["横向分辨率"] = GetScreenX() 脚本配置["纵向分辨率"] = GetScreenY() 脚本配置["DPI"] = Device.GetDPI() 脚本配置["旋转方向"] =GetScreenRotation() //0 没旋转 //1 逆时针旋转90 //2 逆时针旋转180 //3 逆时针旋转270 脚本配置["是否开启缩放"] = false //6.指定的屏幕参数 脚本配置["是否检查屏幕参数"] = false 脚本配置["规定的横向分辨率"] = 720 脚本配置["规定的纵向分辨率"] = 1280 脚本配置["规定的DPI"] = 200 脚本配置["规定的旋转方向"] =0 //7.常用路径 脚本配置["SD卡目录"] = GetSdcardDir() 脚本配置["按键目录"] = GetTempDir() //8.设备相关 脚本配置["设备编号"] = GetDeviceID() //9.日志相关 脚本配置["是否开启日志功能"] = ReadUIConfig("是否开启日志",false) //10.字库相关 脚本配置["是否开启字库"] = false 脚本配置["字库名"] = "Attachment:test字库0.txt|Attachment:test字库1.txt|Attachment:test字库2.txt" 脚本配置["是否只识别前11行"] = false //关闭的话 会匹配范围内全部行 为true则只会匹配前11行 但是相应速度会很快 //11.控制台的设置 脚本配置["控制台位置"] = 0.3 脚本配置["控制台位置是否锁定"] = 0 //为0表示不锁定 为其他则表示锁定 //================================================================================================================================================================ //初始化区 对手机环境简单的获取设置 和 简单的检测 //================================================================================================================================================================ Call 初始化() //=========================================================================================================================== //UI区 接收脚本界面参数进行一定的检测 最后输出下获取的参数 //=========================================================================================================================== Sub UI区() End Sub UI界面的参数显示字符串 = "" /* //普通的参数接收和检测的写法 Dim 测试界面参数1=trim(ReadUIConfig("测试界面参数1","")) If 测试界面参数1 = "" Then Call show("测试界面参数1:[" & 测试界面参数1 & "] 不能为空") Delay 2000 EndScript Else UI界面的参数显示字符串 = UI界面的参数显示字符串 & "测试界面参数1:[" & 测试界面参数1 & "]\n" End If //例子1:输入框普通文件路径的判断的参考例子 dim 文件路径 = ReadUIConfig("文件路径") //先判断文件是否存在 存在才继续不存在停 结果 = Dir.Exist(文件路径) If 结果 = 0 Then Call show(文件路径&" 没有找到对应文件") Delay 2000 EndScript Else UI界面的参数显示字符串 = UI界面的参数显示字符串 & "文件路径:["& 文件路径 &"]\n" End If //例子2:输入框文件路径的判断是否存在不存在则创建的参考例子(文件夹不行) //先判断文件是否存在 存在才继续不存在创建 结果 = Dir.Exist(文件路径) If 结果 = 0 Then Call show(文件路径&" 没有找到对应文件 自动创建") Delay 1000 File.Write 文件路径, "" Delay 1000 End If //创建后再次判断 结果 = Dir.Exist(文件路径) If 结果 = 0 Then Call show(文件路径&" 没有找到对应文件 创建失败") Delay 2000 EndScript Else UI界面的参数显示字符串 = UI界面的参数显示字符串 & "文件路径:[" & 文件路径 & "]\n" End If */ For 2 show UI界面的参数显示字符串 Delay 2000 Next //=========================================================================================================================== //测试区 要调试的代码在这个地方 最后以endscript结尾 //=========================================================================================================================== Sub test() End Sub //测试内容写这里 //EndScript 临时变量1 = ReadUIConfig("功能选择") If 临时变量1 = 0 Then Call 截图(GetSdcardDir()) EndScript ElseIf 临时变量1 = 3 Then For 10 ShowMessage Sys.GetFront() Delay 2000 Next EndScript End If //================================================================================================================================================ //准备区 脚本的正式代码之前的一些检测 比如时间检测 网络检测等等 //================================================================================================================================================ Sub 准备区() End Sub //1 检测分辨率设置 If 脚本配置["是否检查屏幕参数"] Then Call 检测分辨率() End If //2.时间检测 If 脚本配置["是否开启时间限制"] Then Call 时间限制检测() End If //3.简易网络检测 需要调整控制博文的源代码内容 If 脚本配置["是否开启简陋网络验证限制"] Then Call 简陋网络验证() End If //================================================================================================================================================ //正式代码区 脚本的正式代码 完整代码写在这里 //================================================================================================================================================ Sub formal() End Sub /* //例子:遍历读取账号文件内容 并且具备记忆功能 自动从上次的位置开始 不是粗暴的执行一个删除一个账号的处理 而是把记忆写到脚本配置里面 //1.读取账号文件内容 //2.对账号文件做基础的判断和处理 文件是否存在 内容是否对 是否去掉了可能的Bom头和乱码 去掉空行等等 这里粗略的写一写 //3.获取账号文件内容转化为数组 账号文件内容数组 = file.ReadLines(账号文件路径) //4.读取脚本本身的配置 看看是否记录了上次的行数和对应的行内容 判断里面的内容是否正常 不正常就从第一行开始 正常就按照脚本配置的内容进行 起始行数=0 脚本记录的行数 = ReadConfig("脚本记录的行数") 脚本记录的行内容 = ReadConfig("脚本记录的行内容") If Trim(脚本记录的行数) = "" or Trim(脚本记录的行内容) = "" Then //如果脚本记录的上次的行数和行内容为空 那么这个记录就不合法 就从第一行开始了 起始行数 = 0 showmessage "起始记录是第["&cstr(起始行数+1)&"]条" Delay 500 ElseIf not IsNumeric(Trim(脚本记录的行数)) or CInt(Trim(脚本记录的行数)) < 0 Then //脚本记录de阿上次的行数是不是数值 不是则不合法 起始行数 = 0 showmessage "起始记录是第["&cstr(起始行数+1)&"]条" Delay 500 ElseIf InStr(1, Trim(账号文件内容数组(CInt(脚本记录的行数))), 脚本记录的行内容) < 1 Then //脚本记录的行数和行内容 在现在读取的账号文件的对应行上的内容 是否和脚本记录的行内容一致 不一致证明这个账号文件有变动 就从第一行开始 起始行数 = 0 showmessage "文件内容变动 起始记录是第{"&(起始行数+1)&"}条 " Delay 500 Else 起始行数 = CInt(Trim(脚本记录的行数)) showmessage "起始记录是第["& cstr(脚本记录的行数+1) &"]条" Delay 1000 End If Delay 1000 //5.开始读取账号 读取前 把当前行数和行内容写入到脚本配置做记录 For i = 起始行数 To UBOUND(账号文件内容数组) //注意i不是从0开始的 就是说不一定是从第一行开始的 Rem 主循环开头 把当前行数和行内容写入到脚本配置里面 作为记录 当前行数 = i 本行内容 = trim(账号文件内容数组(i)) WriteConfig "脚本记录的行数", CStr(当前行数), true WriteConfig "脚本记录的行内容", 本行内容, true //第三个参数必须为true 分析出账号和密码 准备给脚本操作提供准备 arr = Split(本行内容, "----") 当前账号 = Trim(arr(0)) 当前密码 = Trim(arr(1)) If 当前账号 = "" or 当前密码 = "" Then //简单判断下账号密码合法性 不合法就直接跳到下个账号进行操作 goto 主循环结尾 End If 一些必要的脚本操作 这里暂时用个循环代替 For 10 ShowMessage "第[" & CStr(当前行数 + 1) & "]行-账号[" & 当前账号 & "]-密码[" & 当前密码 & "] 进行登录签到." Delay 10 ShowMessage "第[" & CStr(当前行数 + 1) & "]行-账号[" & 当前账号 & "]-密码[" & 当前密码 & "] 进行登录签到.." Delay 10 ShowMessage "第[" & CStr(当前行数 + 1) & "]行-账号[" & 当前账号 & "]-密码[" & 当前密码 & "] 进行登录签到..." Delay 1000 Next Rem 主循环结尾 Delay 10 Next //6 整个读取账号循环完毕不要忘记重置下脚本配置让脚本下次从第一行开始 ShowMessage "账号到底 重置记忆" WriteConfig "脚本记录的行数", "", true WriteConfig "脚本记录的行内容", "", true //第三个参数必须为true Delay 2000 */ //============================================================================================================================================================================ //函数区 //============================================================================================================================================================================ /* 作用:在屏幕上显示信息和脚本内反馈信息 如果参数是数租 那么可以设置屏幕显示位置 如果只想显示屏幕而不要脚本反馈以后再设置 实例: //call show(array("hello",500,400)) --让显示指定显示的坐标位置显示 //call show("hello") --简单的显示指定内容 */ Function show(显示数组或显示内容) //检测下参数是否是数组 不是数组是字符串 则直接显示这个字符串即可 是数租表示要指定显示位置 If IsArray(显示数组或显示内容) Then If IsNumeric(显示数组或显示内容(1)) and IsNumeric(显示数组或显示内容(2)) Then ShowMessage 显示数组或显示内容(0), 500, CInt(显示数组或显示内容(1)), CInt(显示数组或显示内容(2)) TracePrint 显示数组或显示内容(0) Else ShowMessage 显示数组或显示内容(0) TracePrint 显示数组或显示内容(0) End If Else ShowMessage 显示数组或显示内容 TracePrint 显示数组或显示内容 End If End Function /* 作用:封装的自用的找图 参数直接用抓抓生成的参数 除了intX,intY其他的无脑复制 构建成1个数组作为参数 FindPic 0, 0, 0, 0, "Attachment:主界面_登录按钮.png", "000000", 0, 0.9, intX, intY ->抓抓生成的代码->dim 主界面_登录按钮=array(0, 0, 0, 0, "Attachment:Screenshot_2017-11-11-22-39-24.png", "000000", 0, 0.9,100,"主界面_登录按钮")->最后2个参数 一个是给循环找图用的每次找图的间隔时间 单位毫秒,最后一个是这个找的是什么图 参数:一个数组 数组结构如下 前8个元素直接从抓抓复制自动生成的代码 第九个是循环找图专用的 用来规定找图的间隔 单位毫秒 第十个参数 就是图片是找的什么图 找到后会反馈提示 返回值:返回-1表示没找到 大于-1表示找到了 可能是0 1 23456等等 对应不同的图 因为可以同时找多图 找到的坐标回到intX,intY里面了 找到的图片序号是在imgid里面 建:图片名字 和 变量名字最好统一下 免得出现混乱 */ Function 找图(找图数组) Dim 结果,全组,分组 imgid = -1 //重置下这个变量 避免上面找图留下的值 结果 = FindPic(找图数组(0),找图数组(1),找图数组(2),找图数组(3),找图数组(4),找图数组(5),找图数组(6),找图数组(7),intX,intY) If 结果 > -1 Then 全组 = Split(找图数组(4), "|") //分析出当前找到的是哪个图片 对应的图片名字 TracePrint "找图:=[" & Replace(全组 (结果),"Attachment:","",1) & "]=[找到]了,序号[" & 结果 & "],坐标[" & cstr(intX) & ", " & cstr(intY) &"]" Else TracePrint "找图:-<" & 找图数组(9) & ">- 都没找到" End If //返回值 找图=结果 imgid=结果 End Function Function 循环找图(找图数组, 最大循环时间) Dim 结果,全组,分组,t t = TickCount() 结果 = -1 Do If TickCount() - t > 最大循环时间 * 1000 Then Exit do End If 结果 = FindPic(找图数组(0),找图数组(1),找图数组(2),找图数组(3),找图数组(4),找图数组(5),找图数组(6),找图数组(7),intX,intY) If 结果 > -1 Then Exit Do//出口 End If //循环找图间隔 If CInt(找图数组(8)) > 10 Then Delay CInt(找图数组(8)) Else Delay 100//默认100毫秒间隔 End If Loop //这路判断下循环找图结果 imgid=-1 //重置imgid全局变量 If 结果 > -1 Then 全组 = Split(找图数组(4), "|") //分析出当前找到的是哪个图片 对应的图片名字 TracePrint "循环找图:=[" & Replace(全组 (结果),"Attachment:","",1) & "]=[找到]了,序号[" & 结果 & "],坐标[" & cstr(intX) & ", " & cstr(intY) &"]" Else TracePrint "循环找图:-<" & 找图数组(9) & ">- 都没找到" End If //返回值 imgid= 结果 循环找图 = 结果 End Function Function 多点bi色(多点bi色数组) Dim 全组,分组,当前横坐标,当前纵坐标,是否找到 是否找到 = -1 //简单判断下数组参数是否是多点bi色的 是才继续 不是则提示 避免多点找色参数写道了这里的冲突 If not IsNull(多点bi色数组(4)) Then TracePrint "多点bi色 -<参数数组错误>-" EndScript End If If CmpColorEx(多点bi色数组(0),多点bi色数组(1)) = 1 Then //分析出要点击的坐标 全组 = Split(多点bi色数组(0), ",") 分组 = Split(全组(0), "|") 当前横坐标 = CInt(分组(0)) 当前纵坐标 = CInt(分组(1)) intX = 当前横坐标 intY = 当前纵坐标 TracePrint "多点bi色 =["& 多点bi色数组(3) &"]= 找到了 坐标["& cstr(intX) &":"& cstr(intY) &"]" 多点bi色 = 1 Else TracePrint "多点bi色 -<"& 多点bi色数组(3) &">- 找不到" 多点bi色 = -1 End If End Function Function 循环多点bi色(多点bi色数组, 最大循环时间) Dim t,是否找到,全组,分组,当前横坐标,当前纵坐标 是否找到=-1 //初始值为-1 表示没找到 //简单判断下数组参数是否是多点bi色的 是才继续 不是则提示 避免多点找色参数写道了这里的冲突 If not IsNull(多点bi色数组(4)) Then TracePrint "循环多点bi色 -<参数数组错误>-" EndScript End If t = TickCount() Do If TickCount() - t > 最大循环时间 * 1000 Then Exit Do End If If CmpColorEx(多点bi色数组(0), 多点bi色数组(1)) = 1 Then 是否找到 = 1 Exit Do//跳出 End If //循环间隔 If CInt(多点bi色数组(2)) > 10 Then Delay CInt(多点bi色数组(2)) Else Delay 100//默认100毫秒间隔 End If Loop //这里判断下结果 If 是否找到 > -1 Then //分析出要点击的坐标 全组 = Split(多点bi色数组(0), ",") 分组 = Split(全组(0), "|") 当前横坐标 = CInt(分组(0)) 当前纵坐标 = CInt(分组(1)) intX = 当前横坐标 intY = 当前纵坐标 TracePrint "多点bi色 =["& 多点bi色数组(3) &"]= 找到了 坐标["& cstr(intX) &":"& cstr(intY) &"]" Else TracePrint "多点bi色 -<"& 多点bi色数组(3) &">- 找不到" End If 循环多点bi色=是否找到 End Function Function 多点找色(多点找色数组) If IsNull(多点找色数组(4)) Then TracePrint "多点找色 -<参数数组错误>-" EndScript End If FindMultiColor 多点找色数组(0),多点找色数组(1),多点找色数组(2),多点找色数组(3),多点找色数组(4),多点找色数组(5),多点找色数组(6),多点找色数组(7),intX,intY If intX > -1 And intY > -1 Then TracePrint "多点找色 =["& 多点找色数组(9) &"]= 找到了 坐标["& cstr(intX) &":"& cstr(intY) &"]" 多点找色 = 1 Else TracePrint "多点找色 -<"& 多点找色数组(9) &">- 找不到" 多点找色 = -1 End If End Function Function 循环多点找色(多点找色数组, 最大循环时间) Dim t,是否找到,全组,分组,当前横坐标,当前纵坐标 是否找到=-1 //初始值为-1 表示没找到 If IsNull(多点找色数组(4)) Then TracePrint "多点找色 -<参数数组错误>-" EndScript End If t = TickCount() Do If TickCount() - t > 最大循环时间 * 1000 Then Exit Do End If FindMultiColor 多点找色数组(0), 多点找色数组(1), 多点找色数组(2), 多点找色数组(3), 多点找色数组(4), 多点找色数组(5), 多点找色数组(6), 多点找色数组(7), intX, intY If intX > -1 And intY > -1 Then 是否找到 = 1 Exit Do End If //循环间隔 If CInt(多点找色数组(8)) > 10 Then Delay CInt(多点找色数组(8)) Else Delay 100//默认100毫秒间隔 End If Loop //这里判断下结果 If 是否找到 > -1 Then TracePrint "循环多点找色 =["& 多点找色数组(9) &"]= 找到了 坐标["& cstr(intX) &":"& cstr(intY) &"]" Else TracePrint "循环多点找色 -<"& 多点找色数组(9) &">- 找不到" End If 循环多点找色=是否找到 End Function /* 切换字库操作和字库设置都要在别处处理 本函数内不处理这个 判断检测识字结果本函数内部也不处理后面自行判定 复杂的识字不要用这个函数了 还是 注:识字找字尽量范围小点 不然识字找字都会出问题 一定要用指定的颜色和偏色做字库 如果对应的颜色和偏色变化了 那么字库基本要重做 */ Function 识字(识字数组) Dim ocrchar ocrchar=Ocr(识字数组(0),识字数组(1),识字数组(2),识字数组(3),识字数组(4),识字数组(5)) TracePrint "识字=["& 识字数组(6) &"]= 识别结果=["& ocrchar &"]=" 识字=ocrchar End Function //一定要用指定的颜色和偏色做字库 如果对应的颜色和偏色变化了 那么字库基本要重做 Function 找字(找字数组) Dim 找字结果=-1 Dim 全组,分组 strid=-1 找字结果=FindStr(找字数组(0),找字数组(1),找字数组(2),找字数组(3),找字数组(4),找字数组(5),找字数组(6),intX,intY) If intX > -1 And intY > -1 Then //把找字的字符串分解下 如果是找单字 就直接输出整个内容 全组 = Split(找字数组(4), "|") TracePrint "找字 =["& 找字数组(7) &":" & 全组(找字结果) & "]=找到了 坐标["& cstr(intX) &","& cstr(intY) &"]" 找字结果 = 1 strid=找字结果 Else TracePrint "找字 -<" & 找字数组(7) & ">-没找到" End If 找字 = 找字结果 End Function Function 单点找色(单点找色数组) Dim 序号 //全屏查找颜色FFFFFF-101010与123456 序号 = FindColor(单点找色数组(0),单点找色数组(1),单点找色数组(2),单点找色数组(3),单点找色数组(4), 单点找色数组(5), 单点找色数组(6), intX,intY) If 序号 > -1 Then TracePrint "单点找色 "&单点找色数组(7)&"--找到的颜色序号为: "&序号&"--坐标为:", intX & ", " & intY Else TracePrint "单点找色 -<" & 单点找色数组(7) & ">-没找到" End If 单点找色=序号 End Function Function 等待多点找色消失(多点找色数组,等待时间) //间隔默认设置为100毫秒把 For cint(等待时间*10) If 多点找色(多点找色数组) = -1 Then Exit For End If Delay 100 Next End Function Function 等待多点bi色消失(多点bi色数组,等待时间) //间隔默认设置为100毫秒把 For cint(等待时间*10) If 多点bi色(多点bi色数组) = -1 Then Exit For End If Delay 100 Next End Function /* //作用 点击某个坐标 类似tap intX,intY 但是支持tapX array(100,200) tapX "100,200"的格式 注意不支持tapX intX,intY */ Function 点击坐标(坐标信息) Dim t,tt,全组,分组,x,y //1.判断参数类型 数组 或者字符串 字符串中 If IsArray(坐标信息) Then If IsNull(坐标信息(0)) or IsNull(坐标信息(1)) or not IsNumeric(坐标信息(0)) or not IsNumeric(坐标信息(1)) then TracePrint "tapX-:<点击参数有问题>" Else x = CInt(坐标信息(0)) y = CInt(坐标信息(1)) Tap x, y TracePrint "tapX-:点击["&cstr(x)&","&cstr(y)&"]" End If Else /**/ //参数是字符串 全组 = Split(坐标信息, ",") x = 全组(0) y = 全组(1) //简单判断 If IsNull(全组(0)) or IsNull(全组(1)) or not IsNumeric(全组(0)) or not IsNumeric(全组(1)) then TracePrint "tapX-:<点击参数有问题>" Else x = CInt(x) y = CInt(y) Tap x, y TracePrint "tapX-:点击["&cstr(x)&","&cstr(y)&"]" End if End If End Function Function 文本文件格式化操作(文件路径) Dim 读取内容 读取内容 = Trim(file.Read(文件路径)) //判断开头3个字符是否是bom头 If Mid(读取内容, 1, 3) = Chr(239) & Chr(187) & Chr(191) Then //有则替换为空 然后重新写入内容 这个地方不确定是否除了第一行之外还可能存在bom头 应该没那么巧 file.Write 文件路径, Replace(读取内容, Chr(239) & Chr(187) & Chr(191), "") End If //如果txt里面最后不是以\r\n结尾的 就自动添加一个回车换行符 来实现这个 也解决了替换最后一行 不写\r\n会替换找不到的情况 If trim(读取内容)<>""and Right(读取内容, 2) <> "\r\n" Then file.Write 文件路径, 读取内容 & "\r\n" End If End Function /*TracePrint FindMultiColorEX(多点找色_钱标志,0,10,"在线标志")*/ Function FindMultiColorEX(arr,找图缩小方向,找图缩小幅度,remark) //x1,y1,x2,y2,第一颜色,偏移颜色组,方向,相似度,找图缩小方向,找图缩小幅度,remark Dim str,i,x1,y1,x2,y2,第一颜色,偏移颜色组,方向,相似度 //array(214,231,425,436,"0000CE-202020","-4|-3|0000F5-202020,4|4|0000CC-202020,7|8|0000A8-202020,-4|19|0000A2-202020,-9|11|0000AE-202020,-14|15|0000A2-202020,-2|-7|0000F5-202020,-4|-5|0000F6-202020,6|1|0000CC-202020",0,0.85,0,0,50,"陈列界面_XX标志") x1 = arr(0) y1 = arr(1) x2 = arr(2) y2 = arr(3) 第一颜色 = arr(4) 偏移颜色组 = arr(5) 方向 = arr(6) 相似度 = arr(7) str="" i=0 // 我循环多点找色 每次找完后如果找到符合要求的 我都会根据找到的坐标缩小下次的查找范围 直到找不到就跳出循环即可 Do intX=-1:intY=-1 //每次循环重置下2个变量 FindMultiColor x1, y1, x2, y2, 第一颜色, 偏移颜色组, 方向, 相似度, intX, intY If intX>-1 And intY>-1 Then //找到了符合要求的 就把范围缩小 然后对这个缩小的范围继续的找这个特征码 //判断下是不是第一个 是第一个写法就不大相同了 If i = 0 Then //这里还要多判断下remark是否为空 为空的话自然正常写 不为空的话需要多加1个变量到字符串里 If Trim(remark) = "" Then str=intX&","&intY Else str=remark&","&intX&","&intY End If Else If Trim(remark) = "" Then str=str&"|"&intX&","&intY Else str=str&"|"&remark&","&intX&","&intY End If End If //判断下找图的缩小方向 If 找图缩小方向 = 0 Then x1 = intX + 找图缩小幅度 Else y1 = intY + 找图缩小幅度 End If //这是新添加的代码 多点找色函数有个问题 1140, 67, 1138, 90 这样的范围依然可以找到东西 好奇怪 而不是返回-1来表示已经无法继续寻找了 If (x1 >= x2) or (y1 >= y2) Then Exit do End If Else Exit Do End If i = i + 1 Delay 50 Loop FindMultiColorEX=str End Function Function 找图X(arr,找图缩小方向,找图缩小幅度,remark) Dim str,i,x1,y1,x2,y2,图片信息,偏移颜色组,方向,相似度 x1 = arr(0) y1 = arr(1) x2 = arr(2) y2 = arr(3) 图片信息 = arr(4) 偏移颜色组 = arr(5) 方向 = arr(6) 相似度 = arr(7) str="" i=0 //我循环多点找色 每次找完后如果找到符合要求的 我都会根据找到的坐标缩小下次的查找范围 直到找不到就跳出循环即可 Do intX=-1:intY=-1 //每次循环重置下2个变量 FindPic x1, y1, x2, y2, 图片信息, 偏移颜色组, 方向, 相似度, intX, intY If intX>-1 And intY>-1 Then //判断下是不是第一个 是第一个写法就不大相同了 If i = 0 Then //这里还要多判断下remark是否为空 为空的话自然正常写 不为空的话需要多加1个变量到字符串里 If Trim(remark) = "" Then str=intX&","&intY Else str=remark&","&intX&","&intY End If Else If Trim(remark) = "" Then str=str&"|"&intX&","&intY Else str=str&"|"&remark&","&intX&","&intY End If End If //判断下找图的缩小方向 If 找图缩小方向 = 0 Then x1 = intX + 找图缩小幅度 Else y1 = intY + 找图缩小幅度 End If //这是新添加的代码 多点找色函数有个问题 1140, 67, 1138, 90 这样的范围依然可以找到东西 好奇怪 而不是返回-1来表示已经无法继续寻找了 If (x1 >= x2) or (y1 >= y2) Then Exit do End If Else //TracePrint i & "未找到颜色点坐标为", colX, colY //如果多大的范围都无法找到 那么就是直接退出循环 Exit Do End If i = i + 1 Delay 50 Loop 找图X=str End Function Function 时间检测(过期时间) Dim 当前网络时间=GetNetworkTime() TracePrint 当前网络时间 TracePrint 过期时间 If 过期时间 < 当前网络时间 Then ShowMessage "当前已过期 脚本停止" TracePrint "当前已过期 脚本停止" Delay 2000 EndScript Else TracePrint "尚未过期" End If End Function /* 作用:用字典二维数组来进行米字决识字的函数 如果字库无法准确识别 可以考虑这个功能 //注意:该函数用到了findmulticolorEX函数 万一该函数有变化 可能会影响到本函数的使用 //参数1:是一个识字的范围和颜色偏色的一个数组 参考多点找色的参数 基本一样 //参数2:dict 是一个二维数组 是要辨识的多点找色特征码集合 //参数3 :缩小方向为0 或者1 为0则横向缩小 为1则为纵向缩小 //参数4 缩小幅度 一般设置为10即可 //返回值:是识别出来的字符串 例子 dict=array( _ Array("0","F0F0F0","0|22|F3F3F3,-6|11|F3F3F3,6|11|F3F3F3,-4|2|F3F3F3,5|3|F3F3F3,4|20|F3F3F3,-4|20|F3F3F3,0|11|000000"), _ Array("1","F2F2F2","5|0|F3F3F3,5|10|F2F2F2,5|20|F2F2F2,2|3|000000,2|21|000000,2|0|F3F3F3,5|6|F2F2F2,5|14|F2F2F2"), _ Array("2","F3F3F3","2|-3|F3F3F3,5|-4|F2F2F2,10|-1|F3F3F3,7|7|F2F2F2,3|12|F2F2F2,0|17|F3F3F3,5|1|000000,10|17|F2F2F2"), _ Array("3","F3F3F3","5|-3|F1F1F1,10|2|F2F2F2,2|7|5C5C5C,5|19|F3F3F3,10|13|F0F0F0,0|15|F3F3F3,5|13|000000,5|3|000000"), _ Array("4","F3F3F3","0|14|F3F3F3,0|19|F2F2F2,3|14|F2F2F2,-9|13|F3F3F3,-3|10|000000,-10|-1|000000,-3|17|000000,4|11|000000"), _ Array("5","F3F3F3","8|0|F3F3F3,3|3|000000,-1|5|F1F1F1,-1|9|F3F3F3,4|14|000000,10|14|F3F3F3,4|21|F3F3F3,-1|14|000000"), _ Array("6","F2F2F2","0|9|F3F3F3,0|22|F3F3F3,-1|15|000000,0|5|000000,5|14|F3F3F3,-7|14|F2F2F2,-5|3|F3F3F3,4|5|000000"), _ Array("7","EDEDED","12|1|F3F3F3,8|7|F2F2F2,6|4|000000,6|11|F3F3F3,5|19|F3F3F3,0|11|000000,1|20|000000,8|20|000000"), _ Array("8","F1F1F1","0|10|ECECEC,0|22|F3F3F3,0|16|000000,0|5|000000,-6|5|F2F2F2,5|5|F3F3F3,6|16|F3F3F3,-6|16|F3F3F3"), _ Array("9","F0F0F0","0|13|ECECEC,-3|21|ECECEC,0|17|000000,-5|17|000000,1|7|000000,6|11|F3F3F3,-5|7|F3F3F3,6|17|F3F3F3") _ ) TracePrint 范围识字(多点找色_测试识字,dict,0,10) */ //参数 范围缩小方向 是规定的是横向缩小范围还是纵向缩小范围 有2个值为0 或者为1 //注意这个识字还不成熟 最好是范围小一点 区域杂色和类似颜色少一点 //为了增加速度这里在识别的时候用了KeepCapture 如果文字是动态的 请根据情况自己修改下 Function 范围识字(arr,dict,范围缩小方向,范围缩小幅度) Dim all_str,nowstr,结果数组1,j,k,brr //开始尝试列出这串字符串的内容 //KeepCapture //是否添加根据自己需要 For j=0 to ubound(dict) //TracePrint "范围识字的循环参数: "&j brr=array(arr(0),arr(1),arr(2),arr(3),dict(j, 1), dict(j, 2),arr(6),arr(7)) nowstr = FindMultiColorEX(brr, 范围缩小方向,范围缩小幅度, dict(j, 0)) //TracePrint nowstr If Trim(nowstr) = "" Then //如果为空 那么不操作 Else //不为空 那么就写入到总字符串里面 all_str=all_str&"|"&nowstr End If Next //TracePrint all_str // ReleaseCapture//对应上面的keepture //开始处理下最终结果 主要是处理下第一个位置的| 去掉即可 If Left(all_str, 1) = "|" Then all_str = Mid(all_str, 2, (Len(all_str) - 1)) End If //TracePrint "初步找到的结果:" & all_str //开始用转变为数组 结果数组1 = Split(all_str, "|") Dim 当前元素,对比元素,arr_1,arr_2 //当前元素自然是为了存放当前的数组元素(该元素也是1个数组 过渡数组就为了短暂存放中间数组 方便两个数组进行交换的) //注意当前元素和对比元素不是数组 只是一个以逗号分隔的字符串而已 //开始准备冒泡排序进行调整数组的元素的顺序 For j = 0 To ubound(结果数组1) - 1 //最后一项没有后一位对比 所以不用了 //开始冒泡 For k = j+1 To ubound(结果数组1) //开始对比 当前元素=结果数组1(j) //必须在这里获取 因为这里的元素值是变动的 一定要 对比元素=结果数组1(k) // TracePrint "对比元素为:-"&对比元素 arr_1 = Split(当前元素, ",") arr_2 = Split(对比元素, ",") //这里有个问题 如果字是纵向排列 和横向排列 那么我们排序的顺序就会不同 If 范围缩小方向 = 0 Then If clng(arr_1(1))>clng(arr_2(1)) then //开始交换 结果数组1(j) = 对比元素 结果数组1(k)= 当前元素 End If Else If clng(arr_1(2))>clng(arr_2(2)) then //开始交换 结果数组1(j) = 对比元素 结果数组1(k)= 当前元素 End If End If //TracePrint Join(结果数组1,"|") Next Next //最后重新输出下整个数组的内容 TracePrint "范围识字结果:"&Join(结果数组1, "|") 范围识字=Join(结果数组1, "|") End Function //Call 定时器("2016-05-20 17:05:50") //不到规定时间 脚本会在这个函数不断的循环 10秒检测一次 Function 定时器(日期时间) Do If DateTime.Format() > Trim(日期时间) Then Exit Do //判断到时间了才会执行后面的内容代码 End If Delay 10000 Loop End Function //该函数产生固定长度的数字字母字符串 随机数字字母字符串(array(0,15)) 或者 随机数字字母字符串(20) Function 随机数字字母字符串(配置数组或者长度数值) Dim arr,str,result If IsArray(配置数组或者长度数值) Then If 配置数组或者长度数值(0) = 0 Then str="a-b-c-d-e-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z-1-2-3-4-5-6-7-8-9-0" arr = Split(str, "-") ElseIf 配置数组或者长度数值(0) = 1 Then str="1-2-3-4-5-6-7-8-9-0" arr = Split(str, "-") ElseIf 配置数组或者长度数值(0) = 2 Then str="a-b-c-d-e-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z" arr = Split(str, "-") End If Else str="a-b-c-d-e-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z-1-2-3-4-5-6-7-8-9-0" arr = Split(str, "-") End If //35个字符 For cint(配置数组或者长度数值(1)) result=result&arr(cint(随机数(0,ubound(arr)))) Delay 10 Next TracePrint "得到的随机字符串为: " & result 随机数字字母字符串=result End Function Function 初始化() Dim 结果,字库数组 //1.屏幕常亮状态 KeepScreen true //2.设置控制台的位置 SetControlBarPos 脚本配置["控制台位置"], 脚本配置["控制台位置是否锁定"] //3.开头调用一次即可 和rnd配合的 Randomize //4.日志设置 If 脚本配置["是否开启日志功能"] Then Log.Open TracePrint "==[本次日志开启]==" Else Log.Close End If //5.字库设置 If 脚本配置["是否开启字库"] Then If not 脚本配置["是否只识别前11行"] Then SetRowsNumber (0)//他和SetDictEx配合 字库数组=Split(脚本配置["字库名"],"|") For i = 0 To UBOUND(字库数组) If Trim(字库数组(i)) <> "" Then TracePrint SetDictEx(i, Trim(字库数组(i))) //设置字库 End If Next TracePrint UseDict(0) //调用0号字库为当前字库 Else 字库数组=Split(脚本配置["字库名"],"|") For i = 0 To UBOUND(字库数组) If Trim(字库数组(i)) <> "" Then TracePrint SetDict(i, Trim(字库数组(i))) //设置字库 End If Next TracePrint UseDict(0) //调用0号字库为当前字库 End If End If //6.缩放设置 //受影响命令有: Tap 短暂点击、Touch 按住一段时间、TouchDown 按住不放、TouchMove 模拟滑动、Swipe 模拟划动、GetPixelColor 得到指定点颜色、FindColor 寻找颜色、CmpColor 对比指定点颜色、CmpColorEx 对比多个点颜色、FindMultiColor 多点找色。 If 脚本配置["是否开启缩放"] Then Select Case GetScreenX() / GetScreenY() Case 800/1280 //1600X2560 1200X1920 800X1280 600X960 TracePrint "采取了10:16的比例缩放" // SetScreenScale 800, 1280 Case 480 / 640 TracePrint "采取3:4的比例缩放" // SetScreenScale 480, 640 Case 480 / 800 //1536X2560 1080X1800 768X1280 480X800 TracePrint "采取3:5的比例缩放" // SetScreenScale 480, 800 Case 9 / 16 //1440X2560 1080X1920 720X1280 540X960 TracePrint "采取9:16的比例缩放" //SetScreenScale 480, 800 Case Else //海马玩模拟器是1280 720 和上面不同的 所以放到这里来了 TracePrint "不符合规定的分辨率 无法缩放" // SetScreenScale 1280, 720 End Select Else End If End Function Sub OnScriptExit() For 2 Call show("联系QQ: ["&脚本配置["作者QQ"]&"]") Delay 2000 Next TracePrint "==[本次日志关闭]==" End Sub Function 时间限制检测() dim 网络时间=智能获取官方网络时间() If Trim(网络时间) <> "" and InStr(1, Trim(网络时间), "-") > 1 and InStr(1, Trim(网络时间), ":") > 1 Then //开始判断是否过期 If Trim(网络时间) > 脚本配置["时间限制"] Then Call show("超出试用期") Delay 1000 EndScript Else Call show("您的试用截至到:["&脚本配置["时间限制"]&"]") Delay 1000 End If Else Call show("无法获取网络时间") Delay 1000 EndScript End If End Function Function 智能获取官方网络时间() Dim 当前网络时间,网络时间,变量,是否获取到网络时间,t 当前网络时间 = "" 网络时间 = "" 变量="" 是否获取到网络时间 = 0 //114如果没获取到 则擦开始第二个官网网络时间 Do If TickCount() - t > 1 * 60 * 1000 Then Call show("1分钟无法获取网络时间 脚本停止") Delay 1000 EndScript End If 网络时间 = "" 网络时间 = GetNetworkTime() If trim(网络时间) <> "" and InStr(1, 网络时间, "-") > 1 And InStr(1, 网络时间, " ") > 1 And InStr(1, 网络时间, ":") > 1 Then 智能获取官方网络时间 = 网络时间 //是否获取到网络时间=1 //表示下面获取就不用获取了 Call show("按键官方:" & 网络时间) Delay 500 Exit Do End If //山海师的获取网络时间 /**/ 网络时间 = "" 网络时间 = shanhai.GetNetTime() If trim(网络时间) <> "" and InStr(1, 网络时间, "-") > 1 And InStr(1, 网络时间, " ") > 1 And InStr(1, 网络时间, ":") > 1 Then 智能获取官方网络时间 = 网络时间 //是否获取到网络时间=1 //表示下面获取就不用获取了 Call show("山海师::" & 网络时间) Delay 500 Exit Do End If Delay 1000 Loop End Function Function 简陋网络验证() Dim 网页源代码,控制字符串,当前脚本名 //初始化3个局部变量 赋初值 网页源代码="" 控制字符串 = "" 当前脚本名 = 脚本配置["脚本名"] //这个指定地址是我博客上的一篇博文的地址 后面加上 随机数的原因是为了 避免 网页缓存 才加上随机数的 网页源代码=url.Get("http://blog.sina.com.cn/s/blog_acaaccbf0102xoji.html?test123=" & cstr(随机数(10,1000)),10) //判断是否得到了正确的源代码 源代码里面应该有 点滴积累 这四个字 有这4个字表示的确是我自己的博客的博文 If UTF8.InStr(1, 网页源代码, "点滴积累") > 1 Then //开始进一步查找 是否存在该脚本的名字 如果存在则取出该脚本对应的控制字符串 If UTF8.InStr(1, 网页源代码, trim(当前脚本名)) > 1 Then //开始提取控制字符串 控制字符串 = 取文本中间("[" & Trim(当前脚本名) & "]", "[/" & Trim(当前脚本名) & "]", 网页源代码) If Trim(控制字符串) = "否" Then For 5 Call show("当前脚本被限制 请联系作者QQ["&脚本配置["作者QQ"]&"]") Delay 1000 Next EndScript End If End if End If End Function //使用下面函数 返回值要int()下 免得出现提示警告 Function 随机数(最小值,最大值) Dim 结果 结果 = Int((最大值 - 最小值 + 1) * Rnd() + 最小值) 随机数=结果 End Function Function delayR(t) Delay cint(随机数(cint(t*0.8),cint(t*1.2))) End Function Sub 清理文本框(width) For cint(width) KeyPress "del" Delay 20 Next End Sub ' Arr = Array (100,100,100,200,null,50,"滑动") ' 结果 = TouchDMU (Arr) Sub TouchDMU(arr) Dim s,t,isPrint isPrint=1 If IsNull(arr(4)) Then arr(4) = 50 If IsNull(arr(5)) Then arr(5) = 50 TouchDownEvent arr(0), arr(1), 0 Delay arr(5) Do arr(0) = CInt(arr(0) + (arr(2) - arr(0)) / 2) arr(1) = CInt(arr(1) + (arr(3) - arr(1)) / 2) TouchMoveEvent arr(0), arr(1), 0, arr(5) Loop Until Sqr((arr(2) - arr(0)) ^ 2 + (arr(3) - arr(1)) ^ 2) < 20 TouchMoveEvent arr(2), arr(3), 0, arr(5) TouchUpEvent 0 If IsNull(arr(6)) = False And isPrint = 1 Then TracePrint "TouchDMU:",arr(6) TracePrint "坐标与时间:", arr(0), arr(1), arr(2), arr(3), arr(4), arr(5) End If End Sub
Function 取文本中间(开始字符串,结束字符串,完整字符串) Dim 开始字符串位置,结束字符串位置,过渡字符串//过渡字符串用来承接半路获取的部分完整字符串 开始字符串位置 = cint(UTF8.InStr(1, 完整字符串, 开始字符串)) //判断下 开始字符串位置 是否大于0 如果小于等于0那么久返回个空字符串 If 开始字符串位置 > 0 Then //能找到开始字符串 先把完整字符串缩小 缩小检测范围 过渡字符串=UTF8.Mid(完整字符串, 开始字符串位置+utf8.len(开始字符串), utf8.len(完整字符串)-开始字符串位置-utf8.len(开始字符串)+1) //TracePrint 过渡字符串 //然后以这个过渡字符串为准查找结束字符串 结束字符串位置 = cint(UTF8.InStr(1, 过渡字符串, 结束字符串)) If 结束字符串位置 > 0 Then 取文本中间=UTF8.Mid(过渡字符串, 1, 结束字符串位置-1) Else 取文本中间="" End If Else 取文本中间="" End If End Function Function 逆向取文本中间(开始字符串,结束字符串,完整字符串) Dim 开始字符串位置,结束字符串位置,过渡字符串//过渡字符串用来承接半路获取的部分完整字符串 结束字符串位置 = cint(UTF8.InStr(1, 完整字符串, 结束字符串)) //TracePrint "结束字符串位置"&cstr(结束字符串位置) //判断下 开始字符串位置 是否大于0 如果小于等于0那么久返回个空字符串 If 结束字符串位置 > 0 Then //能找到开始字符串 先把完整字符串缩小 缩小检测范围 过渡字符串=UTF8.Mid(完整字符串, 1,结束字符串位置+utf8.len(结束字符串)) //TracePrint 过渡字符串 //然后以这个过渡字符串为准查找结束字符串 开始字符串位置 = cint(UTF8.InStrRev(过渡字符串, 开始字符串, 结束字符串位置)) //TracePrint cstr(开始字符串位置) If 开始字符串位置 > 0 Then //TracePrint 开始字符串位置+utf8.len(开始字符串) 逆向取文本中间=UTF8.Mid(过渡字符串, 开始字符串位置+utf8.len(开始字符串), 结束字符串位置-开始字符串位置-utf8.len(开始字符串)) Else 逆向取文本中间="" End If Else 逆向取文本中间="" End If End Function Function 重启指定app(包名) Rem 重启指定app开头 //回到桌面 For 3 KeyPress "Home" Delay 200 Next //判断下 这个app是否开启过 没开启则 // If Sys.IsRunning(包名) Then KillApp 包名 Delay 1500 //给点延迟 让系统有缓和 // End If RunApp 包名 Delay 2000 //启动app给点延迟 //延迟大了之后 可以考虑延迟20秒后判断下是否app处于手机的前台 Sys.AppIsFront("com.tongcheng.android") /* Delay 20000 If not Sys.AppIsFront(包名) Then Goto 重启指定app开头 End If */ Rem 重启指定app结尾 End Function /* 一个截图的函数 图片主要是存放到sdcard目录下的 脚本截图 这个文件夹 参数1 :截图存放目录 不要以/结尾 而且再调用这个函数前 请一定要确保这个路径是存在的 不用每次都判断路径是否存在 只需要在脚本开头判断下即可 */ Function 截图(截图存放目录) Dim t,当前截图文件名,当前截图文件完整路径 //检测下存放目录 不过这个检测最好放到初始化里面检测比较好 当前截图文件名 = DateTime.Format("%Y_%m_%d_%H_%M_%S",time()) & ".png" //TracePrint 当前截图文件名 当前截图文件完整路径 = 截图存放目录 & "/" & 当前截图文件名 SnapShot 当前截图文件完整路径 ShowMessage "截图文件[" & 当前截图文件完整路径 & "]" Delay 500 End Function /*如果出现其他去不掉的bom则可以一个一个字符取出来 转成asc码看看是什么*/ Function 去除bom(文件路径) Dim 读取内容 读取内容 = Trim(file.Read(文件路径)) //判断开头3个字符是否是bom头 If Mid(读取内容, 1, 3) = Chr(239) & Chr(187) & Chr(191) Then //有则替换为空 然后重新写入内容 这个地方不确定是否除了第一行之外还可能存在bom头 应该没那么巧 file.Write 文件路径, Replace(读取内容, Chr(239) & Chr(187) & Chr(191), "") End If End Function Function 输入九宫格密码操作(支付密码) //(1) 先把0-9个数字对应的坐标和 X对应的坐标记录到指定数组 //(2)接收 支付密码 检测是否是6位 是否是数字 然后从左侧开始依次的取以为 判断是哪个数值 找到数值到上面数组里面找到坐标进行点击 Dim t,tt,坐标字符串,当前坐标数组,当前点击横坐标,当前点击纵坐标,当前密码字符 Dim 密码坐标数组//这个要在外面定义 //全部清理下 For 6 Tap 402,769 Delay 100 Next //分解字符串开始依次点击字符 For i=1 to len(支付密码) 坐标字符串 = "" 当前点击横坐标 = -1 当前点击纵坐标 = -1 当前密码字符 = CInt(Mid(支付密码, i, 1)) TracePrint 当前密码字符 坐标字符串 = Trim(密码坐标数组(当前密码字符)) TracePrint 坐标字符串 当前坐标数组 = Split(坐标字符串, ",") 当前点击横坐标 = CInt(Trim(当前坐标数组(0))) 当前点击纵坐标 = CInt(Trim(当前坐标数组(1))) If 当前点击横坐标 > 15 and 当前点击纵坐标 > 400 and 当前点击纵坐标 <= 800 Then Tap 当前点击横坐标, 当前点击纵坐标 Else End If Delay 200 next End Function /* 作用 简单说脚本出现意外和异常就用调用这个函数来进行自我纠错让流程回归正轨 这个函数只是一个思路 根据实际进行变化和改动 脚本流程出现意外和异常 就会调用这个函数 一开始是尝试不重启app在app内部尝试回到一个标准界面 重新开始流程 当时如果还不行就重启app 然后回到app的指定界面 继续脚本执行 这个需要配合 错误代码变量来执行 错误代码为0 则表示没错误 不执行 为其他的话 可以根据错误代码的值进行针对性的操作 不过这里的异常处理函数没有写 参数1:如果级别为0 那么表示 先在app内部进行处理 一顶时间内如果无法达成要求 才考虑进行级别为1的重开模式 */ Function 异常处理操作(处理级别参数) Dim t,tt,可能的界面的条件1,可能的界面的条件2,可能的界面的条件3,找到符合要求的界面的条件 Rem 异常处理操作开头 If 处理级别参数 = 0 Then //app内部异常处理 就是 处理级别参数为0的异常处理 如果这个级别处理不聊才切到下面的级别参数为1的处理办法 t = TickCount() Do If TickCount() - t > 1 * 60 * 1000 Then Exit Do //跳出此循环 开始下面的处理级别为1的异常处理 End If If 找到符合要求的界面的条件 Then //符合要求 跳出整个异常处理即可 Goto 异常处理操作结尾 ElseIf 可能的界面的条件1 Then ElseIf 可能的界面的条件2 Then ElseIf 可能的界面的条件3 Then End If Delay 500 Loop End If //最终手段 就是重置 就是处理级别参数为1的处理方法 重置app KillApp "QQ.tebfxyb.com" Delay 2000 RunApp "QQ.tebfxyb.com" //60秒找不到正确的首页 那么久说明启动失败 从异常处理开头再次执行 t = TickCount() Do If TickCount() - t > 1 * 60 * 1000 Then goto 异常处理操作开头//重开异常处理还是无法解决这个问题 则 继续重开 End If If 找到符合要求的界面的条件 Then //符合要求 跳出整个异常处理即可 Exit Do ElseIf 可能的界面的条件1 Then ElseIf 可能的界面的条件2 Then ElseIf 可能的界面的条件3 Then End If Delay 500 Loop Rem 异常处理操作结尾 End Function /* 作用 : 是用来读取配置文件里面的内容到 配置文件这个table里面 参数1;就是配置文件路径 你懂的 返回值 是返回一个json字符串 解析后是一个表 可以得到指定的配置文件的内容 注意 配置文件里面的内容必须是 如下结构 定义值1 = 111 值 = 222 实例: dim 配置文件=Encode.JsonToTable(读取配置文件到table("/sdcard/Misc/配置.txt")) TracePrint 配置文件["永远不会用到的值"] //只是为了证明配置文件内容传输正常 TracePrint 配置文件["测试"] */ Function 读取配置文件到table(配置文件路径) Dim t,arr,brr Dim 配置文件={"永远不会用到的值":"永远不会用到的值"} //这里要进行下预处理 无非就是去掉bom和末尾添加回车换行符 如果末尾没有以这个结尾的话 Call 文本文件格式化操作(配置文件路径) //先每行读取下到一个数组中 arr = File.ReadLines(配置文件路径) For Each v In arr brr = Split(v, "=") //TracePrint brr(0) If IsNull(brr(1)) Then Else 配置文件[trim(brr(0))]=trim(brr(1)) End If Next 读取配置文件到table=Encode.TableToJson(配置文件) End Function /* 和上面那个对应 但是这个和table没关系了 只是单纯的把指定的key的值写入到配置文件对应的行 如果不存在该配置项则在开头会新添加这个配置项 //参数1 没什么可说的 //参数2 就是要修改的配置项的名字 //参数3 修改的配置项的值 //例子: Call 写入配置文件("/sdcard/配置.txt","姓名","123") */ Function 写入配置文件(配置文件路径,key, value) Dim t,arr,brr,配置文件内容,是否找到配置项 是否找到配置项 = 0 //这里要进行下预处理 无非就是去掉bom和末尾添加回车换行符 如果末尾没有以这个结尾的话 Call 文本文件格式化操作(配置文件路径) //先每行读取下到一个数组中 arr = File.ReadLines(配置文件路径) 配置文件内容 = file.Read(配置文件路径) For Each v In arr brr = Split(v, "=") //TracePrint brr(0) If trim(brr(0))=trim(key) Then 是否找到配置项 = 1 //开始对配置文件内容进行替换 配置文件内容 = Replace(配置文件内容, v, brr(0) & "=" & value) //新内容写入配置文件 file.Write 配置文件路径,配置文件内容 //跳出 Exit For End If Next //如果没有找到符合的 那么自然是要在末尾添加一个新的配置项了 If 是否找到配置项 = 0 Then file.Write 配置文件路径,配置文件内容&key&"="&value&"\r\n" End If End Function Function 替换文件的部分内容(文件路径,修改前状态,修改后状态) Dim 读取结果,结果 读取结果 = File.Read(文件路径) TracePrint 读取结果 //修改当前账号状态 结果 = Replace(读取结果, 修改前状态, 修改后状态,1) TracePrint 结果 //再把新内容写入进去 File.Write 文件路径, 结果 End Function Function 等待找图消失(找图数组,等待时间) //间隔默认设置为100毫秒把 For cint(等待时间*10) If 找图(找图数组) = -1 Then Exit For End If Delay 100 Next End Function Function 检测分辨率() If 脚本配置["是否检查屏幕参数"] Then If (脚本配置["规定的横向分辨率"] <> 脚本配置["横向分辨率"]) or (脚本配置["规定的纵向分辨率"] <> 脚本配置["纵向分辨率"]) or (脚本配置["规定的DPI"] <> 脚本配置["DPI"]) or (脚本配置["规定的旋转方向"] <> 脚本配置["旋转方向"]) Then For 5 show "屏幕参数为:" & 脚本配置["横向分辨率"] & "X" & 脚本配置["纵向分辨率"] & "\nDPI:" & 脚本配置["DPI"] & "\n旋转角度为:" & 脚本配置["旋转方向"]&"\n不合要求 脚本停止" Delay 2000 Next EndScript End If Else show "屏幕参数为:" & 脚本配置["横向分辨率"] & "X" & 脚本配置["纵向分辨率"] & "\nDPI:" & 脚本配置["DPI"] & "\n旋转角度为:" & 脚本配置["旋转方向"] Delay 200 End If End Function /* //记录脚本的历次改动和变化 和对应的版本号 */ Function 脚本更新信息() /* */ End Function Sub 函数区() End Sub
备份一个
百度云 脚本文件地址:
链接:https://pan.baidu.com/s/13v5B2DUaBXRyCCzObUsWDg
提取码:g6ff
复制这段内容后打开百度网盘手机App,操作更方便哦
123