• API
  • 请求示例
  • 按键精灵
  • 按键精灵2014
  • 懒人精灵
  • EasyClick
  • Python
  • Java
Import "Cjson.lua"
Import "ShanHai.lua"

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

Thread.SetShareVar "项目ID", ""

Thread.SetShareVar "项目秘钥", ""

获取项目信息()

Function 获取项目信息()
    Dim timeStamp = Time()
    Dim sign = Encode.Md5(Thread.GetShareVar("项目ID")&Thread.GetShareVar("项目秘钥")&timeStamp)
    //发送请求
    Dim 请求返回 = ""&URL.Get(Thread.GetShareVar("请求地址")&"xm?xmid="&Thread.GetShareVar("项目ID")&"&timeStamp="&timeStamp&"&sign="&sign,5)
    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
            Dim dataText = json["data"]
            TracePrint "数据:"&dataText
            //服务器返回校验
            Dim serviceSign = json["sign"]
            Dim localSign = Mid(Encode.Md5(Thread.GetShareVar("项目ID")&Thread.GetShareVar("项目秘钥")&ShanHai.Base64En(dataText)&timeStamp),1,4)
            TracePrint "serviceSign:"&serviceSign
            TracePrint "localSign:"&localSign
            If not localSign = serviceSign Then
                TracePrint "非法的返回!"
                Dialog.MsgBox("\t\t\t\t\t\t\t\t提示:非法的返回!",0)
                EndScript//停止辅助
            Else
                TracePrint "成功的返回!"
            End If
            //JSON字符串转换为Table
            Dim data = Cjson.Decode(dataText)
            //项目状态 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    
Dim 项目ID,项目秘钥

项目ID = ""

项目秘钥 = ""

Call 获取项目信息()

Function 获取项目信息()
    Dim timeStamp,sign,请求地址,响应内容,状态,数据,项目状态,版本状态,项目版本,下载地址,最低状态,最低版本,更新地址,公告状态,项目公告,试用状态,试用时长,本地校验,服务器校验
    timeStamp = getTime()
    sign = Plugin.Encrypt.Md5String(项目ID&项目秘钥&timeStamp)
    TracePrint "时间戳:"&timeStamp
    请求地址 = "http://api.yankami.cn/xm"
    响应内容 = Lib.网络.获得网页源文件_增强版(请求地址&"?xmid="&项目ID&"&timeStamp="&timeStamp&"&sign="&sign,"utf-8")
    TracePrint "响应内容:"&响应内容
    状态 = json解析(响应内容, "code")
    TracePrint "状态:" & 状态
    If 状态 = 201 Then
        TracePrint "项目不存在!"
        MessageBox "项目不存在!"
        ExitScript//停止辅助
    ElseIf 状态 <> 200 Then
        TracePrint "获取项目信息失败!"
        MessageBox "获取项目信息失败!"
        ExitScript//停止辅助
    Else
        数据 = json解析(响应内容, "data")
        TracePrint "数据:" & 数据
        //服务器返回校验
        服务器校验 = json解析(响应内容, "sign")
        本地校验 = Mid(LCase(Plugin.Encrypt.Md5String(项目ID&项目秘钥&Base64Encode(数据)&timeStamp)),1,4)
        TracePrint "本地校验:"&本地校验
        TracePrint "服务器校验:"&服务器校验
        If not 本地校验 = 服务器校验 Then
            TracePrint "非法的返回!"
            MessageBox "非法的返回!"
            ExitScript//停止辅助
        End If
        项目状态 = json解析(数据, "xmzt")
        版本状态 = json解析(数据, "bbzt")
        项目版本 = json解析(数据, "xmbb")
        下载地址 = json解析(数据, "xzdz")
        最低状态 = json解析(数据, "zdzt")
        最低版本 = json解析(数据, "zdbb")
        更新地址 = json解析(数据, "gxdz")
        公告状态 = json解析(数据, "ggzt")
        项目公告 = json解析(数据, "xmgg")
        试用状态 = json解析(数据, "syzt")
        试用时长 = json解析(数据, "sysc")
        //项目状态 1启用 0停用
        TracePrint "项目状态:"&项目状态
        //版本状态 1启用 0停用
        TracePrint "版本状态:"&版本状态
        //项目版本
        TracePrint "项目版本:"&项目版本
        //下载地址
        TracePrint "下载地址:"&下载地址
        //最低状态 1启用 0停用
        TracePrint "最低状态:"&最低状态
        //最低版本
        TracePrint "最低版本:"&最低版本
        //更新地址
        TracePrint "更新地址:"&更新地址
        //公告状态 1启用 0停用
        TracePrint "公告状态:"&公告状态
        //项目公告
        TracePrint "项目公告:"&项目公告
        //试用状态 1启用 0停用
        TracePrint "试用状态:"&试用状态
        //试用时长
        TracePrint "试用时长:"&试用时长
        If 公告状态 = 1 Then
            MessageBox 项目公告
        End If
    End If
End Function

Function Base64Encode(Str)
    Dim BASE64_CHARS
    BASE64_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    Dim length, modValue, result, i, a, b, c, d
    Str = StringToByteArray(Str)
    length = UBound(Str) + 1
    modValue = length Mod 3
    result = ""
    For i = 0 To length - modValue - 1 Step 3
        a = (Str(i) And &HFC) \ &H4
        b = ((Str(i) And &H3) * &H10) Or ((Str(i + 1) And &HF0) \ &H10)
        c = ((Str(i + 1) And &HF) * &H4) Or ((Str(i + 2) And &HC0) \ &H40)
        d = Str(i + 2) And &H3F

        result = result & Mid(BASE64_CHARS, a + 1, 1)
        result = result & Mid(BASE64_CHARS, b + 1, 1)
        result = result & Mid(BASE64_CHARS, c + 1, 1)
        result = result & Mid(BASE64_CHARS, d + 1, 1)
    Next
    If modValue = 1 Then
        a = (Str(length - 1) And &HFC) \ &H4
        b = (Str(length - 1) And &H3) * &H10
        result = result & Mid(BASE64_CHARS, a + 1, 1)
        result = result & Mid(BASE64_CHARS, b + 1, 1)
        result = result & "=="
    ElseIf modValue = 2 Then
        a = (Str(length - 2) And &HFC) \ &H4
        b = ((Str(length - 2) And &H3) * &H10) Or ((Str(length - 1) And &HF0) \ &H10)
        c = (Str(length - 1) And &HF) * &H4
        result = result & Mid(BASE64_CHARS, a + 1, 1)
        result = result & Mid(BASE64_CHARS, b + 1, 1)
        result = result & Mid(BASE64_CHARS, c + 1, 1)
        result = result & "="
    End If
    Base64Encode = result
End Function

//字符串转数组
Function StringToByteArray(szInput)
    Dim i, byteArray, wch, nAsc
    byteArray = ""
    For i=1 To Len(szInput)
        wch = Mid(szInput, i, 1)
        nAsc = AscW(wch)
        If nAsc < 0 Then
            nAsc = nAsc + 65536
        End If
        If (nAsc And &HFF80) = 0 Then
            byteArray = byteArray & "," & AscW(wch)
        Else
            If (nAsc And &HF000) = 0 Then
                byteArray = byteArray & "," &  Cint("&H" & Hex(((nAsc \ 2 ^ 6)) Or &HC0)) - 256 & "," & Cint("&H" & Hex(nAsc And &H3F Or &H80))-256
            Else
                byteArray = byteArray & "," &  Cint("&H" & Hex((nAsc \ 2 ^ 12) Or &HE0)) - 256 & "," & Cint("&H" & Hex((nAsc \ 2 ^ 6) And &H3F Or &H80)) - 256 & "," & Cint("&H" & Hex(nAsc And &H3F Or &H80)) - 256
            End If
        End If
    Next
    If Left(byteArray, 1) = "," Then
        byteArray = Right(byteArray, Len(byteArray) - 1)
    End If
    StringToByteArray = Split(byteArray, ",")
End Function

Function json解析(resp,json路径)
    Set sc = CreateObject("MSScriptControl.ScriptControl")
    sc.Language = "JScript"
    sc.AddCode "var tmp = " & resp & ";"
    json解析 = sc.Eval("tmp." & json路径)
End Function

Function getTime()
	Dim 年, 月, 天, 小时, 分钟, 秒, dataTime
	dataTime = Plugin.GetSysInfo.GetDateTime()
	年 = Year(dataTime)
	月 = Month(dataTime) - 2
	天 = Day(dataTime) - 1
	小时 = Hour(dataTime)
	分钟 = Minute(dataTime)
	秒 = Second(dataTime)
	If 月 < 0 Then
		月 = 月 + 12
		年 = 年 - 1
	End If
	getTime = (((((Round((年 - 1) * 365 + 年 / 4 - 年 / 100 + 年 / 400) + Int((((367 * 月) / 12) - 30) + 59) + 天 - 719162) * 24 + (小时 - 8)) * 60) + 分钟) * 60 + 秒)
End Function    
local 请求地址 = "https://api.yankami.cn/"
local 项目ID = ""
local 项目秘钥 = ""

function 获取项目信息()
	local timeStamp = os.time()
	local sign = MD5(项目ID .. 项目秘钥 .. timeStamp);
	local ret, code = httpPost(请求地址 .. "xm", "xmid=" .. 项目ID .. "&timeStamp=" .. timeStamp .. "&sign=" .. sign)
	if code ~= 200 or not (utf8.mid(ret, 1, 1) == "{" and utf8.mid(ret, utf8.length(ret), 1) == "}") then
		print("获取项目信息失败!")
		toast("获取项目信息失败!")
		restartScript()
	end
	ret = jsonLib.decode(ret)
	if ret.code == 201 then
		print("项目不存在!")
		toast("项目不存在!")
		restartScript()
	elseif ret.code ~= 200 then
		print("获取项目信息失败!")
		toast("获取项目信息失败!")
		restartScript()
	end
	local serviceSign = ret.sign
	local localSign = string.sub(MD5(项目ID .. 项目秘钥 .. encodeBase64(ret.data) .. timeStamp), 1, 4)
	print("serviceSign:" .. serviceSign)
	print("localSign:" .. localSign)
	if not (string.lower(serviceSign) == string.lower(localSign)) then
		print("非法的返回!")
		toast("非法的返回!")
		restartScript()
	end
	local data = jsonLib.decode(ret.data)
	print(data)
	--项目状态 1启用 0停用
	print("项目状态:" .. data.xmzt)
	--版本状态 1启用 0停用
	print("版本状态:" .. data.bbzt)
	--项目版本
	print("项目版本:" .. data.xmbb)
	--下载地址
	print("下载地址:" .. data.xzdz)
	--最低状态 1启用 0停用
	print("最低状态:" .. data.zdzt)
	--最低版本
	print("最低版本:" .. data.zdbb)
	--更新地址
	print("更新地址:" .. data.gxdz)
	--公告状态 1启用 0停用
	print("公告状态:" .. data.ggzt)
	--项目公告
	print("项目公告:" .. data.xmgg)
	--试用状态 1启用 0停用
	print("试用状态:" .. data.syzt)
	--试用时长
	print("试用时长:" .. data.sysc)
	if data.xmzt == 0 then
		print("项目已经停用!")
		toast("项目已经停用!")
		restartScript()
	end
	if data.ggzt == 1 then
		print(data.xmgg)
		toast(data.xmgg)
		sleep(1000)
	end
end

获取项目信息()    
var 请求地址 = "https://api.yankami.cn/"

var 项目ID = ""

var 项目秘钥 = ""

获取项目信息()

function 获取项目信息() {
    var timeStamp = parseInt(new Date().getTime() / 1000)
    console.log("timeStamp:" + timeStamp)
    var sign = UtilsWrapper.prototype.dataMd5(项目ID + 项目秘钥 + timeStamp)
    var 请求返回 = sendGet(请求地址 + "xm?xmid=" + 项目ID + "&timeStamp=" + timeStamp + "&sign=" + sign)
    console.log("获取项目信息:" + 请求返回)
    if (!请求返回.startsWith("{") || !请求返回.endsWith("}")) {
        console.log("获取项目信息失败!")
        toast("获取项目信息失败!")
        sleep(1000)
        exit()//停止辅助
    } else {
        //解析JSON
        var json = JSON.parse(请求返回)
        if (json["code"] == 201) {
            console.log("项目不存在!")
            toast("项目不存在!")
            sleep(1000)
            exit()//停止辅助
        } else if (json["code"] != 200) {
            console.log("获取项目信息失败!")
            toast("获取项目信息失败!")
            sleep(1000)
            exit()//停止辅助
        } else {
            var sign = json["sign"]
            var localSign = UtilsWrapper.prototype.dataMd5(项目ID + 项目秘钥 + base64(json["data"]) + timeStamp).substring(0, 4)
            console.log("serviceSign:" + sign)
            console.log("localSign:" + localSign)
            if (localSign != sign) {
                console.log("非法的返回!")
                toast("非法的返回!")
                sleep(1000)
                exit()//停止辅助
            }
            //解析JSON
            var data = JSON.parse(json["data"])
            //项目状态 1启用 0停用
            console.log("项目状态:" + data["xmzt"])
            //版本状态 1启用 0停用
            console.log("版本状态:" + data["bbzt"])
            //项目版本
            console.log("项目版本:" + data["xmbb"])
            //下载地址
            console.log("下载地址:" + data["xzdz"])
            //最低状态 1启用 0停用
            console.log("最低状态:" + data["zdzt"])
            //最低版本
            console.log("最低版本:" + data["zdbb"])
            //更新地址
            console.log("更新地址:" + data["gxdz"])
            //公告状态 1启用 0停用
            console.log("公告状态:" + data["ggzt"])
            //项目公告
            console.log("项目公告:" + data["xmgg"])
            //试用状态 1启用 0停用
            console.log("试用状态:" + data["syzt"])
            //试用时长
            console.log("试用时长:" + data["sysc"])
            if (data["xmzt"] == 0) {
                console.log("项目已停用!")
                toast("项目已停用!")
                sleep(1000)
                exit()//停止辅助
            }
        }
    }
}

//编码
function base64(str) {
    return java.lang.String(android.util.Base64.encode(java.lang.String(str).getBytes(), 2));
}

//发送Get请求
function sendGet(target) {
    return "" + HttpWrapper.prototype.httpGet(target, null, 30000, null)
}    
import base64
import json
import requests
import hashlib
import time

def 获取项目信息(项目ID, 项目秘钥):
    timeStamp = int(time.time())
    print(f"时间戳: {timeStamp}")
    sign = hashlib.md5((str(项目ID) + 项目秘钥 + str(timeStamp)).encode('utf-8')).hexdigest()
    params = {"xmid": 项目ID, "timeStamp": timeStamp, "sign": sign}
    try:
        if False:
            result = requests.get('https://api.yankami.cn/xm', params=params).json()
        else:
            result = requests.post('https://api.yankami.cn/xm', data=params).json()
        print("result:", result)
        code = result["code"]
        if code == 201:
            print("项目不存在!")
        elif code != 200:
            print("获取项目信息失败!")
        else:
            data = result["data"]
            print("data:", data)
            serviceSign = result["sign"]
            localSign = hashlib.md5((str(项目ID) + 项目秘钥 + base64.b64encode(str(data).encode('utf-8')).decode('utf-8') + str(timeStamp)).encode('utf-8')).hexdigest()[0:4]
            print("serviceSign:", serviceSign)
            print("localSign:", localSign)
            if serviceSign != localSign:
                print("非法的返回!")
            else:
                print("成功的返回!")
                data = json.loads(data)
                # 项目状态 1启用 0停用
                print("项目状态:", data["xmzt"])
                # 版本状态 1启用 0停用
                print("版本状态:", data["bbzt"])
                # 项目版本
                print("项目版本:", data["xmbb"])
                # 下载地址
                print("下载地址:", data["xzdz"])
                # 最低状态 1启用 0停用
                print("最低状态:", data["zdzt"])
                # 最低版本
                print("最低版本:", data["zdbb"])
                # 更新地址
                print("更新地址:", data["gxdz"])
                # 公告状态 1启用 0停用
                print("公告状态:", data["ggzt"])
                # 项目公告
                print("项目公告:", data["xmgg"])
                # 试用状态 1启用 0停用
                print("试用状态:", data["syzt"])
                # 试用时长
                print("试用时长:", data["sysc"])
    except Exception as e:
        print(f"获取项目信息失败:{e}")

if __name__ == "__main__":
    项目ID = ""
    项目秘钥 = ""
    获取项目信息(项目ID, 项目秘钥)    

pom


    
    

java

import org.json.JSONException;
import org.json.JSONObject;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class 项目信息 {
	
	public static void main(String[] args) throws Exception {
		String xmid = "";
		String xmmy = "";
		long timeStamp = System.currentTimeMillis() / 1000;
		String sign = getMD5(xmid + xmmy + timeStamp);
		String url = "https://api.yankami.cn/xm?xmid=" + xmid
					 + "&timeStamp=" + timeStamp
					 + "&sign=" + sign;
		JSONObject jsonEntity = RequestTool.getRequest(url);
		System.out.println("jsonEntity:" + jsonEntity);
		if (jsonEntity != null) {
			int code = jsonEntity.getInt("code");
			if (code == 201) {
				System.out.println("项目不存在!");
			} else if (code != 200) {
				System.out.println("获取项目信息失败!");
			} else {
				String dataText = jsonEntity.getString("data");
				String serviceSign = jsonEntity.getString("sign");
				String localSign = getMD5(xmid + xmmy + Base64encodeToString(dataText) + timeStamp).substring(0, 4);
				System.out.println("serviceSign:" + serviceSign);
				System.out.println("localSign:" + localSign);
				boolean check = localSign.equalsIgnoreCase(serviceSign);
				if (!check) {
					System.out.println("非法的返回!");
				} else {
					System.out.println("成功的返回!");
					JSONObject data = new JSONObject(dataText);
					System.out.println("成功的返回!");
					//项目状态 1启用 0停用
					System.out.println("项目状态:" + data.getInt("xmzt"));
					//版本状态 1启用 0停用
					System.out.println("版本状态:" + data.getInt("bbzt"));
					//项目版本
					System.out.println("项目版本:" + data.getString("xmbb"));
					//下载地址
					System.out.println("下载地址:" + data.getString("xzdz"));
					//最低状态 1启用 0停用
					System.out.println("最低状态:" + data.getInt("zdzt"));
					//最低版本
					System.out.println("最低版本:" + data.getString("zdbb"));
					//更新地址
					System.out.println("更新地址:" + data.getString("gxdz"));
					//公告状态 1启用 0停用
					System.out.println("公告状态:" + data.getInt("ggzt"));
					//项目公告
					System.out.println("项目公告:" + data.getString("xmgg"));
					//试用状态 1启用 0停用
					System.out.println("试用状态:" + data.getInt("syzt"));
					//试用时长
					System.out.println("试用时长:" + data.getString("sysc"));
				}
			}
		}
	}
	
	public static String Base64encodeToString(String text) {
		return Base64.getEncoder().encodeToString(text.getBytes(StandardCharsets.UTF_8));
	}
	
	public static String getMD5(String text) throws NoSuchAlgorithmException {
		byte[] bytes = MessageDigest.getInstance("MD5").digest(text.getBytes(StandardCharsets.UTF_8));
		StringBuilder builder = new StringBuilder(32);
		for (byte b : bytes) {
			builder.append(String.format("%02x", b));
		}
		return builder.toString();
	}
	
	public static JSONObject getRequest(String url) throws Exception {
		URL obj = new URL(url);
		HttpURLConnection con = (HttpURLConnection) obj.openConnection();
		con.setConnectTimeout(10000);
		con.setRequestMethod("GET");
		if (con.getResponseCode() == 200) {
			return getJSON(responseReader(con.getInputStream()));
		}
		return null;
	}
	
	private static String responseReader(InputStream inputStream) throws IOException {
		InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
		StringBuilder stringBuilder = new StringBuilder();
		int len;
		char[] chars = new char[8192];
		while ((len = inputStreamReader.read(chars)) != -1) {
			stringBuilder.append(chars, 0, len);
		}
		inputStreamReader.close();
		return stringBuilder.toString();
	}
	
	private static JSONObject getJSON(String text) throws JSONException {
		if (text != null) {
			int indexOf = text.indexOf("{");
			int lastIndexOf = text.lastIndexOf("}");
			if (indexOf != -1 && lastIndexOf != -1) {
				return new JSONObject(text.substring(indexOf, lastIndexOf + 1));
			}
		}
		return null;
	}
}
    
获取项目信息(JSON)
请求支持GET和POST:https://api.yankami.cn/xm
请求参数 是否必须 说明
xmid 是 项目ID
timeStamp 是 10位 时间戳
sign 是 签名 md5(项目ID + 项目秘钥 + 时间戳)
响应参数 响应状态 说明
code 200 成功
code 201 项目不存在
code 400 请求参数错误
code 500 获取项目信息失败
响应信息 响应参数 说明
message ... 响应 code 不是 200 时返回
响应数据 响应参数 说明
data ... 响应 code 是 200 时返回
data["xmzt"] 1 或 0 项目状态 1启用 0停用
data["bbzt"] 1 或 0 版本状态 1启用 0停用
data["xmbb"] ... 项目版本
data["xzdz"] ... 下载地址
data["zdzt"] 1 或 0 最低状态 1启用 0停用
data["zdbb"] ... 最低版本
data["gxdz"] ... 更新地址
data["ggzt"] 1 或 0 公告状态 1启用 0停用
data["xmgg"] ... 项目公告
data["syzt"] 1 或 0 试用状态 1启用 0停用
data["sysc"] ... 试用时长
响应校验 响应内容 说明
sign ... 响应 code 是 200 时返回 签名 md5(项目ID + 项目秘钥 + Base64(data) + 时间戳) 的前4位