DIY

【山海插件教程】

山海师[山海学院院长] [教职工号:GK04] Rank: 16Rank: 16Rank: 16Rank: 16 独家品牌学院 果壳热大导师 果壳热教职工 果壳学长 果壳币: 159

发表于 2020-7-20 22:24:37 | 0 条回复 | 445 次浏览

【山海插件教程】

【山海插件教程】



1字符串处理

引言:给大家介绍下山海插件中的关于字符串处理命令的使用方法,希望对大家了解命令有所帮助。


目前插件中字符串处理命令主要有:
LTrimExRTrimExTrimExDelPartStrDelFilStrCountStr


过滤前导、后导字符串:LTrimEx、RTrimEx、TrimEx

这三个命令都是用来过滤字符串中的前面或者后面所包含的指定的字符的。,所以这里就一起介绍功能
命令名称:LTrimEx
命令功能:过滤前导字符, 删除字符串从左到右开始有包含指定过滤的字符
参数:参数1【必要】:字符串,需要操作的字符串
参数2【必要】:字符串,指定过滤的字符串
返回值:返回经过过滤的字符串


命令名称:RTrimEx
命令功能:过滤后导字符,删除字符串从右到左开始有包含指定过滤的字符  
参数:参数1【必要】:字符串,需要操作的字符串
参数2【必要】:字符串,指定过滤的字符串
返回值:返回经过过滤的字符串


命令名称:TrimEx  
命令功能:过滤前导与后导字符  
参数:参数1【必要】:字符串,需要操作的字符串
参数2【必要】:字符串,指定过滤的字符串
返回值:返回经过过滤的字符串  


这些命令功能有什么用呢?简单的说就是会把字符串中从前往后开始,把有包含过滤字符的部分给删除掉。先来看下范例:
Dim mstr
//命令返回的字符串为:bbc
mstr = "aaabbc"
TracePrint shanhai.LTrimEx(mstr,"a")

//命令返回的字符串为:baac
mstr = "aabaac"
TracePrint shanhai.LTrimEx(mstr,"a")

//命令返回的字符串为:bcc
mstr = "acabcc"
TracePrint shanhai.LTrimEx(mstr,"ac")


注:使用这个命令进行过滤字符时,如果第二个参数里有多个字符,那只要原字符串从前往后的每个字符符合过滤字符中的任意一个字符,那就命令就会把这个字符删除
例如使用“ac”过滤“acabcc”字符串,那原字符串中的第三个字符“a”也会被删除,所以返回的是“bcc”




删除指定区间字符:DelPartStr

命令名称:DelPartStr
命令功能:删除指定区间字符  
参数:参数1【必要】:字符串,要操作的字符串
参数2【必要】:整数型,删除的起始位置
参数3【必要】:整数型,删除的结束位置
返回值:返回删除之后的字符串  


这个命令用于删除某个字符串的指定范围的字符,范例:
//返回 16789
Dim mstr = "123456789"
TracePrint shanhai.DelPartStr(mstr, 2, 5)

命令从第二个参数的位置开始到第三个参数为止,删除这一部分的字符。(字符串位置从1开始计算)



删除指定字符串:DelFilStr

命令名称:DelFilStr
命令功能:删除字符串中指定的字符  
参数:参数1【必要】:字符串,要操作的字符串
参数2【必要】:字符串,想要删除的字符串
返回值:返回删除之后的字符串


范例:
//返回 12389
Dim mstr = "123456789"
TracePrint shanhai.DelFilStr (mstr, "4567")




统计指定字符数量:CountStr

命令名称:CountStr
命令功能:在字符串中查找指定字符的数量   
参数:参数1【必要】:字符串,被查找的字符串
参数1【必要】:字符串,要查找的字符串
返回值:返回整数, 返回查找到的数量


按键自带的命令只有查找字符串第一次出现的位置,要统计出全部字符串的数量的话还得写循环进行遍历,比较麻烦,用这个命令的话就可以直接统计了。范例:
//返回 6
Dim mstr = "12x3xx4xx56x789"
TracePrint shanhai.CountStr(mstr, "x")

2自动安装apk还可以这么用

引言:之前被一个用户狂喷了半个小时

【山海插件教程】

【山海插件教程】
就因为脚本在他机器运行不正常……后来找到原因竟然是微信版本的图色有轻微差异!!!微信更新速度太快,不同机器上恨不得有10000个版本,想要兼容这么多版本完全不可能。所以我想出了一个新的姿势:只要支持一个版本不就好了吗!

范例代码:
// 我们的主角是 山海插件 哦
Import "shanhai.lua"

// 释放 微信的apk [这就是我们支持的版本哦]
PutAttachment GetSdcardDir(), "weixin.apk"

// 安装APK,再也没有版本兼容的问题辣
Call shanhai.Install(GetSdcardDir() & "/weixin.apk")

相关命令:
命令名称:Install
命令功能:静默安装app,会自动覆盖现有版本
参数:参数1【必要】:字符串,APP路径
返回值:
怎么样?是不是很简单?

【山海插件教程】

【山海插件教程】
小技巧有时候能解决大问题。其实安装apk命令还有很多其他的用法。

江湖传闻有一款叫UU云打码的东东,UU云打码需要配合打码apk才行,如果让用户去自己装打码apk的话会觉得很麻烦,所以我们可以利用这个命令自动装上,用户只要运行你的脚本就OK了

范例代码:
// 导入 山海插件
Import "shanhai.lua"

// 释放并安装UU云打码apk
PutAttachment GetSdcardDir(), "UUYun.apk"
Call shanhai.Install(GetSdcardDir() & "/UUYun.apk")

// 运行UU云apk
RunApp "com.example.uuwisedemo"


自动安装apk还有其他的姿势吗?小编能想到的还有小精灵apk自动更新啊~

在按键的作者后台可以配置小精灵的自动更新,但是有自己服务器的小伙伴也可以通过安装apk功能来实现小精灵的自动更新。把小精灵apk从服务器上下载下来,然后运行命令安装即可。是不是很简单~~~

3一行代码隐藏手机虚拟键

引言:“为什么我写的脚本在同样的分辨率下我自己机子能用,但是放到用户那里就不能用了?明明分辨率和dpi都是一样的啊啊!!简直要抓狂了!!

【山海插件教程】

【山海插件教程】
” 一定很多小伙伴都会遇到这问题吧 ,其实很多都是因为手机上的虚拟键挤压了分辨率导致的。要隐藏虚拟键的话得装各种第三方的框架插件什么的,简直太麻烦了。这里就可以让你用一行代码轻松的隐藏掉虚拟键。

先来看下为什么虚拟键会影响到分辨率?

【山海插件教程】

【山海插件教程】

【山海插件教程】

【山海插件教程】


从上面两张对比图就可以看出,多出来的虚拟键的高度把屏幕分辨率给占用了,这就导致实际的画面比例不对。要解决这个问题很简单,直接上代码~~~

代码范例:
// 导入 山海插件
Import "shanhai.lua"

// 隐藏虚拟键
If shanhai.SetNavigationBar(false) Then 
    ShowMessage "隐藏虚拟键成功,重启手机生效"
    Delay 2000
    Call 倒计时重启手机()
Else 
    ShowMessage "隐藏虚拟键失败"
    Delay 2000
End If

Function 倒计时重启手机
    Dim i = 0
    For i = 1 To 5
        ShowMessage "倒计时:" & i & " 秒后重启手机"
        Delay 1000
    Next
    Call shanhai.Reboot()
End Function

相关命令:

命令名称:SetNavigationBar
命令功能:设置手机的虚拟键的隐藏和显示; 设置成功后需要重启手机才能生效
参数:参数1【必要】:布尔型,true 表示显示虚拟键;false是隐藏虚拟键
返回值:返回布尔型, true表示设置成功,false表示设置失败
只需要一条命令就实现了隐藏或者显示虚拟键的功能,是不是很简单~~

【山海插件教程】

【山海插件教程】



4自动安装目录下所有apk

引言:给大家带来一个轻松赚钱的新姿势~~ 相信不少同学都有听说过有一些通过下载指定软件赚钱的app吧?(比如学生赚、米赚之类的)。这类软件只要是下载并安装里面指定的app应用,就能获取积分用来兑换现金或者其他奖品。通过写脚本来自动去下载很容易,但是很多同学卡在了自动安装软件的环节含恨告终~~现在就教大家解决这个问题。



相关命令:

命令名称:ScanPath
命令功能:遍历指定目录下的文件、文件夹
参数:参数1【必要】:字符串,指定遍历的目录
参数2【可选】:整数型,1代表遍历文件夹; 不填代表遍历文件
返回值:返回包含文件名的数组  


范例代码:
Import "shanhai.lua"

//通过找图色来点击下载app的部分这里就忽略了,假设app安装包都下载放在/sdcard/download文件夹

// 遍历并安装/sdcard/download文件夹内的文件
Dim apparr, path = "/sdcard/download/"
apparr = shanhai.ScanPath(path)
For Each v In apparr
    TracePrint v
    If InStr(1, v, ".apk") > 0 Then 
        Call shanhai.Install(path & v)
    End If
    Delay 1000
Next

这样就可以轻松实现自动安装指定的文件夹里的所有apk文件了。


除了用来安装多个apk以外,遍历文件命令还能用到 什么地方呢?还可以用来批量修改文件!!可以先遍历出指定文件夹下的所有文件,然后通过重命名命令把每个文件的名称修改成统一的格式。废话不多说,小二!上代码!

范例代码:
Import "shanhai.lua"

// 遍历并安装/sdcard/download文件夹内的文件
Dim i = 1, apparr, path = "/sdcard/Pictures/"
apparr = shanhai.ScanPath(path)
For Each v In apparr
    TracePrint v
    dir.Rename(path & v, path & "Pic_" & i) 
    Delay 100
Next

此外,遍历文件命令能做的事情还有很多,比如说~~给自己的脚本推广app,在脚本附件里放上你想要推广的多个app,然后启动脚本之后先释放出来再遍历文件进行安装
Import "shanhai.lua"
// 释放所有apk包
PutAttachment "/sdcard/apps/",""
// 遍历并安装/sdcard/download文件夹内的文件
Dim apparr, path = "/sdcard/apps/"
apparr = shanhai.ScanPath(path)
For Each v In apparr
    TracePrint v
    Call shanhai.Install(path & v)
    Delay 1000
Next


5让应用悄悄的从你眼前消失

引言:给大家带来一个黑科技的命令了

【山海插件教程】

【山海插件教程】
教大家如何让脚本实现神不知鬼不觉的在设备上安装app应用,而且还不被发现的方法。


相关命令:
命令名称:DisableApp
命令功能:隐藏、锁定APP  
参数:参数1【必要】:字符串,app包名
返回值:


命令名称:EnableApp
命令功能:恢复、解锁隐藏的app   
参数:参数1【必要】:字符串,app包名
返回值:


今天主要就是靠这两个命令来实现想要的效果了。废话不多说,直接上范例:

范例:
// 导入插件
Import "shanhai.lua"

// 释放附件中的apk到按键目录中
PutAttachment GetTempDir(), "QQ.apk"

// 静默安装QQ并且隐藏
Call shanhai.Install(GetTempDir() & "QQ.apk")
Delay 1000
Call shanhai.DisableApp("com.tencent.mobileqq")

就两三行代码就实现了神鬼不知的APP的安装,看着是不是很高大上!!

还可以利用这两个命令来实现专门隐藏和显示某个应用的功能(比如想隐藏手机上某些不想被别人知道的APP之类的

可以在界面上先做一个下拉框用来控制隐藏还是显示,然后再做一个输入框,输入要隐藏的包名

范例:
// 导入插件
Import "shanhai.lua"

// 先读取界面数据存放到变量中
Dim ui_pkgname = ReadUIConfig("包名")
Dim ui_isDisable = ReadUIConfig("是否隐藏")

// 对界面功能进行判断
If ui_isDisable = 0 Then 
    //隐藏
    Call shanhai.DisableApp(ui_pkgname)
Else 
    //显示
    Call shanhai.EnableApp(ui_pkgname)
End If
隐藏和显示app的命令可以实现的功能不止这些,小伙伴们可以自己去挖掘哟~

6后台自动获取应用的消息

引言:现在基本上很多应用都会把一些消息推送到手机的通知栏上。那如何才能获取到这些信息?用找字?天!要我用找字的话还不如直接让我狗带~~其实要获取这种通知栏消息很简单,就一行代码~~  



相关命令:

命令名称:GetNotification
命令功能:获取指定应用的通知栏消息
参数:参数1【必要】:字符串,指定APP包名
返回值:返回指定APP的通知栏信息   


通过获取应用的通知栏消息,大家最直观能想到的估计就是监测QQ或者微信的红包了吧?

范例:
Import "shanhai.lua"

// 循环获取QQ的通知栏消息
Dim app = "com.tencent.mobileqq"
Dim appinfo = ""
Do
    appinfo = shanhai.GetNotification(app)
    // 通知栏消息有包含“红包”的时候就打开QQ
    If InStr(1, appinfo, "红包") > 0 Then 
        TracePrint "有红包"
        RunApp app
    Else 
        Delay 1000
    End If
Loop


其实利用这个获取通知栏命令的功能还能实现一个强大的功能——获取当前通知栏里的短信内容


范例:
Import "shanhai.lua"

// 短信应用的包名
Dim app  = "com.android.mms"
Dim sms = ""
Do
    sms = shanhai.GetNotification(app)
    If sms <> "" Then 
        TracePrint "当前收到的短信内容是:" & sms
    Else 
        Delay 1000
    End If
Loop
还有其他的功能比如说可以用来获取一些应用的消息(微博的私信、一些应用的消息通知什么的)~~大家自行扩展啦~

7让脚本和用户之间交互起来

引言:继续带来黑科技命令~~老早之前就收到大家的各种吐槽:按键啥时候出个获取点击坐标的功能啊!!!我们等得心都凉了! 我淡定的表示要获取点击的坐标?so easy~~~  



相关命令:
命令名称:Coordinate
命令功能:获取用户点击的屏幕坐标
参数:ScreenX:整数型,横向分辨率
ScreenY:整数型,纵向分辨率
Time:整数型,扫描周期,建议值设置成10()
返回值:返回数组类型:第一个元素是x坐标,第二个元素是y坐标   


通过这个命令可以获取到用户在屏幕上点击的坐标,我们可以在脚本运行之后让用户去点击一些需要的记录的坐标,然后脚本把坐标存放到变量里留着脚本之后使用

范例:
Import "shanhai.lua"
Dim i=0, arrXY, x, y
// 启动脚本5秒之后让用户点击屏幕并记录坐标
Do
    If i > 5 Then 
        arrXY = ShanHai.Coordinate(GetScreenX(), GetScreenY(), 10)
        x = arrXY(0) : y = arrXY(1)
        ShowMessage "当前点击的坐标为: " & x & "x" & y
        Delay 2000
        Exit Do 
    Else 
        i = i + 1
        Delay 1000
    End If
Loop

这种方法可以用在一些特征位置固定,但是不容易识别的地方。让用户通过点击这些坐标来记录下来。


这个命令还可以用来做一个专门在手机上获取点击坐标的脚本。大家知道目前安卓按键在手机上是没有抓抓功能的,那在手机上要获取坐标的话会比较麻烦,我们就可以通过这个命令做一个脚本,专门用来在手机上运行获取点击的坐标。

范例:
Import "shanhai.lua"

Dim ui_delay = cint(ReadUIConfig("启动延迟"))
Dim ui_isInput = ReadUIConfig("录入坐标")
Dim arrXY, x, y, i = 1
// 启动脚本后延迟一段时间
For i = 0 To ui_delay
    Delay 1000
Next
// 等待用户点击屏幕坐标,根据设置选择是否记录到文本或者直接复制到剪切板
Do
    arrXY = ShanHai.Coordinate(GetScreenX(), GetScreenY(), 10)
    x = arrXY(0) : y = arrXY(1)
    If ui_isInput Then 
        Call File.WriteLine("/sdcard/坐标记录.txt", i, x & "x" & y)
    Else 
        Sys.SetClipText x & "x" & y
    End If
Loop

8让一条命令来告诉你,画面动没动

引言:现在脚本挂机都讲究着能够稳定长时间的挂机,但是因为移动设备系统稳定性参差不齐,有时候游戏在挂机中会出现卡死不动的情况,判断游戏是否卡屏成了一个不大不小的问题。这里就让我们来用简单的命令就实现这一功能。  



相关命令:
命令名称:IsDisplayChange
命令功能: 判断区域颜色一定时间是否变化
参数:参数1【必要】:整数型,指定区域的左上角x坐标
参数2【必要】:整数型,指定区域的左上角y坐标
参数3【必要】:整数型,指定区域的右下角x坐标
参数4【必要】:整数型,指定区域的右下角x坐标
参数5【必要】:整数型,指定时间,单位是秒
参数6【可选】:整数型,指定时间内每次判断的频率,单位是秒
返回值: 在指定时间内指定区域的屏幕发生变化返回true ,否则到达指定时间后返回false   


游戏卡死的时候往往画面完全不动、或者是部分画面不动,所以我们可以利用这点特性来编写一个判断游戏画面是否卡死的简单的函数

范例:
Import "shanhai.lua"

// 在指定范围内连续判断8秒是否画面有变化
If shanhai.IsDisplayChange(21, 25, 96, 69, 8, 1) Then 
    TracePrint "画面发生变化"
    ShowMessage "游戏正常"
    Delay 2000
Else 
    TracePrint "画面未发生变化"
    ShowMessage "游戏异常卡屏,自动重启游戏"
    Delay 2000
    // 重启游戏
    KillApp "com.tencent.tmgp.jxqy"
    Delay 5000
    RunApp "com.tencent.tmgp.jxqy"
End If


注:这个命令的判断对于变化比较敏感,所以在选取范围的时候尽量不要选择太大的范围,防止游戏画面中有一些粒子动画效果干扰,造成命令的误判。


除了判断卡屏以外,这个命令还可以用在判断游戏中的自动寻路是否到达既定地点的情况上。一些游戏有地图上固定点的自动寻路功能,点击开始自动寻路比较简单,但是要判断知否到达指定的地点就有点麻烦了。我们可以利用这个命令来进行判断。
自动循环的时候游戏画面肯定是大部分都在不停的变化(特别是地面),那我们就可以循环判断地面范围的画面是否有变化来间接的监测是否到了指定地点了。

范例:
Import "shanhai.lua"

Do
    If shanhai.IsDisplayChange(21, 25, 96, 69, 8, 1) Then 
        TracePrint "移动中"
    Else 
        TracePrint "画面停止变化,已到达指定地点"
        Exit Do 
    End If
    Delay 1000
Loop

相信大家在做一些比较商业化的脚本的时候都会习惯进行日志的记录吧。可以把一些关键的输出信息记录下来,以便后期进行查看还有问题的分析。但是呢~~按键自带的日志记录还是有缺陷的,他不能自定义的去设置日志文件的路径还有他只能记录一个日志文件。所以这里就给大家介绍下山海插件中的日志记录命令。



相关命令:
命令名称:LogPath
命令功能:设置日志文件路径
参数:参数1【必要】:字符串,记录日志路径
返回值:无  


命令名称:OutLog
命令功能:写入日志内容
参数:参数1【必要】:字符串,要记录到日志中的内容
返回值:无  


这两个命令是配套的命令,在使用的时候需要先用LogPath 命令设置下需要记录的日志文件的路径,然后OutLog 命令把想要记录的信息写入日志内。命令会把每条日志都自动分行记录,并且加上当前的时间。

范例:
Import "shanhai.lua"

Call shanhai.LogPath("/sdcard/日志1.log")
// 开始记录日志1
For i = 1 To 10
    call shanhai.OutLog ("当前循环:" & i)
    Delay 1000
Next

Call shanhai.LogPath("/sdcard/日志2.log")
// 开始记录日志2
For i = 1 To 10
    call shanhai.OutLog ("当前循环:" & i)
    Delay 1000
Next

这个日志命令还有一个优点就是不用担心忽然按键的闪退导致日志的丢失,日志内容会在调用命令的时候自动记录到文件里,就算按键出现了异常崩溃,也能通过日志来定位到错误点。

利用好日志路径的功能还可以用来实现不同类别的日志分开记录的功能。
范例:
Import "shanhai.lua"
Dim IntX,IntY

FindMultiColor 0,0,0,0,"FFFFFF","4|1|2F9772-000000|123456-101010,3|7|378757",0,0.9,intX,intY
If intX > -1 Then 
    Call 记录日志(1, "坐标在" & intX & "," & intY)
    Tap IntX, IntY
    Delay 1000
    Call 记录日志(2, "签到成功")
Else 
  Call 记录日志(0, "特征没找到")
End If

Function 记录日志(id, msg)
    Select Case id
        Case 0
            Call shanhai.LogPath("/sdcard/错误异常.log")
        Case 1
            Call shanhai.LogPath("/sdcard/信息输出.log")
        Case 2
            Call shanhai.LogPath("/sdcard/收益统计.log")
    End Select
    Call shanhai.OutLog(msg)
End Function

9实现脚本的多日志记录功能

引言:相信大家在做一些比较商业化的脚本的时候都会习惯进行日志的记录吧。可以把一些关键的输出信息记录下来,以便后期进行查看还有问题的分析。但是呢~~按键自带的日志记录还是有缺陷的,他不能自定义的去设置日志文件的路径还有他只能记录一个日志文件。所以这里就给大家介绍下山海插件中的日志记录命令。



相关命令:
命令名称:LogPath
命令功能:设置日志文件路径
参数:参数1【必要】:字符串,记录日志路径
返回值:无  


命令名称:OutLog
命令功能:写入日志内容
参数:参数1【必要】:字符串,要记录到日志中的内容
返回值:无  


这两个命令是配套的命令,在使用的时候需要先用LogPath 命令设置下需要记录的日志文件的路径,然后OutLog 命令把想要记录的信息写入日志内。命令会把每条日志都自动分行记录,并且加上当前的时间。

范例:
Import "shanhai.lua"

Call shanhai.LogPath("/sdcard/日志1.log")
// 开始记录日志1
For i = 1 To 10
    call shanhai.OutLog ("当前循环:" & i)
    Delay 1000
Next

Call shanhai.LogPath("/sdcard/日志2.log")
// 开始记录日志2
For i = 1 To 10
    call shanhai.OutLog ("当前循环:" & i)
    Delay 1000
Next

这个日志命令还有一个优点就是不用担心忽然按键的闪退导致日志的丢失,日志内容会在调用命令的时候自动记录到文件里,就算按键出现了异常崩溃,也能通过日志来定位到错误点。

利用好日志路径的功能还可以用来实现不同类别的日志分开记录的功能。
范例:
Import "shanhai.lua"
Dim IntX,IntY

FindMultiColor 0,0,0,0,"FFFFFF","4|1|2F9772-000000|123456-101010,3|7|378757",0,0.9,intX,intY
If intX > -1 Then 
    Call 记录日志(1, "坐标在" & intX & "," & intY)
    Tap IntX, IntY
    Delay 1000
    Call 记录日志(2, "签到成功")
Else 
  Call 记录日志(0, "特征没找到")
End If

Function 记录日志(id, msg)
    Select Case id
        Case 0
            Call shanhai.LogPath("/sdcard/错误异常.log")
        Case 1
            Call shanhai.LogPath("/sdcard/信息输出.log")
        Case 2
            Call shanhai.LogPath("/sdcard/收益统计.log")
    End Select
    Call shanhai.OutLog(msg)
End Function


10定时活动定时做-给脚本加个定时器

引言:今天继续给大家带来一个比较常用也是很实用的插件命令-定时器命令。现在网游中有各种的定时活动,或者是隔一段时间才能进行一次的任务。单个任务、活动的间隔计时还没什么问题,但是同时要进行多个任务的计时的话就比较麻烦了。但是用了这个命令之后一切都变的简单。



相关命令:
命令名称:TimeSign
命令功能:设置定时器标记,用来和Timer 命令配合使用  
参数:参数1【必要】:整数型,标记编号
返回值:无  


命令名称:Timer
命令功能:定时器功能,用来判断指定时间间隔是否到达  
参数:参数1【必要】:整数型,时间标记编号
参数2【必要】:整数型,指定的时间间隔 (单位: 秒)
返回值:返回布尔值,到达指定间隔返回true ,否则返回false  


这两个命令是配套的命令,先使用TimeSign 命令在想要计时的地方设定一个时间标记,然后在脚本之后的流程中使用Timer 命令就可以来判定对应标记的间隔是否达到了。这样就能轻松实现多任务同时进行计时判断的功能

范例:
Import "shanhai.lua"

// 设定标记1
Call shanhai.TimeSign(1)
Delay 10000
// 设定标记2
Call shanhai.TimeSign(2)

// 循环判断时间指定标记的时间间隔
Do
    If shanhai.Timer(1, 10) Then 
        TracePrint "标记1时间已达到10秒"
    ElseIf shanhai.Timer(2, 20) Then
        TracePrint "标记2时间已达到20秒"
    End If
    Delay 1000
Loop

设定标记时无需按照顺序,只要是整数型并且没有和之前设置的标记号冲突即可。不同的标记号的计时是独立的不会互相冲突。

11能不能联网由你的脚本说的算

引言:现在手机上网游或者应用都是需要在有网络的情况下才能进行,所以对于wifi以及流量的控制就变的很有必要了。如果单纯的通过图色来控制这些开启关闭,那简直就是要人命了。这里就给大家带来非常实用的设备控制命令。



相关命令:
命令名称:IsConnectWifi
命令功能:判断WiFi是否开启   
参数:
返回值:返回布尔值,true 为开启, false为关闭   


命令名称:ControlWifi
命令功能:关闭、开启WIFI   
参数:参数1【必要】:布尔值,true 为开启wifi;false 为关闭wifi
返回值:无   


命令名称:ControlData
命令功能:关闭\开启数据流量  
参数:参数1【必要】:布尔值,true 为开启数据流量;false 为关闭数据流量
返回值:无  


利用这些命令我们可以轻松的检测wifi的开启和控制wifi,我们可以在脚本开始运行的时候先检测一次wifi,如果没有开启的话可以直接开启wifi已获取更好的网速。

范例:
Import "shanhai.lua"

// 如果没有开WiFi就自动开启WiFi
If shanhai.IsConnectWifi() Then 
    TracePrint "WiFi已开启"
Else 
    TracePrint "未开启WiFi"
    Call shanhai.ControlWifi()
End If

设定标记时无需按照顺序,只要是整数型并且没有和之前设置的标记号冲突即可。不同的标记号的计时是独立的不会互相冲突。

脚本要做到全自动,那自动开启游戏的功能就是必要的,但是有时候游戏需要下载更新,如果没开wifi的话那流量用的就是花花的心疼啊~~,我们也可以用脚本来解决这个问题

范例:
Import "shanhai.lua"

Dim app = "com.tencent.tmgp.jxqy"

Do
    // 判断游戏是否需要下载更新
    FindMultiColor 287,228,347,276,"230DC3","5|15|230DC3,-18|1|FFFFFF",0,0.9,intX,intY
    If intX > -1 And intY > -1 Then
        TracePrint "游戏需要更新"
        If shanhai.IsConnectWifi() Then 
            TracePrint "WiFi已开启"
            Tap intX,intY    '点击更新
        Else 
            TracePrint "未开启WiFi"
            Call shanhai.ControlWifi()
            Tap intX,intY    '点击更新
        End If
        Exit Do 
    Else 
        Delay 1000
    End If
Loop

12火眼金睛-识别设备是模拟器还是手机

引言:随着安卓模拟器的势头越来越强劲,越来越多的用户会使用模拟器来使用脚本,但是有些用户会通过复制多开模拟器来达到只购买一份脚本但是可以同时挂机多个的效果。那如何才能识别出运行的设备是手机还是模拟器呢?其实很简单~



相关命令:
命令名称:IsVM
命令功能:判断设备是否是模拟器   
参数:
返回值:true表示是模拟器, false 表示不是模拟器


范例:
Import "shanhai.lua"

// 判断是否是模拟器
If shanhai.IsVM() Then 
    TracePrint "该设备是模拟器,请使用手机进行挂机"
Else 
    TracePrint "该设备是手机,可以正常挂机"
End If


这个命令的原理是通过检测设备的CPU来判定是否模拟器,因为常见的手机或者平板的cpu是ARM架构,和电脑的Intel架构有区别,但是有部分的平板也是采用Intel的架构,所以这个识别的正确率并不是100%(但是这种设备还是少数,所以不影响大部分的判断)

我们还可以来结合判断虚拟键高度的命令来实现一些功能:判断是否有虚拟键,如果是模拟器的话直接让用户手动关闭虚拟键,手机的话使用命令隐藏虚拟键。

范例:
Import "shanhai.lua"

If shanhai.GetNavigationBar() > 0 Then 
    TracePrint "当前设备有虚拟键"
    If shanhai.IsVM() Then 
        TracePrint "设备是模拟器"
        ShowMessage "请手动把模拟器的虚拟键关闭再使用脚本"
        Delay 2000
        EndScript
    Else 
        TracePrint "设备是手机"
        If shanhai.SetNavigationBar(false) Then 
            ShowMessage "已隐藏虚拟键,重启手机生效"
            Delay 2000
        Else 
            ShowMessage "隐藏虚拟键失败,请使用第三方工具手动隐藏"
            Delay 2000
        End If        
    End If
End If

13不靠图色照样识别界面

引言:不少同学在写微信或者其他应用的脚本的时候经常会很头疼识别的问题。找字的效率太低并且不怎么稳定,找多点如果特征没取好又容易误判,同时还有不同分辨率不同dpi的困扰,实在是让人抓狂 .但是我说我都使用找图找色就能识别出特征的位置,你信么?


相关命令:
命令名称:GetUIXml
命令功能:获取界面UIXML信息   
参数:
返回值:返回获取到的XML信息  


我们就以找安卓按键精灵界面界面上的社区按钮坐标为范例。
范例:
Import "shanhai.lua"

Dim UI_XML, sPos, ePos, XY

// 获取当前界面的XML信息
UI_XML = shanhai.GetUIXml()
// 查找“社区”按钮的位置信息
sPos = InStr(1, UI_XML, "社区")
sPos = InStr(sPos, UI_XML, "bounds=")
sPos = InStr(sPos, UI_XML, "[")
ePos = InStr(sPos, UI_XML, "]")
sPos = sPos + 1
XY = mid(UI_XML, sPos, ePos - sPos)
// 分割提取出坐标
Dim arrXY = Split(XY,",")
TracePrint "社区按钮的坐标为:" & arrXY(0) & "x" & arrXY(1)


这个命令的神奇的地方就在于可以把应用的界面信息读取转换成为XML的信息。这样在界面上的一些文字或者按钮之类的控件就可以在XML里找到对应的信息,其中就包括了坐标的信息。
我们就以上面的范例来分析下XML文件,看下如何从里面获取到对应控件的坐标
我们先看下获取到的XML信息:

【山海插件教程】

【山海插件教程】


看到这么多的信息先不急,我们直接找想要的就行了,直接搜索“社区”,把这附近的代码单独拿出来看

【山海插件教程】

【山海插件教程】


其中“bounds”后面中括号里的坐标,第一个坐标就是这个社区的左上角坐标,第二个是右下角的坐标,我们提取左上角的就可以使用了。



14万中取一的正则匹配

引言:在上一节中,我们已经学习了通过获取界面XML来定位特征的方法,但是大家肯定注意到了,在提取坐标信息的时候使用的方法实在是太麻烦了,一个个去遍历查找,头都要大了,那有没有更简单轻松的方法?



相关命令:
命令名称:RegexFind
命令功能:全局查找正则匹配内容   
参数:参数1【必要】:字符串,要查找的字符串
参数2【必要】:字符串,正则匹配字符串
返回值:返回包含匹配结果的数组   


我们就以找安卓按键精灵界面界面上的社区按钮坐标为范例
范例:
Import "shanhai.lua"

Dim UI_XML, XY, arrXY
// 获取当前界面的XML信息
UI_XML = shanhai.GetUIXml()

XY = FindXML(UI_XML, "社区")
If XY <> "" Then 
    arrXY = Split(XY,",")
    TracePrint "社区按钮的坐标为:" & arrXY(0) & "x" & arrXY(1)
End If

Function FindXML(XML, key)
    // 组合正则表达式
  Dim pattern = "text=""" & key & """.-bounds=""%[([^%]]+)%]"
  dim RegexArr = shanhai.RegexFind(XML,pattern)
  If RegexArr(0) <> null Then 
    TracePrint "匹配到字符"
    FindXML = RegexArr(0)
    Else 
    TracePrint "未匹配到字符"
    FindXML = ""
  End If
End Function

LUA的模式匹配和常见的正则表达式的语法很相似,只是有一些描述符的差别,所以基本上都可以按照标准的正则来进行匹配。如果想要详细的了解LUA 的模式匹配的可以留言,会在之后考虑详细的介绍下模式匹配的用法~


15获取APP的版本号

引言:现在应用和游戏的版本更新的比较快,看你某个应用更新了之后,脚本功能上会有点问题,所以时刻了解用户设备上的应用的版本号是比较重要的事情。



相关命令:
命令名称:AppVersion
命令功能:获取已安装应用的版本号     
参数:参数1【必要】:字符串,欲查询的包名
返回值:返回APP的版本号   



还记得之前的静默安装APP的章节里提到通过静默安装指定的版本APP来提升兼容性的吗(惊呆了!自动安装apk还可以这么用)?
我们还可以进一步进行扩展。

范例:
Import "shanhai.lua"

// 预定义微信版本号
Dim ver = "6.3.22"
// 判断当前微信版本是否符合要求
If shanhai.AppVersion("com.tencent.mm") = ver Then 
    TracePrint "当前微信版本符合要求"
Else 
    TracePrint "当前微信版本不符合要求"
    PutAttachment GetSdcardDir(), "weixin.apk"
    Call shanhai.Install(GetSdcardDir() & "/weixin.apk")
End If

通过预先判断已安装的版本号,如果已经安装了对应的版本号,就无需再多此一举的重复安装了。

还有一些游戏可能会出现可选更新之后脚本失效,但是用户还是玩低版本的,导致脚本无法使用。因为一般游戏都很大,所以我们不太可能会把游戏放到附件里自动去安装最新的版本,这样我们就可以通过判断游戏的版本号,来让低版本的用户手动去升级成最新版本的游戏。

Import "shanhai.lua"

// 预定义游戏版本号
Dim ver = "1.9.3"
// 判断当前游戏版本是否符合要求
If shanhai.AppVersion("com.tencent.tmgp.cwxjlfkk") = ver Then
    TracePrint "当前游戏是最新版本"
Else 
    ShowMessage "请更新游戏版本到最新"
    Delay 2000
    EndScript 
End If

16让你实时掌控自己设备的内存剩余

引言:写出来的脚本挂机稳定性是关键,想要脚本牛X就看他能连续跑多长时间。但是脚本运行时间长了手机会卡,一卡一崩就完蛋。所以得要在适当的时机清理下内存的空间。



相关命令:
命令名称:GetRAM
命令功能:获取内存剩余百分比  
参数:
返回值:返回整数型, 返回当前手机剩余内存的百分比  



范例:
Import "shanhai.lua"

Dim RAM, intx, inty
Do
    // 内存剩余空间小于20%时清理内存
    RAM = shanhai.GetRAM()
    If RAM < 20 Then 
        Sys.ClearMemory()
    End If
    FindMultiColor 0,0,0,0,"FFFFFF","4|1|2F9772-000000|123456-101010,3|7|378757",0,0.9,intX,intY
    If intX > -1 Then
      TracePrint "找到啦,坐标在"&intX&","&intY
    Else
      TracePrint "没找到"
    End If
    Delay 1000
Loop

有了检测内存剩余的命令之后就不需要在盲目的去清理内存了,只需要在内存不足的情况下清理就好了。


17让脚本自动设置输入法

引言:按键的inputext命令有个让人头痛的地方:使用了这个命令之后如果脚本没停止,那就无法呼出其他的输入法键盘没法打字了,这其实是因为按键调用这个命令的时候会自动切换并锁定成按键的输入法,所以无法呼出其他的输入法键盘的,要解决这种问题也是很简单的。



相关命令:
命令名称:SetIME
命令功能:设置输入法   
参数:参数1【必要】:整数型,设置使用的输入法
0:百度小米版输入法
1:讯飞输入法
2:谷歌输入法
3:手心输入法
4:GO输入法
5;触宝输入法
6:QQ拼音
7:百度输入法
8:章鱼输入法
9:按键精灵输入法
10:搜狗输入法
返回值:


命令名称:GetIME
命令功能:获取系统上输入法  
参数:
返回值:返回数组,返回系统上安装的输入法  


范例:
Import "shanhai.lua"

InputText "hello word"
Delay 1000
// 设置成搜狗输入法
Call shanhai.SetIME(10)
Do
    Delay 1000
Loop


我们可以结合获取系统输入法的命令来做一个自动遍历系统上的输入法,然后自动设置一个系统上有的输入法

范例:
Import "shanhai.lua"

// 自动设置一个系统能够匹配到的输入法
call MatchIME()

Function MatchIME()
    Dim localime = array("baidu.input_mi","FlyIME", "google", "xinshuru","gokeyboard", "smartinputv5", "qqpinyin", "baidu", "komoxo", "mobileanjian", "sogou")
    Dim sysime = shanhai.GetIME()
    For i = 0 To UBOUND(sysime)
        For j = 0 To UBOUND(localime) 
            If InStr(1, sysime(i), localime(j))>0 Then 
                MatchIME = j
                Call shanhai.SetIME(j)
                Exit Function
            Else 
                MatchIME = -1 
            End If
        Next
    Next
End Function

18突破系统内存目录的读写限制

引言:安卓手机会的存储会区分成内存目录和SD卡目录,SD卡目录就是放一些文件什么的,内存目录则是存放手机系统文件以及应用的数据。因为涉及到安全性,所以一般手机的内存目录都是只读权限的,无法进行写入的操作。那如何才能实现对内存目录文件的写入、修改呢?  



相关命令:
命令名称:Mount
命令功能:挂载系统文件夹  
参数:参数1【必要】:字符串,要挂载的文件夹路径
返回值:挂载成功返回true, 失败返回false  


命令名称:Chmod
命令功能:设置文件权限   
参数:参数1【必要】:字符串,文件路径
参数2【必要】:整数型,权限模式
0:设置文件可读写
1:设置文件为只读
2:设置文件可以读写可执行
返回值:无  


一般应用的数据都会存放在/data/data这个系统文件夹里,那我们可以配合这个命令把应用的数据给拷贝保存下来做一个备份数据。

范例:
Import "shanhai.lua"

// 备份QQ应用数据
If CopyAppData("com.tencent.mobileqq") Then 
    TracePrint "数据备份成功"
Else 
    TracePrint "数据备份失败"
End If

Function CopyAppData(pkgname)
    Dim appdata = "/data/data/" & pkgname
    // 挂载系统文件夹
    If shanhai.Mount("/data") Then 
        // 判断应用数据是否存在
        If Dir.Exist(appdata) = 2 Then 
            // 把数据复制到SD卡里
            Dir.Copy appdata, GetSdcardDir() & pkgname
        Else 
            TracePrint "找不到应用数据"
        End If
    Else 
        TracePrint "挂载失败"
    End If
    // 验证是否备份成功
    If Dir.Exist(GetSdcardDir() & pkgname) = 2 Then 
        CopyAppData = true
    Else 
        CopyAppData = false
    End If
End Function


在系统目录中常见的需要挂载的文件夹有以下这些,大家在对系统目录文件进行读写操作的时候,只要选择对应的挂载点进行挂载即可
system目录:
shanhai.Mount("/system")
data目录:
shanhai.Mount("/data")
cache目录:
shanhai.Mount("/cache")
proc目录:
shanhai.Mount("/proc")
19LUA的正则——模式匹配(1)

引言:之前的山海插件教程中给大家介绍了一个正则匹配的命令,大家响应热情很高呀~~ 鉴于一些小伙伴对于lua的正则不太了解,所以这里会专门给大家讲解下lua的正则匹配的用法。



其实确切的说,lua的正则匹配是被称为“模式匹配”,它只是遵从了部分的正则匹配的语法规则,并不是标准的正则表达式,但是也足够我们平时的使用了~~所以大家放心

如果对于标准正则表达式感兴趣的话可以查看之前写过的PC的正则表达式教程贴:
只要10行代码!从上万行文本中提取任意想要的信息
万千军中直取首级的正则进阶,想不想学
正则实战——轻松完成论坛贴吧一键登录签到

先上个简单的例子,来讲解下为什么要用模式匹配
常规的字符串提取方法:
//从字符串中提取出连续的数字
Dim text = "验证码:123456,如非本人操作,请忽略本短信。"
Dim tstr = ""
Dim num = ""
For i = 1 To Len(text)
    tstr = mid(text, i, 1)
    If IsNumeric(tstr) Then 
        num = num & tstr
    End If
Next
TracePrint num


模式匹配提取:
Import "shanhai.lua"

Dim text = "验证码:123456,如非本人操作,请忽略本短信。"
dim RegexArr = shanhai.RegexFind(text,"%d+")
For Each v In RegexArr
    TracePrint v
Next
这是个很小很简单的范例,从这个对比例可以看出,用模式匹配来提取字符串简直不要太轻松!!
不需要什么麻烦的遍历、判断、字符链接,直接就能提取出来。


lua的模式匹配其实就是用某些特定的字符来表示一系列的字符,所以让我们先来认识下这些特殊的字符
[hide]
.可表示任何字符
%a  表示任何字母
%c表示任何控制字符
%d表示任何数字
%g表示任何除空白符外的可打印字符
%l表示所有小写字母
%p表示所有标点符号
%s表示所有空白字符
%u表示所有大写字母
%w表示所有字母及数字
%x表示所有 16 进制数字符号

以上就是模式匹配中的特定的字符了。看上去这么多,其实平时常用的就是%w、%d、%a之类的。

除了特定的字符以为,还有用来表达匹配次数的字符。

*  将匹配零或多个该类的字符。 这个条目总是匹配尽可能长的串
+ 将匹配一或更多个该类的字符。 这个条目总是匹配尽可能长的串
-将匹配零或更多个该类的字符。 和 '*' 不同, 这个条目总是匹配尽可能短的串
将匹配零或一个该类的字符。 只要有可能,它会匹配一个


知道了这些特定的字符,我们再回过头来看下上面的例子是怎么实现提取字符的。具体的命令参数就不复述了,大家可以看之前的帖子:【山海插件教程】万中取一的正则匹配
其中关键的地方就是匹配的表达式: %d+

根据上面的特定字符表格,我们可以知道 %d 就是匹配数字,+ 则是匹配前一个字符一次或者多次。那上面这个表达式我们就可以翻译成:
匹配字符串中的数字一次或者多次。(白话就是:把字符串中的数字都找出来)


而在上述的代码中只有“123456”是数字,所以就可以顺利的把数字都匹配出来了。

怎么样,看了这篇教程是不是对lua的模式匹配有了初步的了解了?之后我们还会再进一步的去了解lua的模式 匹配


20LUA的正则——模式匹配(2)

引言:在上一节中带大家初步的了解了lua的模式匹配,今天就让我们一起来进一步的去了解下模式匹配的表达式的实际应用。


接下来介绍下模式匹配中会用到的一些符号:

( ) 括号括号就是用来捕获你需要提取出来的内容。

在一个匹配表达式中可能有只有一小部分是你需要提取出来的,所以就需要把这部分单独的用括号包括起来,这样在使用命令的时候就会专门把这段内容提取出来
我们来看下一个范例:


Import "shanhai.lua"
//从字符串中单独提取出网络ip的地址
Dim text = "网络ip来自:117.25.63.155,本地ip:192.168.1.1"
dim RegexArr = shanhai.RegexFind(text,"网络ip来自:(%d+%.%d+%.%d+%.%d+)")
For Each v In RegexArr
  TracePrint v
Next

我们具体的来看下匹配的表达式:网络ip来自:(%d+%.%d+%.%d+%.%d+)
[hide]
在原字符串中网络的ip前面有个特征就是“网络ip来自:”, 所以在表达式中需要带上它,后面%d+%.%d+%.%d+%.%d+这段则是用来提取ip地址的,%d+ 在上一篇教程中已经说过了是用来提取数字的。

那这个 %. 又是什么意思呢?我们之前教程中说过,“ . ” 这个在模式匹配里代表着匹配所有字符,所以我们如果要想匹配字符串中的这个点的话,就必须要在这个符号前加上%,这样就表示把这个点当成是普通的字符来进行匹配,而不是特殊的字符。


最后的括号就表示我只把括号里的内容提取出来,其他的内容不要,所以“网络ip来自:(%d+%.%d+%.%d+%.%d+)” 这个表达式提取之后的内容就是“117.25.63.155”
有兴趣的同学可以自己试着看看吧括号给去掉之后是什么样的结果~~

[] 中括号中括号在表达式中表示匹配一个集合,里面的内容可以是一个单独的字符,也可以是一个范围。


比如:
[p] 这就表示匹配包含字母p的字符(其实也就是直接匹配字符p);
[psd] 这个就可以表示匹配包含字母p或者字母s或者字母d的字符;
[a-z] 这样就是范围匹配,范围开始-范围结束,范围中间使用“-”符号进行连接。这个就是表示匹配a到z的字母;[0-9] 这样表示匹配0到9的数字

[^] 中括号里加个“^” 符号就和刚才的[]相反。这个表示匹配中括号里的补集,也就是不匹配中括号内的字符或者字符集。[^p] 这样就表示不匹配字母p


范例:
Import "shanhai.lua"

Dim text = "sdfpppqwe"
dim RegexArr = shanhai.RegexFind(text,"[^p]+")
For Each v In RegexArr
  TracePrint v
Next

这样就是排除了字母p,匹配到了字母p以外其他的字符。

小括号和中括号是在模式匹配中很常用到的一些办法,大家要灵活的去应用他们的组合
Import "shanhai.lua"

Dim text = "提取:这里是想要提取的内容123456<这里是不想要提取的内容>"
dim RegexArr = shanhai.RegexFind(text,"提取:([^<]+)")
For Each v In RegexArr
  TracePrint v
Next


分析:([^<]+) 这个表达式的意思就是,提取非<的内容多次。也就是相当于从左边开始,直到遇到了<这个符号为止,把这段内容提取出来。

看了这篇帖子之后,是不是对表达式的组合有了进一步的认识了呢?我们会在下一篇的帖子里结合一些实际的提取,给大家讲解下一些常用的写表达式的技巧~~


21LUA的正则——模式匹配(3)

引言:通过之前两节教程我们初步了解了lua模式匹配的一些使用方法,那今天的教程我们就来走进实战,给大家介绍下载分析表达式的时候常用的一些方法。



我们先来分析之前的例子:“万中取一的正则匹配

首先,要从复杂的字符中提取特定文字,得对这字符进行初步的分析,我们先来把重要的部分单独拿出来看下:

【山海插件教程】

【山海插件教程】


提取关键信息
可以发现在这段字符里关键的部分是“社区"这个是我们要找的文字,"[360,74][506,138]"这个则是我们要提取出来的坐标。
这两个就是关键信息,就是我们需要提取或者使用到的信息,接下来就是要分析规律

找到关键信息的规律
要写表达式我们就得学会找关键信息的规律。通过查看图中的部分,很容易就能观察到关键信息的特征:
要找的文字的前面都是有跟着:“text=”这样的字符
要找的坐标的前面都是有跟着:“bounds=” 这样的字符
除了这两个关键的地方以外的其他字符,我们都用不到,我们就可以用表达式来替换掉。

替换表达式
我们找到了规律之后,来看下该如何写表达式。通过上一步的分析可以发现从“text=”开始到“bounds=”之间的这段字符我们完全不需要,所以我们就用模式匹配的表达式给代替掉。
那该用什么表达式呢??

【山海插件教程】

【山海插件教程】

我们需要替换掉的是一连串的所有字符,所以我们可以用这种表达式:“ .+ ”。之前教程有说过了,点代表所有字符,而加号则代表匹配前一个字符多次。那这个表达式也就是用来匹配所有字符了


那到了这一步,我们就可以把表达式写出来了:
“text="社区".+bounds=[360,74][506,138]”


那这样就结束了吗?不!还差一点。我们要提取的信息是未知的,所以我们得要把这些未知的信息单独提取出来

bounds=[360,74][506,138] 想要分别提取出坐标数字:bounds=%[(.-)%] %[(.-)%]

%[(.-)%]  这个就是用来提取中括号里的字符。在之前的教程里我们说过,中括号是代表了匹配一个集合,那如果想要匹配中括号本身这个字符的话就需要在前面加上一个%符号来转义。
而(.-)就表示匹配任意字符多次,和加号相比是会匹配尽可能短的串。

当然上面这个表达式我们也可以使用 bounds=%[([^%]])%]%[([^%]])%] 来代替。就当是留了作业,同学们可以自己思考下为什么可以用这个表达式来匹配。


接下来,我们再来做一个简单的小练习~~~


将下图中的这些标题内容提取出来:

【山海插件教程】

【山海插件教程】


代码如下:
Import "shanhai.lua"

Dim html = url.Get("http://bbs.anjian.com/showtopic-630523-1.aspx")

dim RegexArr = shanhai.RegexFind(html,"<font size=""3"">([^<]+)</font>")
For Each v In RegexArr
    TracePrint v
Next

希望大家能在回复查看答案代码前先把你自己的方法附上,表达式是需要靠练习才能进行提升的熟练度。希望大家能在这些初级教程的基础上慢慢的联系来掌握lua模式匹配的使用方法~~



22教你给免费小精灵做个日期限制

引言:在前面的教程中我们有提到过定时器的功能(定时活动定时做-给脚本加个定时器)这个定时器是针对短时间的。那如果想要判断长时间该怎么办?  



相关命令:
命令名称:CompareTime
命令功能:对比是否到期   
参数:参数1【必要】:整数型,年
参数2【必要】:整数型,月
参数3【必要】:整数型,日
参数4【必要】:整数型,时
参数5【必要】:整数型,分
参数6【必要】:整数型,秒
返回值:到期返回-1,获取网络时间失败返回null,未到期返回距离到期剩余的秒数


命令名称:LateTime  
命令功能:计算几天后的日期  
参数:参数1【必要】:整数型,天数
参数2【可选】:整数型,年
参数3【可选】:整数型,月
参数4【可选】:整数型,日
返回值:返回日期,只填第一个参数则返回距离当前日期指定天数之后的日期


这个功能我们可以用来做什么呢?很多同学在刚开发完脚本之后都会把脚本免费的发放出去让大家使用积累人气。等脚本稳定人气也高的时候就开始收费。

那我们这里就可以利用这个命令,让脚本在一定的时期内可以正常使用,超过了这个时期之后就不运行功能。


范例:
Import "shanhai.lua"

Function 限时免费(日期)
    Dim datearr = split(日期, "-")
  Dim ret = shanhai.CompareTime(datearr(0), datearr(1), datearr(2), 0, 0, 0)
  If ret = -1 Then 
    ShowMessage "脚本已经到期"
    Delay 2000
    EndScript 
  ElseIf ret > 0 Then
       ShowMessage "脚本未到期,可以继续使用"
    Delay 2000
  ElseIf ret = null Then
       ShowMessage "联网失败,请检查网络"
    Delay 2000
    EndScript 
  End If
End Function

// 判断日期是否到达了2016年7月29号0点0分0秒
Call 限时免费("2016-08-27")

我们还可以利用LateTime 命令来实现限制指定天数的功能


范例:
Import "shanhai.lua"

Function 限制天数(天数)
    Dim 路径 = "/sdcard/data.txt"
    Dim 日期 = ShanHai.LateTime(天数)
    // 这里把计算好的到期时间写入文件以便脚本启动时进行判断
    If Dir.Exist(路径) = 1 Then 
        TracePrint "已有日期文件"
        日期 = file.Read(路径)
    Else 
        Call file.Write(路径, 限定日期)
    End If
    Dim datearr = split(日期, "-")
  Dim ret = shanhai.CompareTime(datearr(0), datearr(1), datearr(2), 0, 0, 0)
  If ret = -1 Then 
    ShowMessage "脚本已经到期"
    Delay 2000
    EndScript
  ElseIf ret > 0 Then
       ShowMessage "脚本未到期,可以继续使用"
    Delay 2000
  ElseIf ret = null Then
       ShowMessage "联网失败,请检查网络"
    Delay 2000
    EndScript 
  End If
End Function


23一行代码一步打开网站

引言:相信很多同学有时候需要在脚本中使用浏览器去打开一些网站,但是常规的方法需要先打开浏览器应用,然后再找到地址栏,再输入网址,再找到确定按钮才能打开网址。步骤繁琐并且不同手机兼容性很差。但是现在有一个非常简单的命令就能实现了!  



相关命令:
命令名称:OpenWeb
命令功能:用默认浏览器打开指定网页   
参数:参数1【必要】:字符串,欲打开的网址
返回值:


命令名称:WeiXinUrl
命令功能:用微信浏览器打开网页
参数:参数1【必要】:字符串,微信包名
参数2【必要】:字符串,欲打开的网址
返回值:


这两个命令一个是用系统默认的浏览器打开网页,另外一个则是用微信内嵌的浏览器来打开网页。

使用系统默认的浏览器打开网页有什么意想不到的作用了??不知道大家有没有注意到,平时有一些手机上的应用分享出来的链接,如果用浏览器打开的话,它会自动跳转到应用对应的界面上,这样我们可以用简单的 方法去实现特殊的操作。

范例:
Import "ShanHai.lua"
// 在界面上设计一个输入框用于输入网址
Dim AppUrl = ReadUIConfig("歌曲地址")

If AppUrl <> "" Then 
    ShowMessage "打开指定歌曲链接"
    Delay 2000
    Call shanhai.OpenWeb(AppUrl)
End If
利用这个命令我们还能做啥?我们能做的其实不少,比如说给自己脚本做点小广告 (在脚本功能结束的时候打开自己的链接什么的)
还可以根据需要去打开一些充值页面的链接什么的……大家可以根据自己的实际情况去使用这个命令。

WeiXinUrl 这个命令则是使用微信里的浏览器打开网页。有一些微信上的网页小游戏活动,都是需要通过微信里的浏览器登录才行,我们就可以利用这个命令实现了。

Import "ShanHai.lua"
// 这里定义好活动的网址
Dim AppUrl = "bbs.anjian.com"

Call shanhai.WeiXinUrl("com.tencent.mm", AppUrl)

24直接用按键也能写插件功能

引言:安卓按键的插件可以实现很多按键本身无法实现的功能,所以有些同学就会很羡慕会写插件的人。其实呢~~安卓按键的插件并没有那么的复杂,一些功能其实直接通过按键代码的封装也能实现,另外一些设备命令的话就是通过linux或者adb的命令行来实现的。今天就教大家如何直接在按键里来实现插件的功能。




相关命令:
命令名称:Execute
命令功能:执行shell命令  
参数:参数1【必要】:字符串,shell命令
返回值:命令执行成功返回true


了解lua语言的同学就能知道这个其实就是lua当中的os.execute命令,相当于是用来执行一些常见的linuxadb shell的命令

目前这个命令我只是简单的封装了原始的lua命令,所以只能返回命令本身是否执行成功。想要获取到命令的结果,可以看下面的教程。


【范例】

重启:
// reboot 是adb shell命令中的重启指令
Call shanhai.Execute("reboot")


关机:
// reboot -p 是adb shell命令中的关机指令
Call shanhai.Execute("reboot -p ")


设置输入法:
Import "ShanHai.lua"
// 设置搜狗输入法
Call shanhai.Execute("ime set com.sohu.inputmethod.sogou/.SogouIME")

ime 命令是adb shell命令里和输入法有关的命令,可以用来获取输入法和设置输入法,后面是跟上输入法的组件。
这个组件名可以通过山海插件里的GetIME来获取到。
在插件里的设置输入法命令,本身只附带有11种输入法,如果大家设备上有安装其他的输入法的话,那就可以利用execute这个命令自己去切换输入法了。

上面的命令都是用于设置,那如果想要获取一些信息该如何实现呢?

前面有说过,目前这个命令是只能返回是否执行成功,要想把执行的结果输出的话就得借助cmd命令里的重定向到文件的符号(>),这个功能可以把命令的结果写入到一个文本里,之后我们再去读取这个文本就好了。


【范例】


获取设备电源信息:
Import "ShanHai.lua"

Dim ret = shanhai.Execute("dumpsys battery > /sdcard/tmp.txt")
Dim text
If ret Then 
    TracePrint "命令执行成功"
    text = file.Read("/sdcard/tmp.txt")
    TracePrint text
Else 
    TracePrint "命令执行失败"
End If

dumpsys battery 是adb shell命令,用来获取电源相关信息,"dumpsys battery > /sdcard/tmp.txt" 这命令的意思就是把“dumpsys battery”的结果写入到“/sdcard/tmp.txt”这个文件里
之后我们再通过去读取这个文件的内容就能知道结果了。

那我们可以根据这个操作来封装一个获取执行结果的函数
Import "ShanHai.lua"

Function execute(cmd)
    Dim path = GetSdcardDir() & "/tmp.txt"
    Dim ret = shanhai.Execute(cmd & " > " & path)
    If ret Then 
        execute = file.Read(path)
    Else 
        execute = ""
    End If
End Function

// 获取电源信息
TracePrint execute("dumpsys battery")

// 获取设备内存占用信息
TracePrint execute("dumpsys meminfo")

OK~~那这个命令就介绍到这里。有了这个命令,就可以直接在按键里去实现插件的功能了。很多命令都是需要依靠linux或者adb shell命令来实现的。命令能实现的功能有非常多,这里就不具体介绍了,在网上可以找到非常丰富的教程,大家可以自行百度~~


25应用界面一步直达

引言:本节给大家带来一个可以获取当前应用界面组件名的命令,这个命令可以配合着实现一些便捷的效果。



相关命令:
命令名称:GetTopActivity
命令功能:获取当前应用包名与组件名   
参数:
返回值:返回当前应用包名与组件名  


包名大家都明白是什么了。那这里就简单的说说什么是组件名。

组件简单的说可以理解为组成程序的各个部分。每个组件都有它自己的名称,比如微信内嵌的浏览器的组件名就是:“.plugin.webview.ui.tools.WebViewUI”。我们这里介绍的命令就是用来获取当前应用界面的组件的。

比如我们来获取下QQ的“附近”功能的组件
我们先手动打开QQ的“附近”界面,然后运行下面的代码:
TracePrint shanhai.GetTopActivity()
我们可以得到“com.tencent.mobileqq/.activity.NearbyBaseActivity”这样的结果。其中“com.tencent.mobileqq”这个是QQ的包名,“.activity.NearbyBaseActivity”这个就是“附近”功能的组件名了

那获取到了组件名有什么用呢?其实在之前就有过一篇教程贴有说过这个组件名的用处了揭开RunApp命令的特殊用法
之前的那篇帖子需要你手动去输入各种adb命令才能获取到应用的组件名,比较繁琐。现在只要一条命令就能获取到了。

// 打开QQ“附近功能”
RunApp "com.tencent.mobileqq", ".activity.NearbyBaseActivity"

有了这样的快捷打开应用的某个组件的功能可以提高脚本的兼容性还有效率。

同样的,我们还可以用来获取一些微信的组件,比如说漂流瓶、朋友圈之类的。包括登录界面都可以直接获取到然后用runapp来开启。


注意:并不是所有应用的组件名都可以直接运行,所以在使用直接运行组件的功能的时候需要先测试下该组件是否支持直接运行。


26一个让你可以少些N行的判断命令

引言:大家平时写脚本都会用到 if 的判断,比较经常会判断一个条件的真假,然后根据真假再分别输出或者执行一些内容。但是有个不好的地方就是写判断语句的时候需要些好几行代码,这次教程就给大家介绍一个很实用的命令。




相关命令:
命令名称:iif
命令功能:用于根据条件的真假,来返回指定的内容  
参数:参数1【必要】:字符串,条件表达式
参数2【必要】:字符串,当条件成立时返回这个参数内容
参数3【必要】:字符串,当条件不成立时返回这个参数内容
返回值:根据提交的真假返回对应的内容   


这个命令就是用来简if判断语句的。俗话说没有对比就没有伤害,我们用一个简单的小范例来对比下
常规的if判断:
Dim num = 11
If IsNumeric(num) = true Then 
    TracePrint "变量类型是数字"
Else 
    TracePrint "变量类型不是数字"
End If

使用iif命令简化
Import "ShanHai.lua"
Dim num = 11
TracePrint shanhai.iif(IsNumeric(num),"变量类型是数字", "变量类型不是数字")


通过这样的比较你就可以发现,原先6行的代码被简化成了最多3行。这个就是iif命令的简便的地方了。可以在一些需要简单判断的地方简化代码。

命令会根据第一个参数表达式返回的结果,来进行判断,如果表达式的结果为真,那就会返回iif命令的第二个参数的内容,如果结果是0或者假的话,则会返回iif命令的第三个参数的内容。



上面的这个例子只是用很普通的变量进行了一些判断,返回的内容也只是字符串而已,实际上这个命令还可以扩展成判断函数返回以及根据返回去调用函数。
Function FindPicEx(x, y, x1, y1, pic)
    Do
        Dim intX, intY
        FindPic x, y, x1, y1, pic,"000000",0, 0.8, intX, intY
        If intx > -1 Then 
            FindPicEx = True
            Exit Do
        Else 
            FindPicEx = false
        End If
        Delay 1000
    Loop
End Function

Function Click(x, y)
    For 5
        Tap x, y
        Delay 500
    Next
End Function

Function SwipeEx(x, y, x1, y1)
    For 2
        Swipe x, y, x1, y1, 1000
        Delay 1000
    Next
End Function

Call shanhai.iif(FindPicEx(277,967,364,1018,"Attachment:1.png"),Click(100,200), SwipeEx(100,200,200,600))

27随机数命令也能如此好用

引言:随机数平时大家多少都有接触到,按键本身就只有一个Rnd命令,如果要实现其他的功能的话还得自己去封装,太麻烦了。这次就介绍几个插件里的随机数命令给大家。




相关命令:
命令名称:RndEx
命令功能:生成指定范围的随机数  
参数:参数1【必要】:整数型,随机数最小值
参数2【必要】:整数型,随机数最大值
返回值:返回生成的随机数


命令名称:RandArray
命令功能:生成数组内随机的一个内容   
参数:参数1【必要】:数组,指定的数组
返回值:返回数组中随机的一个值

RndEx
RndEx 命令使用的时候只要填写下随机数的范围参数,使用起来很简单

Import "ShanHai.lua"

For 10
    TracePrint shanhai.RndEx(1, 10)
Next

这样就能轻松的去实现取1-10之间的范围随机数了。
注意:有的同学会在使用随机数的时候加入Randomize命令来初始化随机种子,但是位置如果没写对的话就会导致随机数取值问题
问题代码:
Import "ShanHai.lua"

For 10
    Randomize
    TracePrint shanhai.RndEx(1, 10)
Next

这样的结果就是每次都取出同样的值。所以在使用范围随机的时候不要在循环里加入Randomize命令。(其实这个命令如果没有一些特殊需要的话就没必要使用)



RandArray


RandArray 这个命令是用来从一个数组随机取一个值的内容。用途就会比较广了。

取指定不连续的数字的随机数

Import "ShanHai.lua"

Dim arrNum = array(5,21,878,32,0)

For 5
    TracePrint shanhai.RandArray(arrNum)
Next


我们还能实现点击随机的一些坐标

Import "ShanHai.lua"

Dim tPoin = {{543,376}, {490,466}, {556,516}, {500,964}}
Dim tempXY
For 5
    tempXY = shanhai.RandArray(tPoin)
    TracePrint tempXY[1], tempXY[2]
    Tap tempXY[1], tempXY[2]
    Delay 1000
Next


28更为强大的HTTP方法

引言:按键本身自带有HTTP的GET和POST方法,但是呢~功能还不够强大,现在很多的网站的GET信息都需要附带一些特定的Header信息才能正确获取到结果。而按键自带的GET恰好没有这样的功能,实在很遗憾。但是插件命令里就能实现了。




相关命令:

命令名称:GetHttp
命令功能:Get访问HTTP资源   
参数:参数1【必要】:字符串,访问的网址
参数2【可选】:整数型,设置最大的超时时间
参数3【可选】:字符串,自定义头信息
返回值:返回获取到的网页源代码  


命令名称:PostHttp
命令功能:Post访问HTTP资源   
参数:参数1【必要】:字符串,访问的网址
参数2【必要】:字符串,post提交的信息
参数3【可选】:整数型,设置最大超时时间
参数4【可选】:字符串,自定义信息头
返回值:返回获取到的网页源码  


这两个命令和官方的命令最大的差别就在于可以添加自定义信息头。有了这样的功能我们可以做很多的事情~~

这里给大家介绍一个百度的良心网站——API集市。这里有很多收费或者免费的API可以使用,功能多的超乎想象。他只需要通过GET方法加上特殊的Header信息头就能实现很多事情。

范例:

通过GET来获取天气
Import "ShanHai.lua"

// 想要查询的城市
Dim param = "福州"
// 自己的百度API的key,可以在API后台查到
Dim header = "apikey:648fe2b8c016014bbe3b287d0d1c622f"
// get提交信息
TracePrint shanhai.GetHttp("http://apis.baidu.com/apistore/weatherservice/cityname?cityname=" & param, 10, header)

百度API返回的数据是JSON格式的,我们可以转换成Table数据格式以便查看具体的数据。我们来把这个查询天气的功能封装下

Import "ShanHai.lua"

Function GetWeather(city, apikey)
    // 定义数据    
    Dim api_url = "http://apis.baidu.com/apistore/weatherservice/cityname?cityname=" & city
    Dim header = "apikey:" & apikey
    // 提交信息
    Dim json = shanhai.GetHttp(api_url, 10, header)
    // json数据转成table数据
    Dim table = Encode.JsonToTable(json)
    GetWeather = table
End Function

Dim weather = GetWeather("福州", "648fe2b8c016014bbe3b287d0d1c622f")
If weather["errNum"] = 0 Then 
    TracePrint "福州今日的天气:" & weather["retData"]["weather"]
    TracePrint "今日气温:" & weather["retData"]["temp"]
Else 
    TracePrint "查询失败"
End If

我们还可以通过api去查询汇率


Import "ShanHai.lua"

Function Converter(fromCurrency, toCurrency, amount)
    // 定义数据    
    Dim api_url = "http://apis.baidu.com/apistore/currencyservice/currency?" 
    api_url = api_url & "&fromCurrency=" & fromCurrency
    api_url = api_url & "&toCurrency=" & toCurrency
    api_url = api_url & "&amount=" & amount
    Dim header = "apikey:648fe2b8c016014bbe3b287d0d1c622f"
    // 提交信息
    Dim json = shanhai.GetHttp(api_url, 10, header)
    // json数据转成table数据
    Dim table = Encode.JsonToTable(json)
    Converter = table
End Function

Dim currency = Converter("CNY", "USD", 500)
If currency["errNum"] = 0 Then 
    TracePrint "按照" & currency["retData"]["date"] & "的汇率转换之后的金额是:" & currency["retData"]["convertedamount"]
Else 
    TracePrint "查询失败"
End If

怎么样?是不是感觉配合百度的api之后就可以实现了各种高大上的功能了?百度的api集市上还有非常丰富的功能,大家可以自行去了解,相应的返回的信息也都可以查询到,这里就不一一的详述了。


29手机图库看不到图片?有办法!

引言:相信大家都有用过SnapShot截图命令,使用这个命令可以截图保存成文件。但是有一个比较严重的问题,在使用这个命令截图之后,在手机自带的图库里看不到截的图!!必须要打开这个文件路径才能看到图片。这是因为命令截出的图片,在系统的图库中没有刷新导致的,要解决也很简单。



相关命令:

命令名称:UpdatePicture
命令功能:发送广播强制刷新指定目录下的图片到图库展示
参数:参数1【必要】:字符串,欲刷新的目录路径
返回值:


系统图库之所以没有刷新出命令截图,是因为命令截图之后系统图库并没有收到更新的通知。所以这个命令的作用就是发送一个通知给系统图库,让它刷新下指定路径下的图片即可。
我们来具体的看下效果。首先我们先单独的截图不刷新看看,随便在一个界面上运行截图代码
SnapShot "/sdcard/test.png",100,100,300,300
我们去看下系统图库:

【山海插件教程】

【山海插件教程】

图库里什么都没有
我们再来试下刷新图库命令看看效果:
Import "ShanHai.lua"

// 截图
SnapShot "/sdcard/test.png",100,100,300,300
// 刷新图库
ShanHai.UpdatePicture ("/sdcard/")

再看看图库

【山海插件教程】

【山海插件教程】


运行了刷新图库的命令之后,图库中就会自动加入刚才截好的图了。


30一个命令让排序不再复杂
引言:对于一些新手同学来说要实现一个数字的排序实在是让人头疼不已,在编程里最常见简单的就是冒泡排序法~~但是也得要写一堆的代码。那我们今天就来把排序给简化掉。



相关命令:

命令名称:Sort
命令功能:对数组进行升序或者降序排列  
参数:参数1【必要】:数组,需要排序的数组
参数2【可选】:布尔值,true为降序排列; false为升序排列. 不填则默认为升序
返回值:

排序的算法里最简单最常见的就是“冒泡排序法”,它是使用第三方的变量来进行遍历对比,对于新手来说比较麻烦
冒泡排序常见范例:

Dim nums = Array(3, 5, 7, 2, 0, 9)
For i = 1 To UBound(nums)
  For j = 0 To UBound(nums)-1 
    If nums(j) > nums(j + 1) Then 
      temp = nums(j)
      nums(j) = nums(j + 1)
      nums(j + 1) = temp
    End If
  Next
Next

For Each v In nums
    TracePrint v
Next

使用起来并不友好~~我们可以直接用sort命令来简化掉


Import "ShanHai.lua"

Dim nums
nums = Array(3, 5, 7, 2, 0, 9)
// 升序排列
nums = shanhai.sort(nums)
For Each v In nums
    TracePrint v
Next

// 降序排列
nums = shanhai.sort(nums, true)
For Each v In nums
    TracePrint v
Next

浮生若梦,梦移山海
发新帖
您需要登录后才可以回帖 登录 | 注册成为果猿 微信登录

手机版

© 2020-2030 果壳热 All rights reserved.

Powered by GUOHOT XS8.8. Theme designed by GUOKEHOT.

top bottom