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, 项目秘钥)
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;
}
}
| 请求参数 | 是否必须 | 说明 |
|---|---|---|
| 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位 |