声明:本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!由于本人水平有限,如有理解或者描述不准确的地方,还望各位大佬指教!!
前言:
Js-Rpc意思就是远程调用js代码,全称 Remote Procedure Call,是一种技术思想而非一种规范或协议,需要借助websocket实现
测试:
我们需要在本地node环境中安装nodejs-websocket库,然后我们开启本地socket协议连接(这里我们设置该进程端口号为8015)
var ws = require("nodejs-websocket");
console.log("开始建立连接...")
var cached = {
}
var port = 8015;
var server = ws.createServer(function (conn) {
conn.on("text", function (msg) {
var key = conn.key;
console.log("将要发送代码:【" + msg + "】至浏览器/python");
server.connections.forEach(conn=>{
conn.send(msg);
})
})
conn.on("close", function (code, reason) {
// 断开连接触发 //
console.log("connection closed")
})
conn.on("error", function (code, reason) {
// 出错触发 //
console.log("header err")
console.log(err)
})
}).listen(port)
console.log("WebSocket建立完毕")
如图:
然后我们在本地创建该socket服务连接,根据自己的需求具体编写代码,这里我需要监控浏览器发送给服务的js信息,如图
import websocket
from loguru import logger
def on_message(ws, message):
if message.split("_")[0] != "js":
logger.info(message)
if __name__ == '__main__':
ws = websocket.WebSocketApp("ws://127.0.0.1:8015")
ws.on_message = on_message
ws.run_forever()
接下来我们就可以将js代码注入浏览器,达到浏览器向服务发送信息的效果
(function () {
if (window.WebSocket){
ws = new WebSocket("ws://127.0.0.1:8015/");
ws.onopen = function (e) {
console.log("服务器开启");
}
ws.onclose = function (e) {
console.log("服务器关闭");
}
ws.onerror = function (e) {
console.log("服务器连接出错");
}
ws.onmessage = function (e) {
eval(e.data.split('_')[1])
console.log(e.data.split('_')[1]);
}
}
})();
如图:
这样,服务端就能接收到浏览器发送的数据,如图
而python进程也能拦截到浏览器信息,即可变相的达到数据采集的效果
JsRPC应用:
经过刚才测试,这里我给大家介绍一个便捷的JsRPC框架API——sekiro。sekiro是基于长链接和代码注入的Android private API暴露框架,也是大佬公开的框架API(该API需要借助java环境,所以需要提前安装好java)
github: https://github.com/virjar/sekiro 作者:邓维佳 virjar 渣总[都是一个人]
文档:https://sekiro.iinti.cn/sekiro-doc/01_user_manual/1.quickstart.html
当我们下载好框架的API压缩包后解压,进到bin目录,就会看到启动的两种方式。bat文件是windows用的,sh文件是mac用的,这里我们点击bat文件启动api,如图
然后,我们注入api提供的js代码,并加上自己的js逻辑 ,效果如图
function guid() {
function S4() {
return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
}
return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
}
var client = new SekiroClient("ws://127.0.0.1:5620/business-demo/register?group=ws-group&clientId="+guid());
client.registerAction("clientTime",function(request, resolve,reject ){
resolve(""+new Date());
})
因为基于Sekiro的JsRPC是Sekiro框架的扩展,依然需要遵循Sekiro的各种规则定义,如group、action等参数含义。注入完成之后,我们就可以访问http://127.0.0.1:5620/business-demo/invoke?group=ws-group&action=clientTime这个接口得到对应数据信息(即clientTime的值)
总结:
基于sekiro的JsRPC远程调用技术与传统自动化技术相比,稳定性更高、接口暴露更明显、可高并发、操作简单便捷、节省开发时间、运行速度更快等等有着明显的优势
那么,今日的分享就到这里,想要学习更多的python爬虫和js逆向的相关技巧和知识的小伙伴们一定要点下关注哟,后期会不定时分享相关干货内容