JsRpc使用笔记
This_is_Y Lv6

JsRpc地址:https://github.com/jxhczhl/JsRpc

终端中运行 ./mac_intel_amd64image-20240827151212842

JsEnv_Dev.js内容,全部复制到需要调用js代码的页面中,这里我以bilibili为例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
function Hlclient(wsURL) {
this.wsURL = wsURL;
this.handlers = {
_execjs: function (resolve, param) {
var res = eval(param)
if (!res) {
resolve("没有返回值")
} else {
resolve(res)
}

}
};
this.socket = undefined;
if (!wsURL) {
throw new Error('wsURL can not be empty!!')
}
this.connect()
}

Hlclient.prototype.connect = function () {
console.log('begin of connect to wsURL: ' + this.wsURL);
var _this = this;
try {
this.socket = new WebSocket(this.wsURL);
this.socket.onmessage = function (e) {
_this.handlerRequest(e.data)
}
} catch (e) {
console.log("connection failed,reconnect after 10s");
setTimeout(function () {
_this.connect()
}, 10000)
}
this.socket.onclose = function () {
console.log('rpc已关闭');
setTimeout(function () {
_this.connect()
}, 10000)
}
this.socket.addEventListener('open', (event) => {
console.log("rpc连接成功");
});
this.socket.addEventListener('error', (event) => {
console.error('rpc连接出错,请检查是否打开服务端:', event.error);
});

};
Hlclient.prototype.send = function (msg) {
this.socket.send(msg)
}

Hlclient.prototype.regAction = function (func_name, func) {
if (typeof func_name !== 'string') {
throw new Error("an func_name must be string");
}
if (typeof func !== 'function') {
throw new Error("must be function");
}
console.log("register func_name: " + func_name);
this.handlers[func_name] = func;
return true

}

//收到消息后这里处理,
Hlclient.prototype.handlerRequest = function (requestJson) {
var _this = this;
try {
var result = JSON.parse(requestJson)
} catch (error) {
console.log("catch error", requestJson);
result = transjson(requestJson)
}
//console.log(result)
if (!result['action']) {
this.sendResult('', 'need request param {action}');
return
}
var action = result["action"]
var theHandler = this.handlers[action];
if (!theHandler) {
this.sendResult(action, 'action not found');
return
}
try {
if (!result["param"]) {
theHandler(function (response) {
_this.sendResult(action, response);
})
return
}
var param = result["param"]
try {
param = JSON.parse(param)
} catch (e) {}
theHandler(function (response) {
_this.sendResult(action, response);
}, param)

} catch (e) {
console.log("error: " + e);
_this.sendResult(action, e);
}
}

Hlclient.prototype.sendResult = function (action, e) {
if (typeof e === 'object' && e !== null) {
try {
e = JSON.stringify(e)
} catch (v) {
console.log(v)//不是json无需操作
}
}
this.send(action + atob("aGxeX14") + e);
}

function transjson(formdata) {
var regex = /"action":(?<actionName>.*?),/g
var actionName = regex.exec(formdata).groups.actionName
stringfystring = formdata.match(/{..data..:.*..\w+..:\s...*?..}/g).pop()
stringfystring = stringfystring.replace(/\\"/g, '"')
paramstring = JSON.parse(stringfystring)
tens = `{"action":` + actionName + `,"param":{}}`
tjson = JSON.parse(tens)
tjson.param = paramstring
return tjson
}

image-20240827151042604

然后再进行连接,如果要多次连接,这里后面的group不要设置成一样的。

1
var demo = new Hlclient("ws://127.0.0.1:12080/ws?group=zzz");

之后终端中就可以看到已连接(我这里就是反面例子,高了三个zzz,结果就是调用的时候,结果会串)

image-20240827151455337

如果加解密函数需要在debug时使用,那就需要用window.func将它代出来,以便在全局使用。如下图,加密函数为(0, u.getSm2DataHexByObject),那就可以在debug时,通过以下代码将(0, u.getSm2DataHexByObject)函数代理到全局使用。

这里我写用了base64和url编码是因为(0, u.getSm2DataHexByObject)函数的入参是一个对象,在使用python调用这个函数的时候会比较麻烦,所以我给改成了字符串入参,然后在里面解码后通过JOSN.parse()再转成原加密函数需要的对象。至于url编码则是因为js的atob对中文的编码方式处理和python的处理不太一样,会导致乱码。如果加解密函数的入参和返回都是字符串的话就不需要这么麻烦,直接window.func = EncryptFunc 就行了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
window.mysm2enc = function(encodedStr) {
try {
console.log("====mysm2enc====",encodedStr)
// 解码 base64 加密后的字符串
var decodedStr = decodeURIComponent(atob(encodedStr));
var jsonObj = JSON.parse(decodedStr);
// 调用 getSm2DataHexByObject 函数并返回结果
var result = (0,u.getSm2DataHexByObject)(jsonObj);
console.log("====over====",result)
return result;
} catch (error) {
console.error("Error decoding or parsing:", error);
return null;
}
};

window.mysm2dec = function(encodedStr) {
try {
console.log("====mysm2dec====",encodedStr)
var result = (0,u.getSm2DataByString)(encodedStr);
console.log("====over====",result)
return result;
} catch (error) {
console.error("Error decoding or parsing:", error);
return null;
}
};

image-20240827152239928

image-20240827151939665

image-20240827152456338

在将函数代理出来后,就可以在python中进行调用了,调用代码如下

1
2
3
4
5
6
7
8
9
def sm2encbystr(data):
jscode = """sm2encbystr(\"{}\")""".format(data.replace("\"","\\\""))
url = "http://localhost:12080/execjs"
data = {
"group": "zzz",
"code": jscode
}
res = requests.post(url, data=data)
return json.loads(res.text)['data']

image-20240827164218447

 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
访客数 访问量