【下载参考项目文件】

按键精灵参考代码复制修改即可

Import "Cjson.lua"
Import "ShanHai.lua"

//请求地址
Thread.SetShareVar "请求地址", "https://api.yankami.cn/"

//卡密后台登录账号 获取自己项目的信息
Thread.SetShareVar "开发者账号", ""

//卡密后台项目的ID
Thread.SetShareVar "项目ID", 0

//如果当前版本与服务器返回的版本不一致则提示更新
Thread.SetShareVar "项目版本", 0

//卡密后台项目的项目秘钥
Thread.SetShareVar "项目秘钥",""

//卡密后台登录账号 用户输入:RTrim(ReadUIConfig("账号"))
Thread.SetShareVar "账号", ""

//获取界面输入的卡密 用户输入:RTrim(ReadUIConfig("卡密"))
Thread.SetShareVar "卡密", ""

//首次验证会保存到期时间,首次验证失败会停止!
Thread.SetShareVar "验证超时分钟", 1440//可调整
Thread.SetShareVar "验证心跳频秒", 10//可调整
Thread.SetShareVar "验证时间", False//变量需要 不要调整
Thread.SetShareVar "获取卡密到期时间", False//变量需要 不要调整

//得到当前设备的唯一编号
Thread.SetShareVar "设备编号", GetDeviceID()

获取项目信息()

获取卡密信息()

Function 获取项目信息()
    Dim 验证码 = Time()
    //发送请求
    Dim 请求返回 = ""&URL.Get(Thread.GetShareVar("请求地址")&"xm?phone="&Thread.GetShareVar("开发者账号")&"&xmid="&Thread.GetShareVar("项目ID")&"&yzm="&验证码,1)
    TracePrint "获取项目信息:"&请求返回
    If InStr(1, 请求返回, "{") <> 1 or InStr(1, 请求返回, "code") = 0 Then
        TracePrint "获取项目信息失败"
        EndScript//停止辅助
    Else
        //JSON字符串转换为Table
        Dim json = Cjson.Decode(请求返回)
        If json["code"] = 201 Then
            TracePrint "项目不存在!"
            EndScript//停止辅助
        ElseIf json["code"] <> 200 Then
            TracePrint "获取项目信息失败!"
            EndScript//停止辅助
        Else
            //验证码校验
            If InStr(1, Encode.Md5(Thread.GetShareVar("项目秘钥")&ShanHai.Base64En(json["data"])&验证码), json["md5"]) <> 1 Then
                TracePrint "非法的返回!"
                //Dialog.MsgBox("\t\t\t\t\t\t\t\t提示:非法的返回!",0)
                EndScript//停止辅助
            Else
                TracePrint "成功的返回!"
            End If

            //JSON字符串转换为Table
            Dim data = Cjson.Decode(json["data"])

            //项目状态 1启用 0停用
            TracePrint "项目状态:"&data["xmzt"]
            //版本状态 1启用 0停用
            TracePrint "版本状态:"&data["bbzt"]
            //项目版本
            TracePrint "项目版本:"&data["xmbb"]
            //下载地址
            TracePrint "下载地址:"&data["xzdz"]
            //最低状态 1启用 0停用
            TracePrint "最低状态:"&data["zdzt"]
            //最低版本
            TracePrint "最低版本:"&data["zdbb"]
            //更新地址
            TracePrint "更新地址:"&data["gxdz"]
            //公告状态 1启用 0停用
            TracePrint "公告状态:"&data["ggzt"]
            //项目公告
            TracePrint "项目公告:"&data["xmgg"]
            //试用状态 1启用 0停用
            TracePrint "试用状态:"&data["syzt"]
            //试用时长
            TracePrint "试用时长:"&data["sysc"]

            //获取项目信息提示用户(data)
        End If
    End If
End Function

Function 获取项目信息提示用户(data)
    //提示公告
    If data["ggzt"] = 1 Then
        If data["xmgg"] <> Null and data["xmgg"] <> "" Then
            Dialog.MsgBox(data["xmgg"],0)
        End If
    End If

    //提示项目已停用
    If data["xmzt"] = 0 Then
        Dialog.MsgBox("\t\t\t\t\t\t\t 提示:项目已经停用!",0)
        EndScript
    End If

    //提示版本有更新及前往下载
    If data["bbzt"] = 1 Then
        If data["xmbb"] <> Thread.GetShareVar("项目版本") Then
            If Dialog.MsgBox("\t\t\t\t提示:辅助有更新是否前往下载!", 2) = 2 Then
                //返回主页
                KeyPress "Home"
                Delay 1000
                //打开下载地址
                ShanHai.OpenWeb (data["xzdz"])
                //停止辅助
                EndScript
            End If
        End If
    End If
End Function

Function 获取卡密信息()
    Dim 验证码 = Time()
    If not Thread.GetShareVar("获取卡密到期时间") or TickCount() - Thread.GetShareVar("验证时间") >= (Thread.GetShareVar("验证心跳频秒") * 1000)  or Thread.GetShareVar("获取卡密到期时间") and 验证码 > Thread.GetShareVar("获取卡密到期时间") Then
        If not Thread.GetShareVar("获取卡密到期时间") Then
            If Len(Thread.GetShareVar("账号")&"") = 0 Then
                Dialog.MsgBox("\t\t\t\t\t\t\t 提示:请输入账号!",0)
                EndScript
            End If
            If Len(Thread.GetShareVar("账号")&"") <> 11 Then
                Dialog.MsgBox("\t\t\t\t\t 提示:请输入正确的账号!",0)
                EndScript
            End If
            If Len(Thread.GetShareVar("卡密")&"") = 0 Then
                Dialog.MsgBox("\t\t\t\t\t\t\t 提示:请输入卡密!",0)
                EndScript
            End If
            If Len(Thread.GetShareVar("卡密")&"") < 8  or Len(Thread.GetShareVar("卡密")&"") > 40 Then
                Dialog.MsgBox("\t\t\t\t\t 提示:请输正确的卡密!",0)
                EndScript
            End If
            If Len(Thread.GetShareVar("设备编号")&"") < 5 or Len(Thread.GetShareVar("设备编号")&"") > 50 Then
                Dialog.MsgBox("\t\t\t\t\t\t\t\t\t 设备编号错误:"&Len(Thread.GetShareVar("设备编号")&""),0)
                EndScript
            End If
        End If
        //获取卡密信息
        Dim 请求返回 = ""&URL.Get(Thread.GetShareVar("请求地址")&"km?phone="&Thread.GetShareVar("账号")&"&xmid="&Thread.GetShareVar("项目ID")&"&km="&Thread.GetShareVar("卡密")&"&jqm="&Thread.GetShareVar("设备编号")&"&yzm="&验证码,1)
        TracePrint "获取卡密信息:"&请求返回
        If InStr(1, 请求返回, "{") <> 1 or InStr(1, 请求返回, "code") = 0 Then
            //如果是首次验证失败停止 或者 验证超时提示验证失败停止
            If not Thread.GetShareVar("获取卡密到期时间") or TickCount() - Thread.GetShareVar("验证时间") >= Thread.GetShareVar("验证超时分钟") * (1000 * 60) Then
                Dialog.MsgBox("\t\t\t\t\t\t\t验证失败,请重新运行!",0)
                EndScript
            End If
            If 验证码 > Thread.GetShareVar("获取卡密到期时间") Then
                TracePrint "卡密已经到期"
                Dialog.MsgBox("\t\t\t\t\t\t\t 提示:卡密已经到期!",0)
                EndScript
            End If
        Else
            //JSON字符串转换为Table
            Dim json = Cjson.Decode(请求返回)
            If json["code"] = 201 Then
                TracePrint "卡密不存在"
                Dialog.MsgBox("\t\t\t\t\t\t\t\t提示:卡密不存在!",0)
                EndScript
            ElseIf json["code"] = 202 Then
                TracePrint "项目已经停用"
                Dialog.MsgBox("\t\t\t\t\t\t\t 提示:项目已经停用!",0)
                EndScript
            ElseIf json["code"] = 203 Then
                TracePrint "卡密已经到期"
                Dialog.MsgBox("\t\t\t\t\t\t\t 提示:卡密已经到期!",0)
                EndScript
            ElseIf json["code"] = 204 Then
                TracePrint "已经绑定其他设备,提示用户是否换绑"
                If Dialog.MsgBox("\t\t\t\t提示:卡密已绑定其他设备!\n\n\t\t\t\t换绑:是否换绑到当前设备使用!", 2) = 2 Then
                    //换绑机器码
                    请求返回 = URL.Get(Thread.GetShareVar("请求地址")&"jqm?phone="&Thread.GetShareVar("账号")&"&xmid="&Thread.GetShareVar("项目ID")&"&km="&Thread.GetShareVar("卡密")&"&jqm="&Thread.GetShareVar("设备编号"),1)
                    TracePrint "换绑机器码:"&请求返回
                    Dim code
                    If InStr(1, 请求返回, "code") <> 0 Then
                        code = Cjson.Decode(请求返回)
                    End If
                    If code And code["code"] = 200 Then
                        TracePrint "换绑成功"
                        Dialog.MsgBox("\t\t\t\t\t\t\t\t  提示:换绑成功!",0)
                    Else
                        TracePrint "换绑失败"
                        Dialog.MsgBox("\t\t\t\t\t\t\t\t  提示:换绑失败!",0)
                    End If
                End If
                //停止辅助
                EndScript
            ElseIf json["code"] <> 200 Then
                Dialog.MsgBox("\t\t\t\t\t\t\t验证失败,请重新运行!",0)
                EndScript
            Else
                //验证码校验
                If InStr(1, Encode.Md5(Thread.GetShareVar("项目秘钥")&ShanHai.Base64En(json["data"])&验证码), json["md5"]) <> 1 Then
                    TracePrint "非法的返回!"
                    Dialog.MsgBox("\t\t\t\t\t\t\t\t提示:非法的返回!",0)
                    EndScript//停止辅助
                Else
                    TracePrint "成功的返回!"
                End If
                //JSON字符串转换为Table
                Dim data = Cjson.Decode(json["data"])
                //首次验证提示
                If not Thread.GetShareVar("获取卡密到期时间") Then
                    Dialog.MsgBox("\t\t\t卡密到期日期:"&DateTime.Format("%Y-%m-%d %H:%M:%S",data["dqsj"]),0)
                End If
                Thread.SetShareVar "验证时间", TickCount()
                Thread.SetShareVar "获取卡密到期时间", data["dqsj"]
            End If
        End If
    End If
End Function

//【主线程方式一】发送验证 等待返回  需要在主方法中循环调用来验证到期时间
Function 验证卡密()
    获取卡密信息()
End Function

//【主线程方式二】在休眠时验证 参数:休眠毫秒 减去等待时间  需要在主方法中循环调用来验证到期时间
Function 休眠验证(s)
    Dim 开始时间 = TickCount()
    获取卡密信息()
    Delay s + (开始时间-TickCount())
End Function

Do
    验证卡密()
    Delay 1000
Loop