• 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("请求地址")&"getVersionDefaultFileSubmit?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"] <> 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)
            TracePrint "获取版本文件信息 上传时间:"&data["uploadDate"]
            TracePrint "获取版本文件信息 文件名:"&data["fileName"]
            TracePrint "获取版本文件信息 文件大小:"&data["fileSize"]
        End If
    End If
End Function    
Dim 项目ID,项目秘钥

项目ID = ""

项目秘钥 = ""

Call 获取版本文件信息()

Function 获取版本文件信息()
    Dim timeStamp,sign,请求地址,请求URL,响应内容,状态,数据,本地校验,服务器校验
    timeStamp = getTime()
    sign = Plugin.Encrypt.Md5String(项目ID&项目秘钥&timeStamp)
    请求地址 = "http://api.yankami.cn/getVersionDefaultFileSubmit"
    请求URL = 请求地址&"?xmid="&项目ID&"&timeStamp="&timeStamp&"&sign="&sign
    TracePrint "获取版本文件信息 URL:"&请求URL
    响应内容 = Lib.网络.获得网页源文件_增强版(请求URL,"utf-8")
    TracePrint "响应内容:"&响应内容
    If InStr(1, 响应内容, "{") <> 1 or InStr(1, 响应内容, "code") = 0 Then
        TracePrint "提示:获取版本文件信息失败!"
        MessageBox "提示:获取版本文件信息失败!"
        ExitScript//停止辅助
    Else
        状态 = json解析(响应内容, "code")
        TracePrint "状态:"&状态
        If 状态 <> 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
                MessageBox "非法的返回!"
                ExitScript//停止辅助
            End If
            TracePrint "获取版本文件信息 上传时间:"&json解析(数据, "uploadDate")
            TracePrint "获取版本文件信息 文件名:"&json解析(数据, "fileName")
            TracePrint "获取版本文件信息 文件大小:"&json解析(数据, "fileSize")
        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 timeout = 5
	local headers = {}
	local timeStamp = os.time()
	local sign = MD5(项目ID .. 项目秘钥 .. timeStamp);
	local url = 请求地址 .. "getVersionDefaultFileSubmit" .. "?xmid=" .. 项目ID .. "&timeStamp=" .. timeStamp .. "&sign=" .. sign
	local ret = LuaEngine.httpGet(url, headers, timeout)
	if ret ~= nil and utf8.mid(ret, 1, 1) == "{" and utf8.mid(ret, utf8.length(ret), 1) == "}" then
		local ret = jsonLib.decode(ret)
		print(ret)
		print(ret.code)
		if ret.code ~= 200 then
			print("获取版本文件信息 错误code:" .. ret.code)
		else
			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("非法的返回!")
			end
			local data = ret.data
			print(data)
			print("获取版本文件信息 上传时间:" .. data.uploadDate)
			print("获取版本文件信息 文件名:" .. data.fileName)
			print("获取版本文件信息 文件大小:" .. data.fileSize)
		end
	else
		print("获取版本文件信息 错误:nil")
	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(请求地址 + "getVersionDefaultFileSubmit?xmid=" + 项目ID + "&timeStamp=" + timeStamp + "&sign=" + sign)
    console.log("获取版本文件信息:" + 请求返回)
    if (!请求返回.startsWith("{") || !请求返回.endsWith("}")) {
        console.log("获取版本文件信息 失败!")
        toast("获取版本文件信息 失败!")
    } else {
        //解析JSON
        var json = JSON.parse(请求返回)
        if (json["code"] != 200) {
            console.log("获取版本文件信息 错误code:" + json["code"])
            toast("获取版本文件信息 错误code:" + json["code"])
        } 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"])
            console.log("获取版本文件信息 上传时间:" + data["uploadDate"])
            console.log("获取版本文件信息 文件名:" + data["fileName"])
            console.log("获取版本文件信息 文件大小:" + data["fileSize"])
        }
    }
}

//编码
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/getVersionDefaultFileSubmit', params=params).json()
        else:
            result = requests.post('https://api.yankami.cn/getVersionDefaultFileSubmit', data=params).json()
        print("result:", result)
        code = result["code"]
        if code == 400:
            print("获取版本文件信息 错误code:", code)
            print("获取版本文件信息 错误message:",result["message"])
        elif code != 200:
            print("获取版本文件信息 错误code:", code)
        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)
                print("获取版本文件信息 上传时间:", data["uploadDate"])
                print("获取版本文件信息 文件名:", data["fileName"])
                print("获取版本文件信息 文件大小:", data["fileSize"])
    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/getVersionDefaultFileSubmit?"
					 + "xmid=" + xmid
					 + "&timeStamp=" + timeStamp
					 + "&sign=" + sign;
		JSONObject jsonEntity = getRequest(url);
		System.out.println("jsonEntity:" + jsonEntity);
		if (jsonEntity != null) {
			int code = jsonEntity.getInt("code");
			if (code == 200) {
				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("上传时间:" + data.getString("uploadDate"));
					System.out.println("文件名:" + data.getString("fileName"));
					System.out.println("文件大小:" + data.getString("fileSize"));
				}
			}
		}
	}
	
	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/getVersionDefaultFileSubmit
请求参数 是否必须 说明
xmid 是 项目ID
timeStamp 是 10位 时间戳
sign 是 签名 md5(项目ID + 项目秘钥 + 时间戳)
响应参数 响应状态 说明
code 200 成功
code 201 项目不存在
code 400 请求参数错误
code 500 获取版本文件失败
响应信息 响应参数 说明
message ... 响应 code 不是 200 时返回
响应数据 响应参数 说明
data ... 响应 code 是 200 时返回
data["uploadDate"] ... 上传时间
data["fileName"] ... 文件名
data["fileSize"] ... 文件大小
响应校验 响应内容 说明
sign ... 响应 code 是 200 时返回 签名 md5(项目ID + 项目秘钥 + Base64(data) + 时间戳) 的前4位