JsRpc地址:https://github.com/jxhczhl/JsRpc
终端中运行 ./mac_intel_amd64
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) } 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) } } 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 }
|
然后再进行连接,如果要多次连接,这里后面的group不要设置成一样的。
1
| var demo = new Hlclient("ws://127.0.0.1:12080/ws?group=zzz");
|
之后终端中就可以看到已连接(我这里就是反面例子,高了三个zzz,结果就是调用的时候,结果会串)
如果加解密函数需要在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) var decodedStr = decodeURIComponent(atob(encodedStr)); var jsonObj = JSON.parse(decodedStr); 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; } };
|
在将函数代理出来后,就可以在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']
|